De vloek van Spectre: waarom blijft het jou en Intel achtervolgen?

Wat als alle processors ter wereld een fundamentele fout bevatten, die op steeds meer manieren wordt uitgebuit, en waarvoor geen goede patch bestaat? We onderzoeken Spectre, de kwelduivel van Intel, en bekijken waarom het lek een half jaar na de ontdekking nog steeds aan de orde is.

Intel lijkt wel gestalkt door de geest van Spectre. De kwetsbaarheid verandert processors in een fantastische vector voor hackers om systemen mee te kraken. Hoewel het lek al aan het begin van dit jaar werd ontdekt, blijven de repercussies tot op vandaag voelbaar. Enkele dagen geleden berichtte Techzine nog over hoe een nieuwe Chrome-patch, die Spectre-misbruik moest tegengaan, een serieuze impact had op systeemprestaties. Enkele weken daarvoor haalden beveiligingsonderzoekers het nieuws met de ontdekking van Spectre 1.1 en Spectre 1.2. Niemand lijkt de achterpoort finaal te kunnen sluiten.

In dit stuk graven we dieper. Om te begrijpen waarom Spectre (en neefje Meltdown, waar destijds ook veel om te doen was) Intel blijft achtervolgen en een eenvoudige update het probleem niet verhelpt, moet je weten wat de kwetsbaarheid zo uniek maakt. Om dat te doen, moeten we in de werking van de architectuur van een moderne processor duiken.

 

Niemand lijkt de achterpoort finaal te kunnen sluiten.

 

Speculatieve uitvoering: de achilleshiel

Zowat alle moderne processors, of ze nu van Intel of AMD komen, op x86 gebouwd zijn dan wel ARM, maken gebruik van enkele gelijkaardige principes. Eén daarvan heet speculatieve uitvoering.

Speculatieve uitvoering is een slim antwoord op een probleem dat oude cpu’s teisterde. In de vroege dagen van processorarchitectuur had een cpu één rekenkern met een bepaalde kloksnelheid. Die voerde instructies uit in de volgorde waarin ze werden aangeboden. Aan instructie 2 werd pas begonnen als instructie 1 klaar was.

Dat is niet zo efficiënt. Als instructie 2 bijvoorbeeld waardes uit het geheugen nodig heeft, zal de cpu die waardes pas inladen wanneer instructie 1 is afgewerkt. Dat laden duurt lang, waardoor er waardevolle klokcycli verloren gaan, waarop de rekenkern niets doet. Processorarchitecten omzeilden dat probleem door cpu’s van een slim systeem te voorzien dat de chips toelaat om te gokken wat de volgende instructie zal zijn, en welke geheugenwaarden daarmee gepaard gaan.

Gokken en (prestaties) winnen

Een voorbeeld: vlak na instructie 1 wordt instructie 2 als speculatief ingeladen. Bijhorende geheugendata wordt naar de cache van de processor geschreven. De cache is een kleine pool van ultrasnel geheugen op de processor zelf. Wanneer een cpu instructies uitvoert, doet hij beroep op de cache en niet op het RAM-geheugen, omdat dat te traag is.

Is instructie 1 afgerond, dan zit instructie 2 de eerste instructie al op de hielen, met alle nodige data op de juiste plaats in de cache. Als de processor juist gespeculeerd heeft, moet hij helemaal geen waardevolle klokcycli wachten totdat de nodige data uit de RAM naar de cache is gehaald, en kan het rekenwerk gewoon doorgaan. Is de speculatie toch fout, dan wordt al het werk dat al gedaan is voor de uitvoering van instructie 2 ongedaan gemaakt, en wordt de volgende instructie ingeladen als vanouds.

Speculatieve voorspelling is steengoed geworden doorheen de jaren, met een succesratio van om en bij de 95 procent. Moderne cpu’s hebben een groot deel van hun snelheid te danken aan speculatieve uitvoering.

 

Spectre maakt op een slimme manier misbruik van speculatieve executie.

 

Het hele systeem is geïmplementeerd op micro-architecturaal niveau. De firmware van de cpu, die de werking van de logische schakelingen gebouwd door de miljarden interconnects en transistors beheert, regelt ook de speculatieve uitvoering. Programma’s houden er geen rekening mee: zij gaan er gewoon vanuit dat hun instructies op volgorde worden uitgevoerd. Het speculatieve luik gebeurt achter de schermen, en versnelt die uitvoering.

Spectre maakt op een slimme manier misbruik van speculatieve executie, en hoewel alle moderne cpu’s het systeem op de één of andere manier hebben ingebakken, is enkel de implementatie van Intel echt problematisch.