Figuur 6: kernel page table isolationfiguur 6 toont een techniek genaamd kernel page table isolation (kpti). Dit komt neer op het niet in kaart brengen van kernelgeheugen in een programma wanneer het wordt uitgevoerd in de gebruikersruimte. Als er geen mapping aanwezig, speculatieve uitvoering is niet meer mogelijk en zal onmiddellijk fout.
naast het ingewikkelder maken van de virtual memory manager (VMM) van het besturingssysteem, zal deze techniek zonder hulp van hardware ook de workloads aanzienlijk vertragen die een groot aantal overgangen van de gebruikersmodus naar de kernelmodus maken, vanwege het feit dat de paginatabellen bij elke overgang moeten worden gewijzigd en de TLB moet worden doorgespoeld (gezien het feit dat de TLB vast kan houden aan verouderde toewijzingen).
nieuwere x86 CPU ‘ s hebben een functie die bekend staat als ASID (address space ID) of PCID (process context ID) die kan worden gebruikt om deze taak aanzienlijk goedkoper te maken (ARM en andere microarchitecturen hebben deze functie al jaren). PCID staat toe dat een ID geassocieerd wordt met een TLB entry en dan alleen TLB entry ‘ s met dat ID spoelt. Het gebruik van PCID maakt KPTI goedkoper, maar nog steeds niet gratis.
samengevat, Kernsmelting is een zeer ernstige en gemakkelijk te benutten kwetsbaarheid. Gelukkig heeft het een relatief eenvoudige mitigatie die al is geïmplementeerd door alle grote OS-leveranciers, het voorbehoud is dat bepaalde workloads langzamer zullen lopen totdat toekomstige hardware expliciet is ontworpen voor de adresruimte scheiding beschreven.
Spectre kwetsbaarheid
Spectre deelt enkele eigenschappen van Meltdown en bestaat uit twee varianten. In tegenstelling tot Meltdown, Spectre is aanzienlijk moeilijker te exploiteren, maar beïnvloedt bijna alle moderne processors geproduceerd in de afgelopen twintig jaar. In wezen, Spectre is een aanval tegen moderne CPU en besturingssysteem ontwerp versus een specifieke beveiligingsprobleem.
Bounds check bypass (Spectre variant 1)
de eerste Spectre variant staat bekend als “bounds check bypass.”Dit wordt aangetoond in het volgende codefragment (dat is hetzelfde codefragment dat ik hierboven gebruikte om speculatieve uitvoering te introduceren).
if (x < array1_size) {
y = array2 * 256];
}
in het vorige voorbeeld wordt de volgende reeks gebeurtenissen aangenomen:
- de aanvaller controleert
x
.
-
array1_size
wordt niet in de cache opgeslagen.
-
array1
wordt in de cache opgeslagen.
- de CPU raadt aan dat
x
kleiner is dan array1_size
. (CPU ‘ s maken gebruik van verschillende eigen algoritmen en heuristiek om te bepalen of te speculeren, dat is de reden waarom aanval details Voor Spectre variëren tussen processor leveranciers en modellen.)
- de CPU voert de body van het if statement uit terwijl het wacht op
array1_size
om te laden, en beïnvloedt de cache op een soortgelijke manier als Meltdown.
- de aanvaller kan dan de werkelijke waarde van
array1
bepalen via een van de verschillende methoden. (Zie de research paper voor meer details van cache inference aanvallen.)
Spectre is aanzienlijk moeilijker te exploiteren dan Kernsmelting omdat deze kwetsbaarheid niet afhankelijk is van escalatie van privileges. De aanvaller moet de kernel overtuigen om code uit te voeren en verkeerd speculeren. Meestal moet de aanvaller de speculatiemotor vergiftigen en hem misleiden om verkeerd te gissen. Dat gezegd hebbende, onderzoekers hebben een aantal proof-of-concept exploits getoond.
Ik wil herhalen wat een echt ongelooflijk vinden van deze exploit is. Ik beschouw dit niet persoonlijk als een CPU-ontwerpfout zoals Kernsmelting per se. Ik beschouw dit als een fundamentele openbaring over hoe moderne hardware en software samenwerken. Het feit dat CPU-caches indirect kunnen worden gebruikt om te leren over toegangspatronen is al enige tijd bekend. Het feit dat CPU-caches kunnen worden gebruikt als een side-channel om computergeheugen te dumpen is verbazingwekkend, zowel conceptueel als in zijn implicaties.
Branch target injection (Spectre variant 2)
bedenk dat indirecte vertakking zeer gebruikelijk is in moderne programma ‘ s. Variant 2 van Spectre gebruikt indirecte branch voorspelling om de CPU te vergiftigen in speculatief uitvoeren naar een geheugen locatie die het anders nooit zou hebben uitgevoerd. Als het uitvoeren van deze instructies staat achter kan laten in de cache die kan worden gedetecteerd met behulp van cache-inferentieaanvallen, kan de aanvaller dan al het kernelgeheugen dumpen. Net als Spectre variant 1, Spectre variant 2 is veel moeilijker te exploiteren dan Kernsmelting, maar onderzoekers hebben aangetoond werken proof-of-concept exploits van variant 2.
Spectre mitigations
De Spectre mitigations zijn aanzienlijk interessanter dan de Meltdown mitigation. In feite schrijft het academic Spectre paper dat er op dit moment geen verzachtende omstandigheden bekend zijn. Het lijkt erop dat achter de schermen en parallel aan het academische werk, Intel (en waarschijnlijk andere CPU-leveranciers) en de grote OS en cloud-leveranciers hebben gewerkt woedend voor maanden om mitigaties te ontwikkelen. In deze paragraaf zal ik de verschillende mitigaties behandelen die zijn ontwikkeld en ingezet. Dit is de sectie waar ik het meest wazig op ben omdat het ongelooflijk moeilijk is om accurate informatie te krijgen, dus ik piecing dingen samen uit verschillende bronnen.
statische analyse en schermen (Variant 1 mitigatie)
de enige bekende variant 1 (bounds check bypass) mitigatie is statische analyse van code om codesequenties te bepalen die mogelijk worden gecontroleerd door de aanvaller om speculatie te verstoren. Kwetsbare codesequenties kunnen een serialiserende instructie hebben zoals lfence
die speculatieve uitvoering stopt totdat alle instructies tot aan het hek zijn uitgevoerd. Voorzichtigheid moet worden betracht bij het inbrengen van omheiningsinstructies, omdat te veel ernstige gevolgen kunnen hebben voor de prestaties.
Retpoline (variant 2 mitigatie)
De eerste Spectre variant 2 (branch target injection) mitigatie werd ontwikkeld door Google en staat bekend als “retpoline.”Het is mij niet duidelijk of het is ontwikkeld in isolatie door Google of door Google in samenwerking met Intel. Ik zou speculeren dat het experimenteel werd ontwikkeld door Google en vervolgens geverifieerd door Intel hardware ingenieurs, maar ik ben niet zeker. Details over de” retpoline “- aanpak zijn te vinden in Google ‘ s paper over het onderwerp. Ik zal ze hier samenvatten (ik ben glossing over een aantal details met inbegrip van underflow die worden behandeld in het papier).
Retpoline vertrouwt op het feit dat het aanroepen en terugkeren van functies en de bijbehorende stack manipulaties zo gebruikelijk zijn in computerprogramma ’s dat CPU’ s sterk geoptimaliseerd zijn voor het uitvoeren ervan. (Als je niet bekend bent met hoe de stack werkt met betrekking tot het aanroepen en terugkeren van functies is dit bericht een goede primer.) In een notendop, wanneer een “call” wordt uitgevoerd, wordt het retouradres op de stack gepusht. “ret” knalt het retouradres uit en gaat door met de uitvoering. Speculatieve uitvoering hardware zal het geduwd retouradres onthouden en speculatief doorgaan met de uitvoering op dat punt.
De retpoline-constructie vervangt een indirecte sprong naar de geheugenlocatie opgeslagen in register r11
:
jmp *%r11
door:
call set_up_target; (1)
capture_spec: (4)
pause;
jmp capture_spec;
set_up_target:
mov %r11, (%rsp); (2)
ret; (3)
laten we eens kijken wat de vorige assembly code stap voor stap doet en hoe het branch doel injectie vermindert.
- in deze stap roept de code een geheugenlocatie aan die bekend is tijdens het compileren, dus is het een harde gecodeerde offset en niet indirect. Dit plaatst het retouradres van
capture_spec
op de stack.
- het retouradres van de oproep wordt overschreven met het eigenlijke jump-doel.
- een return wordt uitgevoerd op het echte doel.
- wanneer de CPU speculatief wordt uitgevoerd, zal het terugkeren in een oneindige lus! Vergeet niet dat de CPU vooruit zal speculeren totdat het geheugen belastingen zijn voltooid. In dit geval is de speculatie gemanipuleerd om gevangen te worden in een oneindige lus die geen bijwerkingen heeft die waarneembaar zijn voor een aanvaller. Wanneer de CPU uiteindelijk de echte return uitvoert, zal het de speculatieve uitvoering afbreken die geen effect had.
naar mijn mening is dit een werkelijk ingenieuze mitigatie. Kudos aan de ingenieurs die het hebben ontwikkeld. Het nadeel van deze mitigatie is dat alle software opnieuw gecompileerd moet worden zodat indirecte branches geconverteerd worden naar retpoline branches. Voor cloudservices zoals Google die de hele stack bezitten, is hercompilatie geen probleem. Voor anderen, het kan een zeer big deal of onmogelijk zijn.
IBRS, STIBP, en IBPB (Variant 2 mitigation)
Het lijkt erop dat Intel (en AMD tot op zekere hoogte) gelijktijdig met de ontwikkeling van retpoline furieus hebben gewerkt aan hardwarewijzigingen om branch target injectie aanvallen te beperken. De drie nieuwe hardware functies worden verzonden als CPU microcode updates zijn:
- Indirect Branch Restricted Speculation (IBRS)
- single Thread Indirect Branch Predictors (MIBP)
- indirecte Branch Predictor Barrier (IBPB)
beperkte informatie over de nieuwe microcode functies zijn hier beschikbaar bij Intel. Ik heb ruwweg kunnen uitzoeken wat deze nieuwe functies doen door het lezen van de bovenstaande documentatie en kijken naar Linux kernel en Xen hypervisor patches. Uit mijn analyse, wordt elke functie mogelijk als volgt gebruikt:
- IBRS zowel spoelt de Branch voorspelling cache tussen privilege niveaus (gebruiker naar kernel) en schakelt Branch voorspelling op de broer of zus CPU thread. Bedenk dat elke CPU-kern meestal twee CPU-threads heeft. Het lijkt erop dat op moderne CPU ‘ s de Branch voorspelling hardware wordt gedeeld tussen de threads. Dit betekent dat de code van de gebruikersmodus niet alleen de Branch predictor kan vergiftigen voordat de kernelcode wordt ingevoerd, maar ook de code die op de verwante CPU-thread draait, kan deze ook vergiftigen. Het inschakelen van IBRS in de kernelmodus voorkomt in wezen elke eerdere uitvoering in de gebruikersmodus en elke uitvoering op de broer of zus CPU thread van invloed branch voorspelling.
- STIBP lijkt een subset van IBRS te zijn die branch voorspelling op de sibling CPU thread uitschakelt. Voor zover ik kan vertellen, de belangrijkste use case voor deze functie is om te voorkomen dat een broer of zus CPU thread van vergiftiging van de tak predictor bij het uitvoeren van twee verschillende gebruiker modus processen (of virtuele machines) op dezelfde CPU-kern op hetzelfde moment. Het is eerlijk gezegd niet helemaal duidelijk voor mij op dit moment wanneer de MIVP moet worden gebruikt.
- IBPB lijkt de Branch voorspelling cache te spoelen voor code die draait op hetzelfde privilege niveau. Dit kan worden gebruikt bij het schakelen tussen twee gebruikersmodus programma ‘ s of twee virtuele machines om ervoor te zorgen dat de vorige code niet interfereert met de code die op het punt staat te draaien (hoewel ik zonder de MIVP geloof dat code die op de verwante CPU thread draait nog steeds de branch predictor kan vergiftigen).
vanaf dit schrijven lijken de belangrijkste mitigaties die ik zie worden geïmplementeerd voor de branch target injectie kwetsbaarheid zowel retpoline als IBRS te zijn. Vermoedelijk is dit de snelste manier om de kernel te beschermen tegen gebruikersmodus programma ‘ s of de hypervisor tegen virtuele machine gasten. In de toekomst verwacht ik dat zowel de MIVP als IBPB worden ingezet afhankelijk van het paranoia-niveau van verschillende gebruikersmodus-programma ‘ s die elkaar storen.
de kosten van IBRS lijken ook zeer sterk te variëren tussen CPU-architecturen, waarbij nieuwere Intel Skylake-processoren relatief goedkoop zijn in vergelijking met oudere processoren. Bij Lyft, zagen we een ongeveer 20% vertraging op bepaalde system call zware workloads op AWS C4 gevallen wanneer de mitigations werden uitgerold. Ik zou speculeren dat Amazon uitgerold IBRS en potentieel ook retpoline, maar ik ben niet zeker. Het lijkt erop dat Google kan alleen uitgerold retpoline in hun cloud.
na verloop van tijd zou ik verwachten dat processors uiteindelijk naar een IBRS “always on” model zullen gaan waar de hardware standaard de scheiding tussen CPU threads van de Branch voorspeller opschonen en de status van de privilege niveau wijzigingen correct opvult. De enige reden dat dit niet zou worden gedaan vandaag is de schijnbare kosten van de aanpassing van deze functionaliteit op reeds vrijgegeven microarchitecturen via microcode updates.
conclusie
Het is zeer zeldzaam dat een onderzoeksresultaat de manier waarop computers worden gebouwd en uitgevoerd fundamenteel verandert. Meltdown en Spectre hebben precies dat gedaan. Deze bevindingen zullen hardware-en softwareontwerp aanzienlijk veranderen in de komende 7-10 jaar (de volgende CPU-hardwarecyclus), aangezien ontwerpers rekening houden met de nieuwe realiteit van de mogelijkheden van data-lekkage via cache-zijkanalen.
in de tussentijd zullen de kernsmelting en Spectre Bevindingen en de bijbehorende mitigaties aanzienlijke gevolgen hebben voor computergebruikers voor de komende jaren. Op korte termijn zullen de verzachtende omstandigheden een impact hebben op de prestaties die aanzienlijk kan zijn, afhankelijk van de werkbelasting en de specifieke hardware. Dit kan operationele wijzigingen vereisen voor sommige infrastructuren (bijvoorbeeld, bij Lyft zijn we agressief verplaatsen van sommige workloads naar AWS C5 instanties te wijten aan het feit dat IBRS lijkt aanzienlijk sneller te draaien op Skylake processors en de nieuwe Nitro hypervisor levert interrupts rechtstreeks aan gasten met behulp van SR-IOV en APICv, het verwijderen van vele virtuele machine uitgangen voor Io zware workloads). Desktop computer gebruikers zijn ook niet immuun, als gevolg van proof-of-concept browser aanvallen met behulp van JavaScript dat OS en browser leveranciers werken om te beperken. Bovendien, als gevolg van de complexiteit van de kwetsbaarheden, het is bijna zeker dat de beveiliging onderzoekers nieuwe exploits niet gedekt door de huidige mitigaties die moeten worden gepatcht zal vinden.
hoewel ik graag bij Lyft werk en het gevoel heb dat het werk dat we doen in de infrastructuurruimte van microservice systems een van de meest impactvolle werkzaamheden is die momenteel in de industrie worden gedaan, doen gebeurtenissen als deze me het werken aan besturingssystemen en hypervisors missen. Ik ben extreem jaloers op het heldhaftige werk dat de afgelopen zes maanden werd gedaan door een groot aantal mensen in het onderzoeken en verzachten van de kwetsbaarheden. Ik had er graag bij willen zijn!
Verder lezen
- Kernsmelting en Spectre academische papers: https://spectreattack.com/
- Google Project Zero blog post: https://googleprojectzero.blogspot.com/2018/01/reading-privileged-memory-with-side.html
- Intel Spectre hardware oplossingen voor: https://software.intel.com/sites/default/files/managed/c5/63/336996-Speculative-Execution-Side-Channel-Mitigations.pdf
- Retpoline blog post: https://support.google.com/faqs/answer/7625886
- Goed overzicht van bekende informatie: https://github.com/marcan/speculation-bugs/blob/master/README.md