Intel traf vor kurzem ein sehr bösartiger Bug: MELTDOWN.
Das ganze führte zum Absturz der Intel Aktie von 7%, und wahrscheinlich dazu dass das Internet nicht nur komplett neu gestartet werden muss, sondern auch um 5% langsamer wird…
Aber mal von vorne mit einer Erklärung „Meltdown für Dummies“:
Es spielen hier drei Systeme moderner CPUs (auch AMD und ARM) eine Rolle:
1. Virtueller Speicher: Jeder Speicherzugriff eines Prozesses wird von der CPU Memory Einheit (MMU) umgewandelt auf eine echte Adresse. Außerdem prüft die MMU auch ob der Speicherzugriff erlaubt ist.
2. Cache: Jeder Prozessor hat einen sehr schnellen Speicher direkt neben dem Core – dieser puffert den Inhalt des Speichers, somit kann häufig gelesener Speicher schneller gelesen werden – sogar ohne Zugriff auf den Memory Bus.
3. Out of Order Execution: Moderne CPUs führen mehrere Programmzeilen gleichzeitig aus, auch welche die eventuell garnicht dran kommen oder erlaubt sind.
So, und nun zur Pseudo Erklärung:
Mein Prozess hat seinen eigenen Speicher (fiktive Werte!!) der geht von 0x00000000 – 0x80000000 und gleichzeitig auch den kompletten (geheimen) Kernel Speicher von 0x80000001 – 0xFFFFFFF. Die MMU verbietet mir aber (als Userspace Prozess ohne Systemrechte) jeglichen Lesezugriff auf alle Speicherseiten ab 0x80000001. So muss das sein.
Jetzt macht mein Programm folgendes:
1. Leere den kompletten Prozessor-Speichercache.
2. Erzeuge dir eine legalen Speicherbereich, z.B. von 0x10000000 und nenne diesen A.
3. Lese von der verbotenen Adresse 0x80001000, das Ergebnis ist B. Nehmen wir an wir bekämen hier: 0x25
-> ANMERKUNG: Der Schritt 3 wird ausgeführt werden (Out of Order Execution) aber das Ergebnis wird nicht zurückgegeben werden weil das lesen dieser Adresse ja verboten ist.
4. Schreibe das Ergebnis an die Adresse A + B, also in unserem Fall 0x10000025. Auch diese Anweisung ist nicht erlaubt, wird aber (Out of Order Execution) ausgeführt werden.
5. Nun lesen wir von Adresse 0x10000000 und schauen wir schnell die Antwort kommt – kommt sie sehr schnell so war B und damit der Inhalt der verbotenen Adresse 0x00.
6. Jetzt fangen wir wieder bei 1 an, nur lesen wir diesmal im Punkt 5 nicht von 0x10000000 sondern von 0x10000001 und messen auch hier wieder die Zeit.
7. Wir erhöhen jetzt jedesmal die Adresse um 1, bis wir irgendwann feststellen dass wir bei 0x10000025 plötzlich sehr schnell lesen können.
Damit wissen wir also: B war 0x25 – weil die CPU die entsprechende Adresse des Speichers im Cache hat!
In der Realität wird übrigens bei Punkt 4 nicht einfach A+B gerechnet sondern es wird multipliziert, also eher A+(B*4096) – weil die CPU immer Page weiße cacht, also 4096 Bytes auf einmal. Bei Punkt 6 wird dann entsprechend nicht um 1 erhöht sondern um 4096 – das Prinzip ist aber das gleiche.
Die Spectre Attacke läuft nach einem ähnlichen Schema ab, nur wird hier der Speicher eines anderen Prozesses ausgelesen indem man ihn dazu bringt von einer verbotenen Adresse mit Out of Order Execution zu lesen.
Genaugenommen führt man extra noch eine Abfrage im Programmcode so aus dass sie immer mit „true“ angesprungen wird. Wenn man dann irgendwann mal mit „false“ als Ergebnis daher kommt kann man darauf vertrauen dass die sogenante Branch prediction des Prozessors trotzdem den „true“ Zweig ausführen wird, weil sie erwartet dass wieder true rauskommt obwohl es diesmal nicht der Fall ist. Man kann also relativ sicher die Out of Order Execution des Prozessors dazu bringen eine bestimmte Zeile auszuführen obwohl es nicht erlaubt ist. Wenn in dieser Zeile eine von uns kontrollierte Speicheradresse vorkommt (per Eingabe die das Programm erlaubt) habe ich über den Cache die Möglichkeit zu sehen an welcher Adresse genau gelesen wurde, also im Prinzip das gleiche wie die Meltdown Attacke.
Der Fehler konnte so nur bei Intel CPUs nachgestellt werden. Bei ARM und AMD CPUs war der Fehler nicht nachvollziehbar.
Die Lösung des Linux Kernels Teams ist übrigens dass jedes Mal bevor ein Programm läuft alle Kernel-Pages aus der MMU gelöscht werden, somit ist kein Zugriff mehr auf diese möglich (auch nicht per Out Of Order Execution) da die MMU selbst die physikalischen Adressen nicht mehr kennt.
Der sogenannte KPTI /KAISER Patch (kernel address isolation to have side-channels efficiently removed) hat aber einen Performance Verlust von 5% (neue CPUs) bis 30% (alte CPUs). Unklar ist bislang ob dieser Performance Verlust auch (unnötigerweise) bei AMD CPUs auftritt. Denn AMD CPUs brauchen den Patch ja eigentlich nicht.
Microsoft hat das Problem wohl schon in Windows gepatcht. Wie genau weiß man aber nicht.
Quelle Meltdown: https://meltdownattack.com/meltdown.pdf
Quelle Spectre: https://spectreattack.com/spectre.pdf
Schreibe einen Kommentar