Achtergrond

Speculatieve uitvoering: wat het is en hoe Spectre en Meltdown het misbruiken

De Spectre- en Meltdown-lekken schudden cpu-land door elkaar. We onderzoeken hoe de aanvallen de processor precies misbruiken, waarom de impact van een patch zo nefast is, en waarom niet alleen Intel-chips slachtoffer zijn.

Spectre en Meltdown zijn twee pas ontdekte kwetsbaarheden in het design van zowat alle moderne processors. De kwetsbaarheden laten een aanvaller toe om gevoelige en doorgaans goed beschermde data toch te lezen. Denk daarbij bijvoorbeeld aan de wachtwoorden in de kluis van je wachtwoordbeheerder. Meltdown en Spectre zijn uniek om twee redenen. Eerst en vooral situeert de kwetsbaarheid zich niet op het niveau van software zoals doorgaans het geval is. De problemen zitten dus niet bij de code van pakweg Windows, Linux of Flash. Het lek zit op het niveau van de architectuur van de processor zelf.

Speculative execution

Ten tweede treffen de lekken niet één chip of type chip. De kwetsbaarheid overstijgt types architectuur en kan misbruikt worden op processors van Intel, AMD, ARM, IBM en Sparc. Dat komt omdat ze een gevolg zijn van een onvoorziene werking van speculative execution of speculatieve uitvoering. Die techniek ligt aan de basis van één van de grootste sprongen in cpu-prestaties in de laatste vijftien jaar, en wordt door iedere chipdesigner op de één of andere manier geïmplementeerd.

De kwetsbaarheid overstijgt types architectuur en kan misbruikt worden op processors van Intel, AMD, ARM, IBM en Sparc.

Zowel Spectre als Meltdown misbruiken die speculatieve uitvoering en daar is Intel het grootste slachtoffer van. Dat komt omdat de chipgigant de techniek op een eigenwijze manier in zijn cpu’s inbouwt, en die zorgt voor extra problemen. Voor we daar dieper op ingaan, nemen we een stap achteruit en kijken we even naar wat speculatieve uitvoering precies is.

Speculatieve uitvoering is een vorm van out of order execution. Out of order execution heeft betrekking op de manier waarop een processor instructies uitvoert. In de begindagen van processordesign stuurde een programma instructies in volgorde naar de cpu, die ze in dezelfde volgorde uitvoerde. Dat wilde zeggen dat de processor vaak moest wachten tot één instructie klaar was om dan pas aan de volgende te beginnen. De chip verwerkte zo minder rekentaken dan theoretisch mogelijk. Door elke klokcyclus instructies opnieuw te ordenen voor verwerking door de processor, wordt iedere cyclus zo efficiënt mogelijk benut en verkleint de tijd dat de chip zit te wachten. We nemen onderstaand vereenvoudigd diagram van een processor als illustratie van out of order executionen dan specifiek speculatieve uitvoering door middel van branch prediction.

Een vereenvoudigd diagram dat weergeeft hoe instructies per klokcyclus doorheen een cpu-pijplijn bewegen. Beeld via Wikipedia.

Moderne processors voeren code uit in pijplijnen. Dat staat de chips toe om meerdere instructies gelijktijdig uit te voeren. Eén pijplijn bestaat uit verschillende stappen. In bovenstaande illustratie zie je een enkele pijplijn die uit vier stappen bestaat. Je leest het diagram van links naar rechts. De gekleurde blokjes stellen instructies voor die de processor moet uitvoeren. Laten we er voor dit voorbeeld vanuit gaan dat het groene blokje de instructie ‘ALS x=y DAN z ANDERS w’ bevat. Die eenvoudige instructie vraagt de processor om na te gaan of parameter x gelijk is aan parameter y, is dat het geval dan moet instructie z gedraaid worden, komen de parameters niet overeen dan moet de processor instructie w uitvoeren.

Instructies voorspellen

In klokcyclus 1 komt de groene instructie de pijplijn binnen. Vooraf bekijkt de branch predictor de instructie. Dat is een ingebouwde functie die probeert te voorspellen wat de uitkomst van de groene instructie zal zijn. Zou x gelijk zijn aan y zodat instructie z de volgende is, of zou na de groene instructie toch instructie w aan bod komen?

De predictor voert de instructie niet uit, maar speculeert. Dat gebeurt met een nauwkeurigheid van doorgaans meer dan 95 procent. Laten we zeggen dat de branch predictor er in dit geval van uitgaat dat het uitvoeren van de groene instructie zal leiden tot de uitvoering van instructie z. De processor is niet zeker dat instructie z effectief relevant zal zijn, maar plaatst ze toch al in de pijplijn: het is het paarse blokje.

De groene instructie schuift per klokcyclus een stapje verder in de pijplijn en wordt uiteindelijk naar het geheugen geschreven. Als blijkt dat de branch predictor gelijk had, dan is de uitvoering van de paarse instructie (z) maar één klokcyclus van voltooiing verwijderd. Zonder de speculatieve uitvoering van het paarse blokje zou de cpu vijf cycli moeten wachten zodat de instructie klaargezet en uitgevoerd kan worden. In het overgrote deel van de gevallen waarin de predictor juist speculeert, wint de cpu zo een heleboel tijd.

Privileges en bescherming

Instructies draaien met bepaalde privileges. Een eenvoudig Windows-tooltje krijgt niet zomaar toegang tot beschermde plaatsen van het geheugen waar je wachtwoordbeheerder bijvoorbeeld wachtwoorden bewaart. Het geheugen is daartoe onderverdeeld in twee zones: de user space waar gewone programma’s wonen, en de beschermde kernel space waar gevoelige processen leven.

Doorgaans wordt het privilege van een instructie nagekeken zodat een instructie uit de user space niet kan gaan rondneuzen in de kernel space. Dat gebeurt in de regel voor de uitvoering, maar dat is niet altijd het geval. Een Intel-chip negeert de privileges van een speculatief uitgevoerde instructie tot de laatste stap waarin ze wordt afgewerkt. Pas dan gebeurt er een check, en zet de chip een eventuele ongeoorloofde handeling stop. Tot ze wordt weggeschreven heeft in bovenstaand voorbeeld de paarse instructie wel toegang tot alle geheugenlocaties in de pc, inclusief beveiligde zones met gevoelige informatie. In principe is dat geen probleem aangezien de instructie in theorie tijdig wordt stopgezet.

Spieken

Het Meltdown-lek laat een hacker echter toe om het cachegeheugen geassocieerd met de speculatief uitgevoerde instructie te lezen. Dat kan gevoelige gegevens bevatten nog voor de cpu de uitvoering omwille van ongeoorloofde geheugentoegang stopzet. De kwetsbaarheid is het gevolg van het ontwerp en de optimalisatie van de processor zelf. Het is dus niet zomaar een optie om een deurtje toe te doen en er voor te zorgen dat malware niet kan meekijken naar de gegevens die onze paarse instructie heeft opgevraagd.

Het is niet zomaar een optie om een deurtje toe te doen en er voor te zorgen dat malware niet kan meekijken naar gevoelige gegevens.

Om gevoelige en goed beschermde gegevens toch te lezen, moet een hacker een programma-instructie schrijven die de branch predictor doet beslissen om een specifieke malafide instructie klaar te zetten in de pijplijn. Die instructie krijgt dan toegang tot de kernel space en zal weliswaar afgestopt worden, maar pas nadat de hacker het geraadpleegde geheugen heeft uitgelezen.

Een firmware-update (via de bios) kan de werking van de processor wel veranderen, maar dan nog zorgt het fysieke design van de chip met zijn miljarden transistors en interconnects voor beperkingen. Om het Meltdown-probleem te verhelpen, moet de processor wisselen tussen user mode en kernel mode telkens wanneer een instructie van de user space dan wel de kernel space wordt uitgevoerd. Tijdens zo’n context switch wordt bepaald rekenwerk op pauze gezet, en dat heeft een voelbaar negatieve impact op de prestaties van de processor en bijgevolg je computer.

[related_article id=”210350″]

Context switch en workload

Hoe groot die negatieve impact is, hangt heel hard af van de workload die je probeert te draaien. Die zal bepalen hoe vaak zo’n context switch voorkomt. Het lijkt er op dat consumentengebruik van de pc niet tot veel context switching leidt, waardoor de impact van een Meltdown-patch niet zo heel groot is. Servers in de cloud die complexe workloads draaien, moeten wel vaak wisselen tussen de user space en de kernel space, wat tot meer gewissel en bijgevolg grotere vertragingen leidt. Zeker bij iets oudere processors (Haswell en ouder) is de impact significant. De eerste tests wijzen op een mogelijke achteruitgang van processorprestaties met tien procent of meer.

De specifieke manier waarop Intel speculatieve uitvoering toepast, zorgt er dus voor dat Intel-chips het momenteel zwaar te verduren krijgen. Andere chipbakkers maken ook gebruik van branch prediction en speculatieve uitvoering, maar zij kampen niet met het privilegeprobleem. Ook bij AMD, ARM en IBM kunnen hackers zich toegang verwerven tot informatie die ze niet mogen zien, maar het gevaar is kleiner en ook de impact van een patch laat zich minder voelen. Intel zal voor zijn volgende generatie chips op transistorniveau moeten kijken hoe het de ergste problemen kan verhelpen. Spectre en Meltdown helemaal doodslagen gaat niet voor morgen zijn, aangezien het geen optie is om speculatieve uitvoering naar de prullenmand te wijzen. Daar zijn de prestatievoordelen te groot voor.

Gerelateerde artikelen

Volg ons

69% korting + 3 maanden gratis

69% korting + 3 maanden gratis

Bezoek NordVPN

Business