Wat is Speculatieve uitvoering?
CPU-mechanisme dat vooruit instructies uitvoert op basis van voorspellingen voordat bijvoorbeeld de uitkomst van een sprong bekend is. Bij een foute voorspelling wordt het resultaat ongedaan gemaakt, maar sporen zoals in de cache kunnen achterblijven.
Japanse benaming: 投機的実行
“Speculatieve uitvoering” komt voor in 4 oefenvragen uit 2 onderwerpen, bijv. Hardwarebeveiliging, CPU en architectuur.
Vakgebied: Hardwarebeveiliging
Hoe Spectre en Meltdown het misbruiken
Bij Spectre, in 2018 samen met Meltdown openbaar gemaakt, traint een aanvaller de branch predictor zo dat een pad dat nooit zou mogen draaien, zoals code voorbij een grenscontrole, speculatief wordt uitgevoerd, een geheim leest en de waarde ervan gebruikt om een bepaalde cacheline aan te raken. De resultaten worden weggegooid, maar door te timen welke line in de cache staat, wordt het geheim via een cache-side-channel onthuld. Meltdown misbruikte CPU's waarbij een speculatieve load data uit kernelgeheugen kon teruggeven voordat de rechtencontrole effect had. Vrijwel alle krachtige CPU's waren kwetsbaar voor minstens één variant.
Tegenmaatregelen en hun kosten
De mitigaties beslaan elke laag: besturingssystemen scheidden de paginatabellen van kernel en gebruiker, compilers voegen speculatiebarrières in of gebruiken reeksen voor indirecte sprongen die vergiftigde voorspellingen vermijden, microcode-updates voegen besturingsmogelijkheden voor het gedrag van de predictor toe, en nieuwere CPU's hebben ingebouwde hardwarefixes. Elke beperking op speculatie, voorspelling of gedeelde caches vermindert het lekken, maar kan prestaties kosten, dus ontwerpers bepalen hoe ver ze gaan op basis van welke data op het spel staat. De episode liet zien dat prestatievoorzieningen beveiligingszwakheden kunnen worden, ook als de software foutloos is.
Veelgestelde vragen
Is speculatieve uitvoering hetzelfde als out-of-order-uitvoering?
Ze zijn verwant, maar verschillend. Out-of-order-uitvoering herordent instructies waarvan de invoer klaarstaat, terwijl speculatieve uitvoering instructies uitvoert voordat bekend is of ze überhaupt moeten worden uitgevoerd, zoals instructies na een nog niet opgeloste sprong; moderne cores doen beide.
Wat is het verschil tussen Spectre en Meltdown?
Spectre misleidt de branch predictor om speculatief legitieme codepaden uit te voeren die data lekken waartoe het slachtofferprogramma toegang heeft. Meltdown misbruikte CPU's waarvan speculatieve loads kernelgeheugen konden lezen voordat de rechtencontrole effect had, en werd grotendeels verholpen met isolatie van kernelpaginatabellen en latere hardwarewijzigingen.
Waarom kunnen weggegooide speculatieve resultaten toch data lekken?
De CPU gooit de registerresultaten weg, maar herstelt de cache niet, dus data die tijdens speculatie is geladen laat een spoor na dat kan worden gedetecteerd door toegangstijden te meten.