Neue Prozessoren braucht das Land – die Entwicklungen des letzten Jahres

04.04.2019 / Dr. Markus Ermes / Referent

aus dem Netzwerk Insider April 2019

Spectre und Meltdown – ein Synonym für den Fokus auf Leistungsfähigkeit bei der Entwicklung von Prozessoren und die mangelnde Berücksichtigung von Sicherheitsaspekten. Was zu den Anfangszeiten des Internets noch wenig Relevanz hatte, ist in Zeiten von Cloud und gemeinsamer Nutzung von Infrastruktur umso kritischer. Innerhalb von etwas mehr als einem Jahr hat sich aus zwei Sicherheitslücken mittlerweile ein ganzer Zoo entwickelt, der in wenige Gattungen unterteilt werden kann. Was gibt es Neues? Welche Auswirkungen haben die Lücken? Was sagen Experten dazu?

Im Juni letzten Jahres erschien ein erster Artikel zum Thema „CPU-Sicherheit“ im Netzwerk-Insider. Darin wurde bereits darauf hingewiesen, dass auf Basis von Spectre und Meltdown neue architekturbedingte Sicherheitslücken entdeckt wurden, aber Details waren noch nicht bekannt. In den vergangenen 10 Monaten sind diese (und weitere) Sicherheitslücken veröffentlicht und im Detail beschrieben worden. Außerdem konnten in dieser Zeit die Auswirkungen auf den realen Betrieb von IT-Systemen beobachtet werden. Dieser Artikel soll eine Übersicht über die wichtigsten neuen Informationen geben, speziell über die neuen Sicherheitslücken, wobei diese technisch detailliert behandelt werden müssen. Außerdem werden neue Informationen zu den Auswirkungen von Gegenmaßnahmen betrachtet sowie eine Einschätzung zur aktuellen Gefährdungslage dargestellt.

1. Sicherheitslücken in CPUs – eine kurze Wiederholung

Um zu verstehen, was die aktuellen Sicherheitslücken in CPUs ermöglicht und wo die Gefahren liegen, soll in diesem Kapitel noch einmal in Kurzform eine Übersicht über die Funktionen „Out-of-Order-Execution“ und „Speculative Execution“ in modernen CPUs dargestellt werden. Außerdem werden die ursprünglichen Versionen von Spectre und Meltdown erläutert. Für eine detaillierte Beschreibung dieser Themen sei auf den entsprechenden Artikel im Netzwerk Insider von Juni 2018 verwiesen
[1].

1.1 CPU-Technologien
Bei den CPU-Technologien sind zum Verständnis der Sicherheitslücken drei Aspekte zu nennen: Caches, „Out-of-Order-Execution“ und „Speculative Execution“; alle drei sollen hier nur kurz angeschnitten werden, um ein grundlegendes Verständnis für die Funktionsweise von Spectre und Meltdown zu schaffen.

Wichtig ist zunächst im Hinterkopf zu behalten, dass CPUs sehr viel schneller sind als der Arbeitsspeicher, auf den sie zugreifen. Dadurch werden bei jedem Zugriff auf den Arbeitsspeicher viele Taktzyklen verschwendet. Heutzutage kann eine CPU in der Zeit, die ein Ladevorgang aus dem Arbeitsspeicher benötigt, bis zu 1000 Instruktionen abarbeiten. Um diese Diskrepanz zu maskieren, besitzen CPUs Cache-Stufen, die Daten aus dem Arbeitsspeicher zwischenspeichern und eine deutlich geringere Zugriffszeit besitzen als der Arbeitsspeicher. Es gibt, abgestuft nach Kosten, mehrere Cache-Stufen (sog. Level), die sich in Größe und Geschwindigkeit unterscheiden. Typischerweise gibt es drei Ebenen:

  1. Extrem schneller, aber sehr kleiner (< 1 MB) Level-1-Cache (L1)
  2. Sehr schneller, größerer L2-Cache (wenige MB)
  3. Schneller L3-Cache (> 10 MB)

Eine Skizze der Technologien „Out-of-Order-Execution“ und „Speculative Execution“ ist in Abbildung 1 dargestellt.

Out-of-Order-Execution
Bei der Out-of-Order-Execution moderner CPUs wird die Reihenfolge von Instruktionen innerhalb eines auszuführenden Programms modifiziert, um die einzelnen Bereiche einer CPU (Gleitkomma-Einheit, Fließkomma-Einheit, Vektor-Einheit etc.) optimal zu nutzen. Das ist natürlich nur möglich, sofern die Daten bereits in den Cache geladen wurden oder andere Teile des Programms lange genug brauchen, um einen Ladevorgang aus dem Arbeitsspeicher zu rechtfertigen. Komplexe Logik innerhalb der CPUs stellt sicher, dass Änderungen der Reihenfolge das Ergebnis der Ausführung nicht beeinflussen. Trotzdem kann es dazu kommen, dass Zugriffe erfolgen, die nicht erlaubt sind und sog. „Exceptions“ auslösen. In diesem Falle wird der ursprüngliche Zustand vor der Ausführung (theoretisch) wiederhergestellt. Allerdings kann, wie im Folgenden beschrieben, die CPU dazu gebracht werden, auch Instruktionen nach einem eigentlich unerlaubten Zugriff auszuführen.

Speculative Execution
In nahezu allen Programmen kommt es irgendwann zu Verzweigungen des Ausführungspfads. Ein typisches Beispiel ist hier ein „if-then“-Konstrukt, also eine „Wenn-Dann“-Abfrage. Hier wird die Performance normalerweise reduziert, da keine Instruktionen jenseits der Abfrage durch Out-of-Order-Execution ausgeführt werden können. Hier setzt „Speculative Execution“ an; es wird der wahrscheinlichste Pfad ermittelt oder durch vorherige Ausführungen gelernt und schon einmal „auf Verdacht“ ausgeführt. Diese Ausführung kann auf schon im Cache vorhandene Daten zugreifen oder schon im Voraus Daten aus dem Arbeitsspeicher laden und diese verarbeiten. Sollte der Verdacht stimmen, gewinnt man viele Taktzyklen. Sollte der Verdacht nicht stimmen oder eine Exception auftreten, so wird – wie bei „Out-of-Order-Execution“ – der ursprüngliche Zustand (zumindest theoretisch) wiederhergestellt und die Applikation wie eigentlich geplant fortgesetzt.

1.2 Spectre und Meltdown
Die dargestellten Technologien wurden mit starkem Fokus auf Performance entwickelt. Etwaige Folgen für die Sicherheit wurden nur bedingt betrachtet. Dies liegt vor allem an der Zeit, in der diese Technologien entwickelt wurden und nicht am mangelnden Sicherheitsbewusstsein der Entwickler. Vor 20 Jahren war eine so stark parallele Nutzung von CPU-Ressourcen durch verschiedene User kaum denkbar wie sie im Zeitalter der Virtualisierung üblich ist. Diese wurde erst durch die Einführung von Multi-Core-CPUs sinnvoll. Ihren bisherigen Höhepunkt hat diese parallele Nutzung mit dem Aufstieg der Cloud gefunden. Gerade für die Wirtschaftlichkeit eines Cloud-Angebots ist eine gleichzeitige Nutzung von Ressourcen durch mehrere Kunden – unter Umständen sogar durch miteinander konkurrierende Firmen – eine Grundvoraussetzung.

Mit der Entdeckung von Spectre und Meltdown sowie deren verschiedenen Variationen wurden vergangene Versäumnisse beim Blick auf Sicherheitsaspekte von CPUs schmerzhaft verdeutlicht.

Dabei sei noch darauf hingewiesen, dass die Gefahr von Spectre und Meltdown darin liegen, dass die in Kapitel 1.1 erwähnte Wiederherstellung des Ursprungszustands der CPU nicht vollständig ist. Die bereits in den Cache der CPU geladenen Daten werden nicht wieder entfernt.
Insgesamt ist das Ausnutzen von Spectre und Meltdown – auch in ihren neuen Versionen – sehr komplex. Ein Angriff in dieser Form muss sehr genau auf das geplante Ziel zugeschnitten werden und erfordert sehr viel Knowhow. Daher ist – zumindest momentan – davon auszugehen, dass diese Sicherheitslücken, wenn überhaupt, nur von staatlich finanzierten Hackergruppen ausgenutzt werden können. Wie in Kapitel 4 dargestellt wird, sind bisher aber noch keine Angriffe bekannt.

Im Folgenden soll kurz beschrieben werden, wie die ersten beiden Sicherheitslücken funktionieren.

Abbildung 1: Schematische Darstellung von „Out-of-Oder-Execution“ und „Speculative Execution“ [1]


Spectre
Spectre bedient sich der „Speculative Execution“, um eigentlich nicht zugängliche Daten auszuspähen. Dazu wird durch ein von einem Angreifer kontrolliertes Programm die CPU darauf trainiert, ein bestimmtes Abfrage-Ergebnis als wahrscheinlich anzusehen. Anschließend wird die Abfrage und ein innerhalb der Abfrage getätigter Speicherzugriff modifiziert. Zwar erkennt die CPU bei der Ausführung der Abfrage den Fehler und stellt den Ursprungszustand wieder her, doch die zuvor im Rahmen der spekulativen Ausführung geladenen Daten sind nach wie vor im CPU-Cache vorhanden und können über einen Seitenkanal ausgelesen werden. Dazu wird vor dem Angriff der CPU-Cache geleert und mit einem möglichen Wert der auszulesenden Daten gefüllt. Ein Beispiel hierfür wären die einzelnen Bytes eines Verschlüsselungs-Keys. Nach dem Angriff kann dann über Messungen der Zugriffszeit auf die auszuspähenden Daten ermittelt werden, ob diese aus dem Arbeitsspeicher geladen wurden oder ob der „geratene“ Wert im Cache stimmt. Es handelt sich dabei um einen langsamen Prozess mit geringen Übertragungsraten, aber bestimmte Daten, wie beispielsweise Verschlüsselungs-Keys oder Passwörter können trotzdem mit ausreichender Geschwindigkeit ausgelesen und an einen Angreifer übermittelt werden.

Meltdown
Bei Meltdown wird ebenfalls das Verhalten der CPU ausgenutzt, alle gelesenen Daten im Cache abzulegen. Doch statt einen bestimmten Ausführungspfad in einem Programm zu nutzen, wird die „Out-of-Order-Execution“ ausgenutzt. So wird eine Reihe von Instruktionen auf der CPU ausgeführt, die einen unzulässigen Speicherzugriff beinhaltet. Die Reihenfolge ist dabei so gewählt, dass der unzulässige Zugriff nach der Optimierung der Instruktionsreihenfolge zu einem früheren Zeitpunkt geschieht als im Programm eigentlich vorgesehen. Dadurch können auch hier – noch bevor die Exception verarbeitet wird – Daten in den Cache übertragen und auf ähnliche Art und Weise wie bei Spectre ausgelesen werden.

2. Neue Sicherheitslücken

Dass die ersten Meldungen von Spectre und Meltdown nur die Spitze des Eisbergs darstellen würden, war schon zu Beginn der Berichterstattung sehr wahrscheinlich. Und so wurden bereits neue Sicherheitslücken „angekündigt“ als die ersten gerade erst bekannt wurden. Diese, so wie alle weiteren, seither bekannten Sicherheitslücken moderner Prozessorarchitekturen im Umfeld von Spectre und Meltdown, sollen im Folgenden beschrieben werden. Dabei wird aufgrund der Komplexität der technische Tiefgang minimiert und nur sehr grob auf die Details eingegangen. Der interessierte Leser sei hier auf [2] verwiesen. Aus dieser Veröffentlichung ist auch die grobe Aufteilung übernommen, wie sie in Abbildung 2 dargestellt ist.

An dieser Skizze sieht man sehr deutlich, dass aus den ursprünglich zwei Sicherheitslücken eine Vielzahl verschiedener Angriffsszenarien entwickelt werden konnte, und dass die Entdeckung weiterer Lücken nicht unwahrscheinlich ist. Es sind noch genauere Unterscheidungen innerhalb dieser Angriffe möglich. In diesem Artikel wird im Weiteren aber nicht auf jede einzelne Angriffsform eingegangen.

Eine weitere beunruhigende Nachricht war die Veröffentlichung der Lücke „NetSpectre“, die eine Ausnutzung von Spectre über das Netzwerk ermöglicht hat. Hier sind aber glücklicherweise Gegenmaßnahmen auf verschiedenen Ebenen, unter anderem im Netzwerk, möglich.

Auch wurde ein Weg gefunden, auf Basis der CPU-Architektur zusätzliche Informationen über die physische Verteilung von gespeicherten Daten im Arbeitsspeicher zu ermitteln, die in Verbindung mit anderen Angriffen (Rowhammer [3]) eine Änderung von Daten erlaubt.

Abbildung 2: Systematische Untersuchung von CPUs auf Basis von Spectre und Meltdown durch Forscher. Alle dargestellten Sicherheitslücken sind bekannt und können ausgenutzt werden. Die fett dargestellten Sicherheitslücken sind in [2] entdeckt und zum ersten Mal ausgenutzt worden.

2.1 Nomenklatur
Die in den Medien gängige Bezeichnung „Spectre V“ für Spectre-basierte Lücken ist wenig zielführend. So ist weder die genaue Ursache noch die Kritikalität aus dem Namen zu erkennen. Um zumindest die Ursache besser nachvollziehen zu können, wird in diesem Artikel die Nomenklatur aus [2] übernommen, die sowohl für Meltdown als auch für Spectre gilt. Damit ergibt sich die Bezeichnung „Spectre-“ bzw. „Meltdown-“, um die ursächliche Funktionseinheit der CPU direkt zu benennen. Es gelten für die Architekturelemente die in Tabelle 1 aufgeführten Abkürzungen. Die Ausnutzbarkeit der jeweiligen Lücke auf CPUs von Intel, AMD und/oder ARM ist ebenfalls aufgeführt. Lücken, die theoretisch betrachtet aber nicht erfolgreich ausgenutzt wurden, sind nicht aufgeführt.

Auf Basis dieser Nomenklatur werden im Folgenden die neuen Angriffe auf Basis von Spectre und Meltdown beschrieben.

2.2 Neue Spectre-Versionen
Zu den bereits im Mai letzten Jahres bekannten Sicherheitslücken (Spectre-BHT und Spectre-PTB) gesellen sich zwei neue Ansätze: Spectre-RSB und Spectre-STL.

Spectre-RSB
Nach dem Aufruf einer Funktion auf CPU-Ebene („call“-Instruktion) wird der „Return Stack Buffer“ (RSB, Tabelle 1) genutzt, um die Adresse nach der Rückkehr aus der Funktion zu speichern. Der RSB ist dabei in jedem (physischen) CPU-Kern vorhanden und in der Anzahl der gespeicherten Adressen begrenzt. Sollten die Funktionsaufrufe stark verschachtelt sein (und damit mehr Adressen notwendig sein als im RSB vorhanden) oder ein Angreifer die Instruktionen an der gespeicherten Adresse modifizieren, ergibt sich so die Möglichkeit, eigenen Code im Rahmen von „Speculative Execution“ auszuführen. Dieser Angriff bietet sich insbesondere an, um aus abgeschotteten Umgebungen (sog. „Sandboxes“) auszubrechen, wie sie beispielsweise im Desktop-Bereich bei vielen Browsern zum Einsatz kommen.

Spectre-STL
Beim „Raten“ der CPU, welcher Ausführungspfad am wahrscheinlichsten ist, müssen Daten berücksichtigt werden, von denen die CPU nicht genau weiß, ob sie vorher verändert werden oder nicht. Hier dient der STL (Store To Load) der Vorhersage von Abhängigkeiten zwischen Lade- und Speicherinstruktionen. Sollte eine Abhängigkeit unwahrscheinlich (oder auszuschließen) sein, können Daten spekulativ geladen werden, was wiederum zur Befüllung des Caches genutzt werden kann. Sollte doch eine Überschneidung gefunden werden, so werden nur die geänderten Bereiche neu geladen, was eine bessere Ausnutzung des CPU-Caches zur Folge hat.

In Verbindung mit spekulativer Ausführung können aber auch Daten geladen werden, die eigentlich vor der Ausführung verändert werden sollten. So kann über einen Seitenkanal der „alte“ Stand der Daten ausgelesen werden. Da diese Daten auch Verweise auf andere Speicherbereiche (sog. Pointer) enthalten können, ist es so auch möglich, bestimmte Überprüfungen zu Zugriffsrechten oder Datentypen der Zielbereiche im Speicher zu umgehen.

2.3 Neue Meltdown-Versionen

Auch im Bereich von Meltdown haben sich neue Angriffsformen ergeben. Insgesamt sechs neue Angriffsvektoren haben sich seit Juni letzten Jahres ergeben:

Meltdown-P
Dieser Angriff ist speziell auf das Ausspähen von Intel SGX-Enklaven und in erweiterter Form auf die Überwindung von Isolationsmechanismen eines Betriebssystems oder sogar Hypervisors ausgelegt. Hier können beispielsweise Funktionen bei der Nutzung des L1-Caches dazu genutzt werden, Daten aus einer SGX-Enklave zu extrahieren. Dazu wird ein bestimmtes Bit (Present Bit) im Speicher ausgenutzt, um entsprechende Speicherbereiche anzugreifen.

Im Virtualisierungsumfeld kann ein Fehler bei der Übersetzung von Gast-VM-Speicheradressen zu Speicheradressen des Virtualisierungshosts weiter dazu führen, dass eine VM vollständigen Zugriff auf den L1-Cache inkl. der Daten aus anderen VMs erhält.

Meltdown-GP
Ursprünglich von ARM entdeckt, wird hier die „Out-of-Order-Execution“ genutzt, um Instruktionen auf eigentlich nicht zugänglichen Daten auszuführen. Bevor die resultierende „General Protection Exception“ (#GP) abgefangen und behandelt wird, können hier bereits Daten extrahiert werden. Dieser Ansatz ist sehr ähnlich zur ursprünglichen Meltdown-Lücke. Hierbei können eigentlich für einen Angreifer nicht zugängliche Daten ausgespäht werden.

Meltdown-NM
Bei Meltdown-NM wird die „Faulheit“ der CPU bei einem Context Switch (z.B. dem „Umschalten“ von einer Applikation zu einer anderen) ausgenutzt. Hier sollte normalerweise der Zustand aller CPU-Funktionsblöcke gespeichert und in einen definierten Zustand überführt werden. Da dieser Zustand aber bei einigen Funktionsblöcken sehr viele Daten enthält und eine Speicherung und ein Überführen in einen definierten Zustand zeitaufwendig ist, wird dies im Allgemeinen vermieden. Sollte die Funktionseinheit doch benötigt werden, so wird eine „Device-not-available“-Exception (#NM – daher der Name) ausgelöst und erst dann der Zustand gespeichert. Durch eine geschickte Nutzung der „Out-of-Order-Execution“ ist es hier aber möglich, vor Verarbeitung der Exception die schon vorhandenen Daten auszulesen. Hierbei können eigentlich für einen Angreifer nicht zugängliche Daten ausgespäht werden.

Tabelle 1: Abkürzungen der Architekturelemente

Meltdown-RW
Ursprünglich als „Spectre V1.2“ bezeichnet, hat eine genauere Untersuchung ergeben, dass es sich hierbei um eine Ausnutzung der „Out-of-Order-Execution“ und nicht der „Speculative Execution“ handelt. Bei Meltdown-RW können Daten in der momentanen Berechtigungsstufe (z.B. User oder Kernel) unabhängig von eventuellen Lese- und Schreibrechten (Read/Write – RW) modifiziert werden, was eine Umgehung von Sandboxing-Funktionen ermöglicht, solange sich eine Software auf die CPU-Mechanismen zum Schutz des Speichers verlässt.

Meltdown-PK
Intels aktuelle Skylake-SP-Prozessorgeneration beinhaltet Funktionen zur Zugriffssteuerung auf den Arbeitsspeicher auf Applikationsebene. Durch Schwachstellen in der „Out-of-Order-Execution“ ist es allerdings möglich, auch Speicherbereiche auszulesen, für die weder Lesen noch Schreiben erlaubt sein sollte.

Meltdown-BR
Eine Bound-Range-Exception (#BR) wird normalerweise genutzt, um den Zugriff auf Daten jenseits eines Listen- bzw. Array-Endes zu verhindern. Versucht zum Beispiel eine Anwendung auf das 21. Element einer Liste mit 20 Elementen zuzugreifen, so kommt es zu dieser Exception. Sollte diese Exception allerdings im Rahmen einer „Out-of-Order-Execution“ erfolgen, so findet die Behandlung der Exception zu spät statt und erlaubt über einen Seitenkanal das Auslesen von Daten jenseits des Listenendes. Dies ist ähnlich zu Spectre-PHT und wurde ursprünglich als Spectre-Variante identifiziert, allerdings findet hier keinerlei Nutzung von Speculative Execution statt. Auch hier können eigentlich für einen Angreifer nicht zugängliche Daten ausgespäht werden.

2.4 NetSpectre – Ausnutzen von Spectre über das Netzwerk
Eine der ersten Fragen, die sich bei Entdeckung einer neuen Sicherheitslücke stellt, ist die Ausnutzung über das Netzwerk, da sich damit die Angriffsfläche deutlich erhöht. Entsprechend stellte sich diese Frage auch bei Bekanntwerden von Spectre. Forscher haben im Juli letzten Jahres einen Artikel veröffentlicht ( [4]), in dem genau dieses Szenario untersucht und eine Möglichkeit zur Ausnutzung von Spectre über ein Netzwerk gezeigt wird.

Es ergeben sich dabei glücklicherweise eine Reihe von Anforderungen und Einschränkungen, die eine einfache Ausnutzung deutlich erschweren. Zu den Anforderungen gehören:

  • Das Vorhandensein und die Ausführung einer angreifbaren CPU-Instruktionsfolge beim Empfangen eines Paketes, die ein Ausnutzen der ursprünglichen Spectre-Lücke ermöglicht. Diese Instruktionsfolge muss sich in einer realen Umgebung an irgendeiner Stelle in einem Treiber oder im Netzwerk-Stack des Betriebssystems befinden. Ein Beispiel für eine Instruktionsfolge ist die Überprüfung einer Array-Länge, wobei die Abfrage vom Angreifer manipulierbar sein muss. Zum Beispiel muss bei der Code-Abfolge

if (x < bitstream_length) if (bitstream[x]) flag = true „x“ vom Angreifer kontrollierbar sein, um die spekulative Ausführung zu trainieren und bei Erfolg „x“ auf den gewünschten Wert zu ändern.

  • Es muss ebenso wie für den Empfang des Pakets eine Instruktionsfolge vorhanden sein, die die Auswirkungen von Spectre, zum Beispiel eine Zeitverzögerung durch das Cache-Verhalten, auf Netzwerk-Ebene an den Angreifer über das Netzwerk zurückmeldet. Typische Beispiele hierfür sind Verzögerungen in der Antwortzeit von Paketen.
  • Der Angreifer muss die Möglichkeit haben, eine große Anzahl von Paketen an das Ziel zu schicken und die Antworten zu beobachten, da die Antwortzeiten nur über sehr viele Pakete gemittelt den Inhalt der zu extrahierenden Speicheradresse(n) mit ausreichender Sicherheit preisgeben. Diese Anforderung wird dadurch vereinfacht, dass die große Anzahl von Paketen nicht in kurzer Zeit übermittelt werden muss, sondern über einen beliebig langen Zeitraum verteilt werden kann.

Als maßgebliche Einschränkungen müssen hier einerseits die sehr geringe Bandbreite genannt werden, da die Informationen nur Bit-weise übertragen werden können und andererseits der starke Einfluss der zwischen Angreifer und Ziel befindlichen Netzwerk-Komponenten. Prinzipiell ist dieser Angriff nur dann möglich, wenn sich Angreifer und Ziel im selben Layer-2-Netzwerk befinden.

2.5 Spoiler
Anfang 2019 wurde eine neue Lücke in Intel-CPUs entdeckt ( [5]) die die Zuordnung zwischen dem Adressraum einer Anwendung (Virtual Address Space) und dem physischen Adressraum (Physical Address Space) des Hosts preisgeben kann. Damit ist es möglich, den genauen Standort der Daten einer Anwendung auszuspionieren. Dies ist für sich genommen kein sinnvoller Angriffsvektor, kann aber in Verbindung mit dem sog. Rowhammer-Angriff zur Modifikation von Daten in beliebigen Anwendungen genutzt werden.

Abbildung 3: Aufbau eines Arbeitsspeichermoduls (a) und Angriff auf eine „Row“ (violett) durch schnelle Änderung der benachbarten Rows (gelb) (b, [6])

Rowhammer – eine kurze Einführung
Bereits 2014 haben Sicherheitsforscher ( [3]) eine Möglichkeit gefunden, Bits im Arbeitsspeicher zu verändern. Dazu wurde die Unterteilung des (physischen) Arbeitsspeichers in Reihen (englisch: „Rows“) ausgenutzt und die Tatsache, dass jede Row regelmäßig erneuert werden muss, da Arbeitsspeicher flüchtig ist. Leert man nun den Cache und greift man nun sehr häufig schreibend (mehrere Millionen Mal pro Sekunde) auf eine oder beide benachbarte Reihen einer Zielreihe zu, so kann man reproduzierbar einzelne Bits in der Zielreihe modifizieren, wie in Abbildung 3 dargestellt. Selbst Schutzmechanismen wie ECC (Error-correcting Code, das Erkennen und wenn möglich Beheben von Bitfehlern im Arbeitsspeicher) bieten hier keinen ausreichenden Schutz.

Spoiler und Rowhammer – ein tolles Paar
Kombiniert man nun die Informationen, die man durch Spoiler erhalten hat mit einem Rowhammer-Angriff, so kann man die Speicherbereiche einer Ziel-Anwendung modifizieren und nahezu beliebigen Code unterschieben.

Gegenmaßnahmen sind zum jetzigen Zeitpunkt nicht bekannt.

3. Gegenmaßnahmen

Im Rahmen der genauen Untersuchung von Spectre und Meltdown in [2] wurden auch eine Reihe von Gegenmaßnahmen vorgestellt, die von verschiedenen Gruppen im Laufe des letzten Jahres entwickelt wurden. Diese Gegenmaßnahmen wurden für Spectre in drei und für Meltdown in zwei Bereiche unterteilt. (siehe Tabelle 2)

Tabelle 2: Klassifizierung der Gegenmaßnahmen gemäß [2]

Zu jeder dieser Maßnahmen gibt es Ansätze sowohl auf Hardware- als auch auf Software-Ebene. Eine genaue Beschreibung aller vorgeschlagenen Maßnahmen geht leider weit über den Umfang dieses Artikels hinaus. Die Maßnahmen reichen von „einfachen“ Betriebssystem-Updates bis zu einer kompletten Überprüfung der momentanen CPU-Architekturen. Dabei ergibt sich die in Tabelle 3 aufgeführte Aufteilung der Gegenmaßnahmen in Hardware- und Software-Maßnahmen. Eine genaue Zuordnung von Sicherheitslücken und Gegenmaßnahmen ist leider aufgrund der Interaktion zwischen CPU-Architekturelementen und Gegenmaßnahmen nicht möglich.

Überblick über den Stand der Gegenmaßnahmen
Natürlich arbeiten seit dem Bekanntwerden von Spectre und Meltdown sowie deren verschiedenen Versionen die CPU-Hersteller und Betriebssystem-Entwickler an der Absicherung gegen Spectre und Meltdown. Diese Entwicklungen sind in vollem Gange und die immer neuen Sicherheitslücken in CPUs werden den Fokus auf diese Arbeit in den nächsten Jahren wahrscheinlich noch verstärken.

Einerseits arbeiten die CPU-Hersteller an Architektur-Anpassungen für die zukünftigen CPU-Generationen und an Updates für aktuelle CPUs; letztere können die Lücken wahrscheinlich nicht vollständig schließen, reduzieren aber die Angriffsfläche.
Andererseits schlagen Forscher neue Möglichkeiten für die Hard- und Software vor, um die Maßnahmen der CPU-Hersteller zu ergänzen. Teilweise sind die Maßnahmen auch schon in gängigen Betriebssystemen wie Windows oder Linux umgesetzt.

Nicht jede dieser Gegenmaßnahmen behandelt jede Spectre- und/oder Meltdown-Lücke, so dass man in Zukunft eine Kombination dieser Maßnahmen erwarten sollte.

Performance-Impact der Gegenmaßnahmen
Die im letzten Abschnitt erwähnten Gegenmaßnahmen beeinflussen eine große Bandbreite von Funktionseinheiten auf Hardware-Seite und Programmabläufen auf Software-Seite.

Durch die sehr unterschiedlichen Ansätze ist auch der Einfluss auf die Performance eines Systems sehr unterschiedlich. Dazu kommt noch, dass nicht alle Gegenmaßnahmen jede Art der CPU-Nutzung gleich stark beeinflussen. Daher ist hier eine differenziertere Betrachtung notwendig.

Tabelle 3: Ebene, auf der Gegenmaßnahmen ergriffen werden können (Hard-/Software)

Zunächst muss man für die Betrachtung festhalten, dass bei den existierenden Untersuchungen zum Performance-Einfluss der Gegenmaßnahmen keine einheitliche Test-Suite existiert. So kann bei keiner der detaillierten Untersuchung mit Sicherheit gesagt werden, ob die Untersuchungsergebnisse repräsentativ sind. Insgesamt ist der Performance-Einfluss stark davon abhängig, ob eine Anwendung viele Interrupts (z.B. für Festplattenzugriffe oder Netzwerk-Traffic) benötigt oder primär Berechnungen durchführt:

  • Bei häufigen Interrupts ist der Performance-Impact am stärksten. Er erreicht je nach Maßnahme 5% bis 30%. Dabei ist der obere Wert nur dann erreichbar, wenn man die Anzahl der Interrupts künstlich maximiert.
  • Bei reinen Rechenaufgaben ist kein signifikanter Impact zu erwarten. In einigen Beispielen ist sogar eine Beschleunigung zu beobachten

Es existieren mittlerweile auch Benchmarks, die ein vollständiges Abschalten von „Out-of-Order-Execution“ und „Speculative Execution“ (sog. „Serialization“) vermessen. Dabei ergeben sich für typische, heutzutage eingesetzte Applikationen Performance-Einbußen von 62%-75%! Dieses Ergebnis sollte uns allen klar vor Augen führen, dass wir diese CPU-Features nur in absoluten Ausnahmefällen abschalten können.

4. Reale Angriffe

So erschreckend die bisherigen Darstellungen scheinen mögen, so gibt es doch auch gute Nachrichten: Bis jetzt sind noch keine Angriffe auf Basis von Spectre und Meltdown in der „realen“ Welt bekannt. So kritisch die Sicherheitslücken auch sein mögen, so kompliziert ist eine Nutzung dieser Lücken, da ein Angreifer in einem realistischen Umfeld mit sehr vielen Unbekannten zu rechnen hat und den Angriff sehr genau auf sein Ziel abstimmen muss, beispielsweise:

  • Welche Applikationen nutzt mein Ziel?
  • Mit welchen Anwendern teile ich mir das System?
  • Welche Gegenmaßnahmen werden in der Umgebung, die ich angreifen will, genutzt?
  • Wie sieht die Überwachung der Umgebung aus, die ich angreifen will?

Diese Komplexität bedeutet auf gar keinen Fall, dass diese Sicherheitslücken verharmlost werden sollen oder dass sie niemals ausgenutzt werden. Gerade Angreifer mit entsprechender finanzieller (und politischer) Unterstützung (beispielsweise Geheimdienste verschiedener Staaten) könnten diese Sicherheitslücken nutzen. Momentan gibt es aber noch genügend andere Angriffsvektoren auf den meisten zugänglichen Systemen, beispielsweise den Menschen, der sie bedient.

Je einfacher Spectre und Meltdown aber im Vergleich zu anderen Sicherheitslücken beim Ziel auszunutzen sind, desto wahrscheinlicher wird auch eine Anpassung im Verhalten des oder der Angreifer.
Wie bereits letztes Jahr dargestellt, muss der Einsatz der Gegenmaßnahmen individuell evaluiert werden:

  • Sind meine Systeme so sicher, dass Spectre und Meltdown die einfachsten Angriffsvektoren sind?
  • Besteht überhaupt die Gefahr, dass auf einem System fremder Code ausgeführt wird, der Spectre oder Meltdown ausnutzen kann?
  • Habe ich die Leistungsreserven oder die Möglichkeit, etwaige Performance-Einbrüche auszugleichen?

Hier muss eine Abschätzung stattfinden, ob ein flächendeckender Einsatz der verfügbaren Gegenmaßnahmen finanziell attraktiver ist oder eine individuelle Entscheidung für jedes System, das sich im Einsatz befindet.

5. Fazit

Mit den neuen Sicherheitslücken, den Gegenmaßnahmen und dem Einfluss auf die Performance ergibt sich ein großes Feld für Forscher und Entwickler gleichermaßen, indem man gemeinsam Lösungen für Spectre und Meltdown finden muss.

Für die im Einsatz befindlichen CPUs ist die Wahrscheinlichkeit eines Angriffs gering. Die größte Gefahr im Umfeld von Spectre und Meltdown geht aufgrund der Komplexität und der genauen Abstimmung auf das Angriffsziel von staatlichen Angreifern aus. Trotzdem sollten – entweder flächendeckend oder individuell für jedes System entschieden – die verfügbaren Patches für CPU und Betriebssystem eingespielt werden. Systeme, deren CPU sehr stark ausgelastet sind, müssen dann evtl. erweitert werden, da die Performance-Einbußen in vielen Fällen leider spürbar sind.

Eine Veröffentlichung von Google [7] und der entsprechende Kommentar durch die Technik-News-Seite The Register [8] beschreiben eindrucksvoll, wie die Komplexität moderner CPUs eine notwendige Begleiterscheinung für die enormen Performance-Zuwächse der letzten 20 Jahren ist. Durch die enorme Komplexität und die Limitierungen der bisher hierfür genutzten Modelle hat sich aber eine Reihe von Interaktionen ergeben, die bisher nicht berücksichtigt wurden. Erst jetzt, nach 20 Jahren, bemerkt man Aspekte, die man lange Zeit nicht gesehen hat – wahrscheinlich nicht sehen konnte.

Selbst mit den von Intel und anderen CPU-Herstellern angekündigten Anpassungen an der Architektur und den immer zahlreicheren Mechanismen in Software müssen wir leider damit rechnen, dass Spectre und Meltdown uns noch eine lange Zeit begleiten werden. Es bleibt nur zu hoffen, dass die Angriffe auf Basis von Spectre und Meltdown auch weiterhin enorme Hürden aufweisen und unverhältnismäßig komplex im Gegensatz zu anderen Angriffen sein werden. Die Kehrseite dieser Aussage ist natürlich, dass es um die Sicherheit an anderen Stellen noch schlechter bestellt ist.

Literaturverzeichnis

[1] M. Ermes, „Neue Prozessoren braucht das Land – Sicherheitsfeatures und -lücken in modernen Prozessor-Architekturen,“ ComConsult Research GmbH, 2018.

[2] C. Canella, J. Van Bulck, M. Schwarz und M. Lipp, „A Systematic Evaluation of Transient Execution Attacks and Defenses,“ arXiv.org, 20 Februar 2019.

[3] Y. Kim, R. Daly, J. Kim, C. Fallin, J. H. Lee, D. Lee, C. Wilkerson, K. Lai, Mutlu und Omur, „Flipping bits in memory without accessing them: An experimental study of DRAM disturbance errors,“ ACM SIGARCH Computer Architecture News, Vol. 42, pp. 361-372, 2014.

[4] M. Schwarz, M. Schwarzl, M. Lipp und D. Gruss, „NetSpectre: Read Arbitrary Memory over Network,“ arXiv: 1807.10535v1, 27 Juli 2018 .

[5] S. Islam, A. Moghimi, I. Bruhns, M. Krebbel, B. Gulmezoglu, T. Eisenbarth und B. Sunar, „SPOILER: Speculative Load Hazards Boost Rowhammer and Cache Attacks,“ arXiv: 1903.00446v1, 1 März 2019.

[6] Dsimic, „Wikimedia Commons,“ 11 November 2015. [Online]. Available: https://commons.wikimedia.org/w/index.php?curid=38868341. [Zugriff am 25 März 2019].

[7] Google, „Spectre is here to stay – An analysis of side-channels and speculative execution,“ arXiv: 1902.05178v1, 14 Februar 2019.

[8] T. Claburn, „The Register,“ Situation Publishing, 18 Februar 2019. [Online]. Available: https://www.theregister.co.uk/2019/02/18/spectre_cant_be_killed/. [Zugriff am 20 März 2019].

[9] A. e. a. Prout, „Measuring the Impact of Spectre and Meltdown,“ arXiv: 1807.08703, 23 Juli 2018.

Der Netzwerk Insider gehört mit seinen Produkt- und Markt-Bewertungen rund um IT-Infrastrukturen zu den führenden deutschen Technologie-Magazinen. Der Bezug des Netzwerk Insiders ist kostenlos.

© Copyright - ComConsult