Onlangs verscheen er op klokkenluiderwebsite Cryptome een bericht dat de Amerikaanse inlichtingendienst NSA al het SSL/TLS-verkeer kan ontsleutelen wanneer dit is gegenereerd op een Intel processor met een Ivy Bridge architectuur of nieuwer. Security.NL-lezer Luc Gommans besloot dit uit te zoeken en schreef het volgende artikel.
Architectuur
In het derde kwartaal van 2011 is Intel begonnen met het produceren van hun nieuwe processorarchitectuur: Ivy Bridge. Deze had een aantal voordelen, waaronder verbeteringen van Intel HD Graphics, energiezuinigheid en een nieuwe instructie genaamd RdRand.
Deze RdRand instructie is een "pseudo-random number generator" (PRNG); iets dat schijnbare willekeurige getallen genereert. De mogelijkheid tot het genereren van willekeurige getallen is ontzettend belangrijk voor heel veel toepassingen. Een bekend voorbeeld is SSL/TLS, de techniek achter https, maar ook TCP sequence numbers moeten willekeurig zijn. Betrouwbare willekeurigheid is dus al vereist voor het opzetten van iets simpels als een TCP connectie.
De werking van een PRNG
Computers zijn echter niet erg creatief, en willekeurige getallen bedenken blijkt een moeilijke opgave. Er wordt dus een hybride systeem gebruikt dat van bepaalde bronnen een bepaalde hoeveelheid "ware" willekeurigheid weet te onttrekken. Bijvoorbeeld de timing van toetsaanslagen en muisbewegingen, afwijking in de temperatuursensor, of het statische geluid dat je hoort wanneer je de microfoon insteekt kunnen worden door het systeem worden gebruikt.
Deze "ware" willekeurigheid wordt vervolgens als invoer gebruikt voor een PRP-functie (pseudo random permutation), dat vervolgens ontzettend veel getallen kan genereren zonder voorspelbaar te worden. Wat een PRP dus doet is het omzetten van invoer naar willekeurige uitvoer, maar bij dezelfde invoer komt natuurlijk ook altijd dezelfde uitvoer.
Dit is in feite identiek aan de manier waarop encryptie werkt: Je hebt een wachtwoord als invoer en krijgt, als het goed is, data als uitvoer die niet te onderscheiden is van (ware) willekeurigheid. Sterker nog, het bekende encryptiealgoritme AES is niet ontworpen als encryptiealgoritme. Het is ontworpen als PRP functie! Willekeurige data kan dus als "wachtwoord" worden gebruikt voor AES, waarna AES het om kan zetten in een praktisch oneindige hoeveelheid willekeurige data (256 exabytes).
Dit werkt prima, zolang er voldoende willekeurigheid beschikbaar is als invoer voor onze PRP (dat kan AES zijn, maar ook een ander algoritme). Zeker wanneer een systeem net aan het opstarten is, wil dit nog wel eens tekort schieten. Dat Intel met een eigen willekeurige nummer generator komt is dus een welkome aanvulling voor besturingssystemen.
Implementatie van RdRand in Linux
Eind juli 2011 is in de nieuwsgroep over de Linux kernel gediscussieerd over het implementeren van de RdRand instructie in de kernel. Peter Anvin van Intel kwam met een patch (codewijziging) die RdRand implementeerde. Daarop reageerde Matt Mackall dat hij fel tegen het doorvoeren was omdat de werking niet te controleren viel zonder in een electronenmicroscoop te investeren. De data verkregen van de CPU kan best worden gebruikt en gemixt met andere bronnen van willekeurigheid (entropy), maar zou niet de bestaande bronnen moeten omzeilen en direct worden geinjecteerd in "/dev/urandom" (een bron van pseudo-willekeurigheid in Linux systemen).
Linus Torvalds, de oprichter van de Linux kernel, zei vervolgens dat zijn afwijzing niks betekende, en dat Matt niet met domme argumenten (sic) moet komen over de controleerbaarheid door middel van een electronenmicroscoop. In reactie daarop heeft Matt zijn positie opgezegd. Op 28 oktober 2011 heeft Linus Torvalds de toevoeging doorgevoerd.
De code is echter nog altijd aanwezig in de Linux kernel (/drivers/char/random.c, functie "get_random_bytes_arch"). Het is wel mogelijk om dit uit te schakelen bij het compilen van Linux, maar dit is voor een gemiddelde gebruiker niet te doen. In een comment bij de functie wordt echter wel erkend dat het onmogelijk te controleren is, en de NSA mogelijk een wachtwoord heeft waarmee de output kan worden voorspeld ("it is impossible to verify that it is implemented securely (as opposed, to, say, the AES encryption of a sequence number using a key known by the NSA)").
Closed-source
In het geval van Linux zijn de gevolgen nog enigzins beperkt. Iedereen kan wijzigingen zien en problemen ontdekken, aankaarten en veranderen. Maar in bijvoorbeeld Mac OS X of Windows is het niet mogelijk om na te gaan hoe er precies met RdRand wordt omgegaan. Het kan zijn dat Windows alsnog kwetsbaar is hiervoor.
Eigenlijk geldt hetzelfde ook voor de RdRand instructie zelf: het feit dat het closed source is maakt het al oncontroleerbaar en maakt dat wij Intel op hun blauwe ogen (of stickers) moeten geloven.
Potentiele gevolgen
Het kunnen voorspellen van de willekeurige getallen in een computer is zoals gezegd een zeer groot beveiligingsrisico. Niet alleen omdat crypografie gekraakt kan worden (bijvoorbeeld opgevangen verkeer van https verbindingen); het kan ook offensief gebruikt worden. Bijvoorbeeld DNS cache poisoning is mogelijk wanneer te voorspellen valt welke poort de DNS server gaat gebruiken om een request te doen. Zo zou het mogelijk zijn om gebruikers naar valse websites te sturen die volledig legetiem uitzien. Zelfs het adres in de adresbalk klopt.
Ook private keys worden willekeurig gegenereerd om SSL/TLS sessies mee te beveiligen. Als jouw computer geen Ivy Bridge CPU heeft, heeft de server die de private key genereerde dat misschien wel. En wanneer de private key bekend is, is het https verkeer ook te vervalsen. Bijvoorbeeld als de private key voor Gmail door Google is gegenereerd op een Ivy Bridge, kan de https connectie van Gmail worden vervalst.
Het is niet gezegd dat Intel's RdRand instructie voorspelbaar is, maar het feit dat het niet te controleren is, dat de NSA behoorlijk ver lijkt te gaan in het monitoren van verkeer, en dat Intel een Amerikaans bedrijf is dat moet luisteren naar "National Security brieven", maakt het wel een mogelijkheid.
Overigens is in een vraag op de Cryptography StackExchange website, onder andere door Orson Peters, bevestigd dat het decrypten van https mogelijk is wanneer de willekeurige-getallen-generator niet willekeurig blijkt te zijn:
Conclusie: Hopelijk kunnen we Intel's random functie vertrouwen, maar het is cryptografisch niet te controleren.
Deze posting is gelocked. Reageren is niet meer mogelijk.