Beispiel für die Verwendung des am 2. Januar 2018 aufgedeckten „Spectre“-Exploits (CVE-2017-5753 und CVE-2017-5715)
Spectre durchbricht die Isolation zwischen verschiedenen Anwendungen. Es ermöglicht einem Angreifer, fehlerfreie Programme, die Best Practices befolgen, dazu zu bringen, ihre Geheimnisse preiszugeben. Tatsächlich vergrößern die Sicherheitsüberprüfungen dieser Best Practices die Angriffsfläche und machen Anwendungen möglicherweise anfälliger für Spectre.
C, verwendet Bibliotheken:
Wir setzen den Text „The Magic Words are Squeamish Ossifrage“ ein. im Speicher und dann versuchen wir, es mithilfe eines Exploits zu lesen. Wenn das System anfällig ist, wird in der Ausgabe derselbe Text angezeigt, der aus dem Speicher gelesen wird.
Wenn in diesem Code die kompilierten Anweisungen in victim_function()
in strikter Programmreihenfolge ausgeführt würden, würde die Funktion nur aus array1[0..15]
lesen, da Array1-Größe = 16. Bei spekulativer Ausführung würden jedoch Lesevorgänge außerhalb der Grenzen liegen sind möglich. Die readMemoryByte()
Funktion führt mehrere Trainingsaufrufe an victim_function()
durch, um den Verzweigungsprädiktor dazu zu bringen, gültige Werte für x zu erwarten, und ruft dann mit einem außerhalb der Grenzen liegenden x auf. Der bedingte Zweig führt zu einer falschen Vorhersage und die anschließende spekulative Ausführung liest ein geheimes Byte unter Verwendung des außerhalb der Grenzen liegenden x. Der spekulative Code liest dann von array2[array1[x] * 512]
und gibt den Wert von array1[x]
an den Cache-Status ab. Um den Angriff abzuschließen, wird ein einfaches Flush+Probe verwendet, um zu identifizieren, welche Cache-Zeile in array2
geladen wurde, und so den Speicherinhalt offenzulegen. Der Angriff wird mehrmals wiederholt. Selbst wenn das Zielbyte ursprünglich nicht zwischengespeichert war, wird es bei der ersten Iteration in den Cache verschoben.
Der nicht optimierte Code liest auf einem i7 Surface Pro 3 etwa 10 KB/Sekunde.
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 dann auf Erstellen.
.spectre.out
ohne Parameter.
.spectre.out {address} {length}
mit Parametern: