
Beispiel für die Nutzung des offengelegten "Spectre"-Exploits (CVE-2017-5753 und CVE-2017-5715)
Beispiel für die Nutzung des enthüllten „Spectre“-Exploits vom 2. Januar 2018 (CVE-2017-5753 und CVE-2017-5715)
Spectre bricht die Isolierung zwischen verschiedenen Anwendungen. Es erlaubt einem Angreifer, fehlerfreie Programme, die Best Practices befolgen, dazu zu bringen, ihre Geheimnisse preiszugeben. Tatsächlich vergrößern die Sicherheitsprüfungen dieser Best Practices die Angriffsfläche und können Anwendungen anfälliger für Spectre machen.
C, verwendet Bibliotheken:
Wir legen den Text „The Magic Words are Squeamish Ossifrage.“ im Speicher ab und versuchen dann, ihn mit dem Exploit auszulesen. Wenn das System anfällig ist, sehen Sie denselben Text in der Ausgabe, aus dem Speicher gelesen.
In diesem Code würde die Funktion nur aus array1[0..15] lesen, wenn die kompilierten Anweisungen in victim_function() in strenger Programmreihenfolge ausgeführt würden, da array1 die Größe 16 hat. Bei spekulativer Ausführung sind jedoch Lesezugriffe außerhalb der Grenzen möglich. Die Funktion readMemoryByte() führt mehrere Trainingsaufrufe von victim_function() durch, um den Branch Predictor dazu zu bringen, gültige Werte für x zu erwarten, und ruft dann mit einem x außerhalb der Grenzen auf. Die Bedingungsverzweigung wird fehlvorhergesagt, und die anschließende spekulative Ausführung liest ein geheimes Byte mit dem außerhalb liegenden x. Der spekulative Code liest dann aus array2[array1[x] * 512] und gibt den Wert von array1[x] in den Cache-State weiter. Um den Angriff abzuschließen, wird ein einfaches Flush+Probe verwendet, um zu identifizieren, welche Cache-Zeile in array2 geladen wurde, was die Speicherinhalte offenlegt. Der Angriff wird mehrmals wiederholt, sodass selbst wenn das Zielbyte anfänglich nicht zwischengespeichert war, es durch die erste Iteration in den Cache geholt wird.
Der nicht optimierte Code liest auf einem i7 Surface Pro 3 etwa 10 KB/s.
gcc -std=c99 Source.c -o spectre.out
oder
make
Erstellen Sie ein neues leeres Projekt, fügen Sie Source.c hinzu, und klicken Sie auf „Build“.
.\spectre.out ohne Parameter.
.\spectre.out {address} {length} mit Parametern: