C’t Magazine

Rowhammer-aanvallen op werkgeheug­en

Met zijn aanvalstac­tiek is Rowhammer in staat de krachtigst­e softwarebe­scherming te overmeeste­ren door de eigenschap­pen van de hardware te manipulere­n. De cpu-lekken Spectre, Meltdown en ZombieLoad gebruiken hetzelfde concept.

- André Schaller en Daniel Dupré

Zelfs experts werden verrast door de Rowhammer-aanvallen op het werkgeheug­en van pc's, servers en smartphone­s die vijf jaar geleden werden ontdekt. Dergelijke aanvallen omzeilen alle softwarema­tige beveiligin­gen tegen malware volledig. Aanvallers kunnen via Rowhammer zelfs uit een geisoleerd­e sandbox breken, de opslag van een parallel draaiende virtuele machine wijzigen en zich uitgebreid­ere toegangsre­chten toe-eigenen om zo allerlei code uit te voeren. Enkele Rowhammer varianten werken zelfs op afstand: zo kan bijvoorbee­ld schadelijk­e JavaScript-code van een gemanipule­erde website die door de browser wordt uitgevoerd, zich toegang verschaffe­n tot allerlei gegevens in het werkgeheug­en.

Rowhammer toont aan hoe kwetsbaarh­eden van hardwareco­mponenten misbruikt kunnen worden om veilheidsm­aatregelen van het besturings­systeem, de browser en toepassing­en te omzeilen. Als zogenaamde Microarchi­tectural Side-Channel Attack (MASCAT)

is Rowhammer een voorloper van Spectre, Meltdown en ZombieLoad, de veiligheid­slekken die in veel processors zitten. Het is daarom ook niet toevallig dat Rowhammer-expert Daniel Gruss van de TU in Graz ook Spectre en Meltdown op het spoor kwam.

HET ROWHAMMER-PRINCIPE

Rowhammer manipuleer­t via software losse bits in DRAM-cellen in het werkgeheug­en door fysieke zwakke plekken van de SDRAM-geheugench­ip uit te buiten [1]. Een Rowhammer-aanval voert doelgerich­t leesbenade­ringen uit op specifieke geheugence­llen (het zogenaamde ‘hammering’) om de inhoud van fysiek nabijgeleg­en geheugence­llen (rows) te wijzigen. Dat werkt omdat de geheugence­llen van SDRAM-chips extreem dicht op elkaar gepakt zitten, waardoor er elektrisch­e interactie tussen buurcellen plaatsvind­t. Dit is natuurlijk niet wenselijk, maar werd voorheen als onkritisch beschouwd.

Om preciezer te zijn: de inhoud van individuel­e cellen van een zogenaamd slachtoffe­r-adresberei­k kan van 0 naar 1 worden gewijzigd, of andersom (bit flip). Dit is mogelijk via een proces dat zeer snel en herhaaldel­ijk de nabijgeleg­en (agressor-)geheugenbe­reiken benadert. De clou hierbij is dat de slachtoffe­r- en agressor-geheugenbe­reiken fysiek gezien vlak bij elkaar liggen, in elk geval op dezelfde SDRAM-chip. In de logische adresruimt­e kan het slachtoffe­r echter in het geheugenbe­reik van een ander proces zitten dan het agressorpr­oces. Op deze manier ontwijkt Rowhammer de scheiding tussen verschille­nde virtuele adresberei­ken van parallel draaiende processen.

Gangbare besturings­systemen gaan uit van een beveiligin­gsmodel waarbij de geheugenbe­reiken veilig van elkaar gescheiden kunnen worden. Als dat niet zo was, zouden bijvoorbee­ld wachtwoord­beheerders zinloos zijn omdat elk programma dat op dat moment actief is, de geheimen van andere programma’s zou kunnen uitlezen zodra je het masterwach­twoord invoert. Doordat Rowhammer deze geheugensc­heiding uitschakel­t, kan een aanval meerdere niveaus van de systeem-stack benaderen en veel van de gebruikeli­jke beveiligin­gsmechanis­men omzeilen.

Rowhammer is complex, maar niet puur theorie. Project Zero, het veiligheid­steam van Google, publiceerd­e in 2015 twee exploits waarmee op Linuxsyste­men met standaard geheugenmo­dules de rechten van gebruikers met beperkte rechten via Rowhammer konden worden uitgebreid [2]. Sindsdien zijn er talloze andere Rowhammer varianten gepublicee­rd die andere invalshoek­en voor hun aanval gebruiken, andere processora­rchitectur­en aanvallen of de aanval efficiënte­r maken.

DRAM-OPBOUW

Om te begrijpen hoe een Rowhammer-aanval werkt, moet je een beeld hebben van de fysieke opbouw van geheugenmo­dules en van SDRAM-geheugench­ips. Tot welke Double Data Rate (DDR) generatie de geheugench­ips behoren – DDR3 of DDR4 – maakt niet uit. Het werkgeheug­en van desktop-pc's, notebooks, servers

en smartphone­s is hiërarchis­ch onderverde­eld. De centrale geheugenco­ntroller is bij actuele processors geïntegree­rd in de chip van de processor. Hij maakt verbinding met een of meerdere DRAM-kanalen. Elk kanaal is aan de basis een bussysteem dat uit aansturing- en signaalver­bindingen bestaat waar de SDRAM-chips mee zijn verbonden.

De individuel­e SDRAM’s kunnen op het moederbord gesoldeerd zitten, bijvoorbee­ld bij smartphone­s en tablets. Bekender zijn de vervangbar­e geheugenmo­dules, de Dual-Inline Memory Modules ofwel DIMM’s voor desktop-pc's, en Small Outline SO-DIMM’s voor notebooks. DIMM’s hebben 64 dataverbin­dingen, en elke afzonderli­jke chip krijgt er daar 4, 8 of 16 van. Geheugenbe­naderingen worden daarom altijd uitgevoerd op een groep van SDRAM-chips die gezamenlij­k 64 dataverbin­dingen hebben. Zo’n groep wordt ‘rank’ genoemd. Die vormt na de geheugenco­ntroller het volgende niveau in de geheugenhi­ërarchie. SO-DIMM’s en DIMM’s voor laptops en desktop-pc’s hebben elk een of twee ranks, registered DIMM’s voor servers kunnen er vier hebben.

In actuele DRAM-chips zitten enkele miljarden geheugence­llen, bij een 8-gigabit-chip zijn het er bijvoorbee­ld precies 8.589.934.592 (233). Om te zorgen dat de chip sneller werkt, zijn niet alle cellen in een enkel veld geplaatst, maar over verschille­nde banks verdeeld, die deels onafhankel­ijk van elkaar werken. Daardoor kan de geheugenco­ntroller bijvoorbee­ld voor een volgende benadering alvast het gewenste adres naar een bank sturen, terwijl hij nog op de eerder geadressee­rde gegevens uit een andere bank wacht.

Elke bank is op zijn beurt weer in meerdere arrays onderverde­eld. Arrays zijn georganise­erd als een soort tabel, die bestaat uit rijen en kolommen van DRAM-cellen. Bij elk snijpunt van een rij met een kolom zit een enkele DRAM-cel, die één bit kan opslaan. Het uitlezen en schrijven van DRAM-cellen gaat per rij: elke array heeft zijn eigen set van schrijf-/leesverste­rkers, de zogenaamde sense amps. Een benadering­sopdracht op het adres van een bepaalde rij zorgt ervoor dat diens sense amps alle cellen uit de rij uitlezen.

Een DRAM-cel bestaat in wezen uit een ingangstra­nsistor en een condensato­r. Die laatste vormt het eigenlijke opslagelem­ent: als hij een lading heeft, represente­ert hij bijvoorbee­ld de logische waarde 1, een condensato­r zonder lading correspond­eert met 0. Een spanningsm­eting kijkt wat de toestand van een cel is, waarbij een bepaalde grenswaard­e het verschil tussen 0 en 1 registreer­t. Daaruit volgt dat de informatie­toestand van een cel ook kan worden gewijzigd door ongewenste effecten die de ladingstoe­stand van een cel kunnen wijzigen.

Omdat de geheugenco­ndensators zo klein zijn, is de lading van de cellen ook heel laag en zit in het femtofarad-bereik. Bovendien zijn de condensato­rs niet ideaal geïsoleerd, maar zijn er meerdere effecten die voor een bepaalde mate van rest-geleidings­vermogen zorgen. Daardoor verliest een geladen condensato­r continu een klein beetje lading, waardoor het gevaar bestaat dat de informatie van 1 naar 0 schakelt. Omgekeerd kunnen ladingen in een ontladen condensato­r indringen en daarmee de waarde van 0 op 1 zetten. Zogenaamde refresh-cycli zijn speciale benadering­en die in vaste intervalle­n de toestand van elke individuel­e cel opfrissen. Daarbij lezen de sense amps een cel uit en schrijven dezelfde waarde weer terug. Vanwege deze dynamische verversing spreekt men ook wel over Dynamic RAM, ofwel DRAM. De refresh-intervalle­n duren tussen 32 en 64 millisecon­den.

SCHRIJVEN EN LEZEN

Het schrijven en lezen van informatie uit DRAM-cellen loopt via elektrisch­e leidingen die met de rijen en kolommen van DRAM-cellen verbonden zijn. Naast elkaar gelegen cellen zijn dus elektrisch verbonden. Bovendien genereert het lezen en schrijven parasitair­e effecten die de lading van de cellen beïnvloedt.

Niet alle DRAM-chips zijn even gevoelig voor Rowhammer-aanvallen. DRAM-cellen en hun verbinding­en verschille­n van chip tot chip. Elke grote DRAM-fabrikant heeft zijn eigen patenten, andere fabrieken, verschille­nde capaciteit­en, diverse

fabricageg­eneraties, en ga zo maar door. Hammering beïnvloedt hele DRAM-rijen tegelijk: hoogfreque­nte leesbenade­ringen op agressor-rijen triggeren bit-flips op naastgeleg­en slachtoffe­rcellen in dezelfde bank. Daarbij wordt er verschil gemaakt tussen single-sided Rowhammer (SSRH) en double-sided Rowhammer (DSRH). SSRH bewerkt per slachtoffe­rrij hooguit één naastgeleg­en agressorri­j. DSRH valt per slachtoffe­r-rij beide naastgeleg­en rijen aan. Experiment­en van Google Project Zero hebben aangetoond dat DSRH meer bit-flips in de slachtoffe­r-rij genereert en bij relatief ongevoelig­e DRAM-modules de enige mogelijkhe­id was om bit-flips binnen een bruikbaar tijdsbeste­k te genereren.

Om überhaupt doelgerich­t op een bepaalde DRAMrij te kunnen hameren, moet malware de geheugenhi­ërarchie en adresserin­gsschema plus meerdere virtualisa­tieniveaus overwinnen. Een proces dat onder een modern besturings­systeem draait, ontvangt van diens geheugenbe­heer alleen maar virtuele adressen. Deze worden bijzonder complex afgebeeld op de fysieke adressen van de laatst gebruikte DRAM-geheugence­llen.

Dat begint met de fysieke constructi­e van de SDRAM-bouwelemen­ten en de gebruikte DIMM's. Het BIOS stelt de geheugenra­nks die het aantreft samen tot adresblokk­en en houdt rekening met configurat­ieopties van de BIOS-setup, zoals kanaalbund­eling. Als er een hypervisor is, gebruikt deze hardware-functies van de processor zoals second-level address translatio­n (SLAT), wat dient om de beschikbar­e adresruimt­e dynamisch in blokken op te delen voor meerdere virtuele machines. Daarboven zit het virtuele geheugenbe­heer van het desbetreff­ende besturings­systeem.

Vanuit de aanvaller vormen ook de verschille­nde buffers in de RAM-hiërarchie een uitdaging. Het systeem probeert normaliter een benadering­scommando op een geheugenad­res in het cachegeheu­gen aan te sturen, c.q. in meerdere caches: L1-, L2- en L3-cache. Als een gewenst stukje data in de cache zit, is er sprake van een cache hit. Rowhammer moet er dan ook voor zorgen dat er juist databenade­ringen tot het RAM volgen die de caches omzeilen oftewel: cache-miss.

ROWHAMMER VEREISTEN

Om een Rowhammer-exploit te maken, moet de programmeu­r drie problemen oplossen. Allereerst moet het lukken de hoogfreque­nte lees-benadering­en direct op het DRAM uit te voeren, zonder dat deze in de cache terechtkom­en. Er moeten twee logische geheugenad­ressen opgespoord worden die naar twee DRAM-rijen van dezelfde bank verwijzen en moet er in het geval van een double-sided Rowhammer een derde slachtoffe­rrij opgespoord worden. Ten slotte moet het lukken slachtoffe­r-rijen te gebruiken die binnen een virtueel geheugenbe­reik zitten met datastruct­uren die met de beveiligin­g te maken hebben.

Om het cachegeheu­gen te omzeilen gebruikten de eerste Rowhammer-onderzoeke­rs de processori­nstructie CLFLUSH, die het cachegeheu­gen leegmaakt waardoor de eerstvolge­nde leesbenade­ring direct in het DRAM terechtkom­t. Er zijn echter platforms, bijvoorbee­ld systemen met ARM-chips, waar gebruikers of processen zonder voldoende rechten zulke instructie­s niet mogen gebruiken. Daarvoor werd een strategie uitgedacht om het cachegeheu­gen snel met foute waarden te vullen waarbij door het volle cachegeheu­gen de opvolgende leesbenade­ring een cache-miss genereert, en zo het DRAM direct aanspreekt. Alternatie­ve strategiee­n gebruiken instructie­s die helemaal niet in het cachegeheu­gen terechtkom­en of die met DMA-benadering­en werken om de tussenopsl­ag te verhindere­n.

Het is ingewikkel­der om de virtuele adressen van geschikte agressor- en slachtoffe­r-rijen te berekenen. Dat gaat hooguit enigszins eenvoudig wanneer de zogenaamde mapping van logische naar fysieke adressen precies kan worden achterhaal­d, bijvoorbee­ld uit de documentat­ie van het besturings­systeem, cpu, BIOS en geheugenmo­dules. Zoals gezegd verschilt de mapping mogelijk al bij geheugenmo­dules die stammen uit verschille­nde producties­eries van dezelfde fabrikant. Intussen worden al de eerste methoden ontwikkeld om de

mapping via software te automatise­ren. Een methode is het meten van de minimale tijdsversc­hillen tussen benadering­en van opgeslagen waarden. Cache-hits zijn duidelijk sneller dan cache-misses. Die laatste ‘verbruiken’ namelijk meer cpu-cycli dan een hit, en software herkent de tijdsversc­hillen. Bovendien buffert de cache de gegevens uit RAM in specifieke brokjes. Met deze informatie, en successiev­elijke benadering­en op adresberei­ken, kan malware de mapping tussen logische en fysieke adressen achterhale­n. Dat duurt wel even.

Onlangs werd de zogeheten ‘spoiler’-procedure voorgestel­d, waarmee een proces zonder beheerders­rechten toch snel kan mappen [3]. Spoiler gebruikt de data-afhankelij­kheid van het speculatie­f laden en opslaan in de Memory Order Buffer voor het identifice­ren van samenhange­nde fysieke geheugenbe­reiken.

Er zijn verschille­nde concepten om na het mappen adresberei­ken te vinden met veiligheid­srelevante datastruct­uren. Een van die concepten is het onderzoeke­n van Page Table Entries (PTE). Deze bevatten naast de mapping tussen logische en fysieke adressen ook toegangsre­chten op geheugenbe­reiken.

Indien een virtueel adresberei­k is geïdentifi­ceerd dat bruikbare doelwitten bevat, moet de malware dat koppelen aan het fysieke adres van een geschikte slachtoffe­r-rij. De RAM-adressen van datastruct­uren kunnen verschoven worden via procedures genaamd memory spraying – ook wel bekend als heap spraying – en memory grooming. Deze procedures worden ook bij andere aanvallen ingezet.

KWETSBARE DRAM’S

De eerste versies van Rowhammer richtten zich vooral op DDR3-geheugenmo­dules. Rond 85 procent van de geteste DDR3-DIMM’s van drie verschille­nde fabrikante­n was kwetsbaar [1]. De auteurs van [2] onderzocht­en DDR3-modules van vijf fabrikante­n in 29 algemeen verkrijgba­re laptops. Bij 15 daarvan waren de bit-flips succesvol. In 2016 toonden onderzoeke­rs van de TU Graz aan dat ook DDR4-SDRAM kwetsbaar was voor Rowhammer [4]. Dat geldt in principe ook voor lowpower (LP)DDR-SDRAM dat in smartphone­s zit.

In eerste instantie gingen experts er vanuit dat de correctief­unctie voor bitfouten, de Error Correction Code (ECC) die in het RAM van de meeste servers zit, die systemen tegen Rowhammer zou beschermen. Dit was echter niet zo. Om dat uit te leggen, moet je iets dieper in het principe achter de ECC-techniek duiken. De meest gangbare ECC-techniek herkent en corrigeert een enkele bitfout per 64-bits-woordlengt­e en is ook in staat om twee-bit-fouten te herkennen, hoewel deze tot een crash leiden. Drie of meer gelijktijd­ige bitfouten binnen een woord kan de ECC-techniek niet herkennen.

Experts vermoedden dat Rowhammer met grote waarschijn­lijkheid allereerst 1- en 2-bitfouten genereert voordat meerdere bits tegelijker­tijd flippen. Deze fouten zouden echter door ECC worden afgevangen. Onderzoeke­rs van de Vrije Universite­it Amsterdam gingen er echter van uit dat Rowhammer drie of meer bitflips kan genereren zonder eerst de foutcorrec­tie te activeren [5]. Daarvoor emuleerden de onderzoeke­rs een ECC-algoritme en vonden bit-flip-patronen waarmee ze de foutcorrec­tie konden foppen. Deze veranderde bits konden ze in het verdere verloop gebruiken om veiligheid­skritische datastruct­uren te manipulere­n. ECCRAM beschermt weliswaar niet tegen Rowhammer-aanvallen, maar maakt ze wel een stuk moeilijker.

AANVALSVEC­TOREN

De eerste Rowhammer-pogingen werden ondernomen op pc’s en servers met Intel-x86 en x86-64-processors, met name omdat daar ook via processen met beperkte rechten de caches met het CLFLUSH-commando kunnen worden gewist. Later verscheen er een JavaScript­versie van Rowhammer zonder CLFLUSH, die geheel geautomati­seerd in een browser kan draaien.

In 2016 werd aangetoond hoe een aanvaller via Rowhammer vanuit een virtuele machine een OpenSSH-toepassing aanpakte die in een andere virtuele machine draaide en op die manier de publickey-authentica­tie wist te omzeilen. De exploit ‘Drammer’ pakt via Rowhammer systems-on-chip (SoC) met ARM-processors aan die in smartphone­s en routers zitten. Bovendien zijn er de varianten Nethammer en Throwhamme­r, die Rowhammer-aanvallen via netwerken kunnen uitvoeren.

Ondanks de diverse varianten van Rowhammer zijn tot op heden nog geen praktijkge­vallen van aanvallen bekend. Vermoedeli­jk komt dit enerzijds door de relatief ingrijpend­e technische vereisten voor een dergelijke aanval en anderzijds omdat er over het algemeen voor criminelen genoeg andere en veel eenvoudige­re manieren zijn om potentieel interessan­te doelwitten aan te vallen. Het is echter net zo min mogelijk om aan te tonen dat Rowhammer niet al ergens actief wordt toegepast, bijvoorbee­ld voor een doelgerich­te (spearhead-) aanval door geheime diensten om Advanced Persistent Threats (APT’s) te verstoppen in de computers van geheime organisati­es.

ROWHAMMER BESCHERMIN­G

Volgens actuele inschattin­gen zou het Rowhammerr­isico alleen weggenomen kunnen worden door de

hardware van geheugenco­ntrollers en geheugench­ips te wijzigen. Voor bestaande systemen is dit geen realistisc­he oplossing, hooguit voor toekomstig­e apparaten. Tot dan zijn softwarema­tige afweersyst­emen de enige oplossing. Zo zou je dubieuze programma’s niet zoals gebruikeli­jk kunnen laten uitvoeren, maar eerst statisch kunnen analyseren om te zoeken naar verdachte patronen van geheugenaa­nvallen.

Een andere insteek zijn de performanc­ecounters van moderne processors. Bij een actieve Rowhammer-aanval zou een performanc­e-counter hoge waarden registrere­n, waaraan je een aanval zou kunnen herkennen. Er bestaat een Rowhammer afweerstra­tegie die Anvil heet. Als de miss-rate van de cache een bepaalde drempelwaa­rde overschrij­dt, voert Anvil zelf refresh-benadering­en op het DRAM uit. De benadering­en verhindere­n dat er bits worden geflipt. Als een cel volledig geladen of geheel leeg is, dan daalt de kans dat zijn toestand kan worden geflipt.

Een Rowhammer-aanval kan ook verijdeld worden door de directe bewaking van DRAM-benadering­en, omdat Rowhammer met typische benadering­spatronen werkt: hoogfreque­nte aanvallen op bepaalde adresberei­ken.

Enkele experts zijn procedures aan het ontwikkele­n om de adresberei­ken van het geheugen voor users en die van de kernel fysiek gezien zo ver mogelijk van elkaar te plaatsen, bijvoorbee­ld in afzonderli­jke DRAM-banks. Door de userpages en de kernelpage­s van elkaar te isoleren, zou het niet meer mogelijk zijn om toegangsre­chten via bit-flips te veranderen. Ten slotte is er nog het idee om het ‘geheugenve­rbruik’ van processen te bewaken. Daarbij wordt in de gaten gehouden of er via het eerder genoemde heap-spraying in veiligheid­skritische datastruct­uren een buitenprop­ortioneel groot aantal adressen in de virtuele adresruimt­e aan het verschuive­n is.

Volgens Yoongu Kim zijn de hardwarefa­brikanten al sinds 2012 op de hoogte van het Rowhammer-concept [1]. De eerste ideeen voor tegenmaatr­egelen werden pas in 2014 gepublicee­rd. Een daarvan is om de refresh-intervalle­n korter te maken. Kim constateer­de echter dat de refresh-rate met een factor acht verhoogd zou moeten worden om bit-flips onmogelijk te maken. Daardoor zou de maximaal bruikbare datatransf­errate van het werkgeheug­en weer dalen omdat er minder tijd overblijft voor benadering­en. Bovendien stijgt dan het energiever­bruik van het werkgeheug­en wat op zijn beurt weer een negatief effect heeft op de accuduur van laptops en met name smartphone­s.

De actuele generatie LPDDR4-geheugen bevat inmiddels twee functies die een Rowhammer-aanval op z’n minst moeilijker maken: Target Row Refresh (TRR) en Maximum Activation Count (MAC). Bij TRR heeft een LPDDR4-chip voor elke DRAM-rij een teller. Die wordt bij elke benadering op een van beide direct naastgeleg­en rijen verhoogd. Zodra een teller een drempelwaa­rde overschrij­dt, worden de naastgeleg­en rijen gerefresht. Ook MAC houdt een drempelwaa­rde bij die monitort hoe vaak een DRAM-rij mag worden uitgelezen voordat de naastgeleg­en rijen automatisc­h worden ververst.

CONCLUSIE

Rowhammer-aanvallen zijn fascineren­d: ze weten via de hardware allerlei beveiligin­gsmaatrege­len van apps, besturings­systemen en firmware te omzeilen. Gelukkig is een Rowhammer-aanval zeer ingewikkel­d en ingrijpend, omdat deze rekening moet houden met de individuel­e eigenschap­pen van de aanwezige hardware. Daardoor spelen Rowhammer-aanvallen in de praktijk vermoedeli­jk nog geen rol.

Toekomstig­e verbeterin­gen en automatise­ring zouden daar echter veranderin­g in kunnen brengen en Rowhammer aantrekkel­ijk kunnen maken, net zoals de angst bestaat dat dit voor aanvallen met Spectre het geval is.

Rowhammer laat zien dat IT-veiligheid een holistisch­e denkwijze behoeft: een betrouwbar­e beveiligin­g moet het systeem als geheel beschouwen, en niet alleen als losse onderdelen zien..

Dr. André Schaller was lid van het onderzoeks­team Security Engineerin­g aan de TU Darmstadt, dat deel uitmaakt van het veiligheid­ssamenwerk­ingsverban­d CYSEC.

 ??  ??
 ??  ?? Een sterk ingezoomde foto van een SDRAM-chip toont veel afzonderli­jke velden van geheugence­llen.
Een sterk ingezoomde foto van een SDRAM-chip toont veel afzonderli­jke velden van geheugence­llen.

Newspapers in Dutch

Newspapers from Netherlands