Uitgelegd: hoe microcode Spectre aanpakt

Ongeveer een maand geleden heeft Intel nieuwe microcode uitgebracht om het laatste deel van het beveiligingslek Spectre op te lossen. Wat zijn precies de aanpassingen? Graag ga ik daarom dieper in op wat microcode is, wat het in je processor doet en wat wij ermee te maken hebben.

Nieuwe microcode om Spectre tegen te gaan uitgerold

Spectre, waar ging het ook alweer over?

Spectre is de naam voor een beveiligingslek in speculative execution van moderne processors. Om voor extra snelheid te zorgen, voeren processors instructies uit waarvan ze verwachten dat ze uitgevoerd moeten gaan worden. En is dat toch niet nodig, dan verlies je alleen dat beetje extra snelheid en merk je er verder niets van. In theorie. In de praktijk werkt het ook zo, maar er is een bijwerking die door velen over het hoofd gezien is: de cache.

Het begint bij het “trainen” van de processor door een bewerking binnen de goede adressen uit te voeren. Er worden statistieken bijgehouden over welke uitkomst het vaakst is voorgekomen. Als laatste wordt dan een instructie buiten het goede bereik speculatief uitgevoerd, omdat dat de meest waarschijnlijke volgende stap is.

Door met een nauwkeurige timer te meten hoe lang het duurt om deze waarde buiten het goede bereik op te vragen, is te zien of een waarde in de cache staat of niet. Zo kan het geheugen van het hele proces uitgelezen worden, waar geheime informatie zoals een wachtwoord in kan staan.

In de afgelopen weken is Intel begonnen om het probleem op te lossen door nieuwe microcode uit te brengen. De updates zijn aangeboden als gewone software-updates en als BIOS-firmware, maar het blijft verborgen voor de gewone gebruiker. Waar dit precies terechtkomt, verduidelijk ik graag verder.

RISC en CISC

Om te begrijpen waar microcode zich bevindt, duiken we in de CPU tot op het niveau van het instructieset en de microarchitectuur. Grofweg zijn er twee soorten instructiesets: RISC en CISC. Dat eerste staat voor “Reduced Instruction Set Computer” en is, zoals de naam al aangeeft, een verzameling van snelle, simpele instructies. Het bekendste voorbeeld hiervan zijn de Arm-processors die in veel telefoons en tablets te vinden zijn.

Tegenover RISC staat CISC, oftewel “Complex Instruction Set Computer”. Dit is wat Intel en AMD gebruiken in hun bekendste processors, vaak benoemd onder de overkoepelende term x86. CISC-instructies kunnen vaak worden opgedeeld in meerdere kleine micro-instructies die achter elkaar kunnen worden uitgevoerd. Dit is één van de dingen waar microcode om de hoek komt kijken.

Microprogramma’s

Voor de complexe instructies zijn microprogramma’s aanwezig, een klein stukje code dat de micro-instructies uitvoert. Deze staan beschreven in de microcode en zijn opgeslagen in een stukje geheugen binnen de processor. Microcode wordt bijvoorbeeld gebruikt om te beschrijven hoe de functionele blokken van de processor aan elkaar verbonden zijn.

Een goed voorbeeld van zo’n samengestelde instructie is CMPXCHG, ofwel “compare and exchange”. Deze instructie leest twee waarden, vergelijkt ze en plaatst een nieuwe waarde als deze twee waarden gelijk zijn. Voor de programmeur (of vaker de compiler, rauwe assembly is niet heel populair) lijkt dit een enkele instructie, maar in de CPU worden deze stappen als microprogramma uitgevoerd.

Aanpassingen tegen Spectre

Op deze manier heeft Intel ook de microcode aangepast om te beveiligen tegen het tweede deel van Spectre. Er zijn een aantal mogelijkheden bijgekomen om de branch predictor, het gedeelte dat voorspelt welke keuzes gemaakt moeten worden, beter te kunnen sturen in wanneer hij wel en niet de code speculatief mag gaan uitvoeren.

Het beter kunnen sturen van de branch predictor.

Deze aanpassing wordt als feature flag aan het besturingssysteem zichtbaar gemaakt, zodat van deze instellingen kan worden gebruikgemaakt. Ook AMD heeft op een vergelijkbare manier deze flags toegevoegd aan hun microcode. Niet iedereen is enthousiast over deze features. Het commentaar van Linus Torvalds, verantwoordelijk voor het ontstaan van de Linuxkernel, was als volgt:

“They do literally insane things. They do things that do not make sense. That makes all your arguments questionable and suspicious. The patches do things that are not sane. WHAT THE F*CK IS GOING ON?”

Ook vanuit andere hoeken zijn de reacties niet allemaal even positief. Echter, een keuze is er niet echt. Andere oplossingen zijn minder efficiënt. Zo is de belangrijkste software al eerder gepatcht door het gebruik van een andere programmeertechniek, retpolines genaamd. Het probleem hiermee is wel dat alle software opnieuw gebouwd moet worden en dus tijdsintensief.

Nieuwe microcode uitgerold

De eerste release van nieuwe microcode kwam al binnen een paar weken. Op dat moment hebben wij direct geüpdatet om het lek te dichten. Deze update werd echter al snel weer ingetrokken, omdat het systeem hierdoor instabiel werd bij sommige gebruikers. Wij hadden hier geen last van en hebben de update niet teruggedraaid. Recentelijk heeft Intel opnieuw firmware uitgebracht met een fix voor Spectre en deze wordt dan ook weer uitgerold op ons platform. Zo zijn we dus up-to-date met de beveiliging tegen dit lek.

Wat kun jij doen?

Voor eindgebruikers is er ook een update beschikbaar. We adviseren je daarom om op je eigen apparaten beschikbare beveiligingsupdates in de gaten te houden en die zo snel mogelijk te installeren. Voor bijvoorbeeld Windows kun je via Windows Update ervoor zorgen dat alles up-to-date is.

P.S. Wil je op de hoogte blijven van alle artikelen, updates, tips en trucs die verschijnen op ons blog? Dat kan! Rechts bovenin via RSS, e-mail, het liken op Facebook, het +1’en op Google+ of het volgen op Twitter.

Deel Tweet +1 Deel