
Der Spuk ist noch nicht vorbei
Dieser Beitrag soll einen einfachen Einblick in die digitalen Sicherheitslücken Meltdown und Spectre geben und Tipps bereithalten, wie man sich gegen beide Angriffsszenarien schützen kann. Der Beitrag richtet sich an technikinteressierte Personen, die ein Verständnis von der Thematik entwickeln möchten.
Hintergrund
Anfang dieses Jahres 2018 wurden zwei IT-Sicherheitslücken bekannt, die für viel Aufsehen gesorgt haben: Meltdown und Spectre. So bezeichnete sie bspw. Heise Security als die wahrscheinlich größten Sicherheitslücken der letzten zwanzig Jahre. Die FAZ schrieb Eine der größten Sicherheitslücken in der Geschichte der IT-Industrie. Bruce Schneier, ein führender US-amerikanischer Experte für Kryptographie und Computersicherheit nennt die Angriffe eine neue Klasse von Schwachstellen. Relativ drastische Aussagen. Aber warum sind diese Attacken eigentlich so gefährlich?
Was ist Meltdown?
Der Angriff Meltdown, zu Deutsch etwa „Kernschmelze“ oder „Nervenzusammenbruch“, beseitigt alle Barrieren, die auf einem Computer normalerweise durch das Betriebssystem gesetzt sind. Anschließend kann ein Schadprogramm sämtliche im Rechenspeicher hinterlegten Daten mitlesen.
Um eine solche Korrumpierung der Datenintegrität zu verhindern, ziehen Prozessoren normalerweise Zugriffsgrenzen, die mit dem Schutz der Privatsphäre zu vergleichen sind: Ein Programm sollte keinesfalls auf die Daten eines anderen Programmes zugreifen können, damit sensible Informationen nicht dort gestreut werden, wo sie nichts verloren haben. Enthält ein Programm z. B. Kreditkarteninformationen, können diese normalerweise nicht von einem anderen Programm mitgelesen werden. Das Gleiche gilt für Passwörter, PINS, TANS und dergleichen mehr. Meltdown schmilzt diesen Schutz ein, so dass freie Sicht auf alle Programme und Daten entsteht.
Vor dem Hintergrund von Meltdown sind übrigens auch Passwortmanager nicht ausreichend sicher, da die Passwörter hier in der Zwischenablage gespeichert werden und so einem potenziellen Angriff aus dem virtuellen Raum ausgesetzt werden. Die Gefahr potenziert sich in der Cloud. Denn Cloudanbieter stellen ja nicht nur virtuelle Server bereit, welche Daten ausnahmslos im digitalen Raum verarbeiten und hosten, sie organisieren diese Server auch in Serverclustern bzw. Serverfarmen, die Daten von Nutzern aus aller Welt beherbergen. Wenn auf einer solchen Virtualisierungslösung der Prozessor von Meltdown betroffen ist, können die Daten ganzer Serverlandschaften von Cyberkriminellen mitgelesen werden.
Was ist Spectre?
Während sich die Verbreitung von Meltdown vornehmlich auf Prozessoren des Herstellers Intel beschränkt, betrifft Spectre die Prozessoren aller Hersteller und aller Baureihen.
Spectre, zu Deutsch „Gespenst“ oder „Phantom“, ist im Kern ähnlicher Natur wie Meltdown, allerdings können hier nur Daten innerhalb eines Programms ausgelesen werden – also z. B. die eines Browsers mit mehreren offenen Browserfenstern. Befindet sich darunter ein Tab, unter dem eine verseuchte Seite geöffnet ist, kann dieser Tab alle anderen offenen Seiten mitlesen – inkl. solche, auf denen der Nutzer mit sensiblen Daten operiert, beim Onlinebanking etwa oder beim Onlineshoppen. Der neugierige Schadcode kann dabei beispielsweise in einer Werbung versteckt sein, die der Nutzer selbst für unverdächtig hält.
Einer der Gründe, warum die Lücke „Gespenst“ getauft wurde, ist, dass sie nicht so einfach zu fangen aka zu schließen ist, weil sie sich extrem schwer lokalisieren lässt. Zur Schließung ist deshalb ein komplettes Redesign der Prozessorarchitekturen und Umprogrammierung der Software notwendig.
Allerdings ist Spectre wesentlich komplexer durchzuführen als Meltdown. Für einen erfolgreichen Angriff müssen nämlich zunächst bestimmte Muster im Zielprogramm identifiziert werden, bevor ein Angriff durchgeführt werden kann – und das ist je nach Sicherheitsgrad des Codes gar nicht so leicht.
So greifen Meltdown und Spectre an
Zum Bauen von Meltdown und Spectre wurden zwei grundlegende Komponenten genutzt, die in modernen Computern eigentlich zur Prozessbeschleunigung eingebaut wurden: die Out-of-order Execution und das Caching.
Out-of-order Execution
Die erste Komponente, die Out-of-order Execution, wird auch Speculative Execution genannt.
Hintergrund: Moderne Prozessoren berechnen Instruktionen voraus. Das tun sie, um Verzögerungen zu überbrücken und um Daten schneller prozessieren zu können. Der Prozessor sorgt dann dafür, dass die vorausberechneten Instruktionen in der richtigen Reihenfolge abgearbeitet und die betreffenden Befehle ausgeführt werden. Bei dieser Vorausberechnung werden Annahmen getroffen: Das können Bedingungen im Code ebenso sein wie Bedingungen in der Hardware. Es wird also geschaut „Was könnte als nächstes ausgeführt werden?“ und der Prozessor wählt dann diesen Weg, um „vorzudenken“.
Sind die Annahmen richtig, so übernimmt er einfach die vorausberechneten Instruktionen. Sind die Annahmen falsch, so werden alle vorausberechneten Daten wieder rückgängig gemacht – bis zu dem Punkt, wo die Annahmen offensichtlich falsch waren. An dieser Stelle muss der Prozessor dann eine Verzögerung hinnehmen, bis alle vorausberechneten Instruktionen rückgängig gemacht worden sind, um anschließend von dort aus korrekt weiter verfahren zu können.
Annahmen können unterschiedlicher Natur sein. Eine Annahme ist z. B., dass der aktuelle Code auf eine bestimmte Speicheradresse zugreifen wird. Eine weitere Annahme sind Sprungbefehle. Dabei wird davon ausgegangen, dass zu einer bestimmten Speicheradresse gesprungen wird. Sprünge können direkt durchgeführt werden oder auch auf Basis von Bedingungen wie etwa Speicherinhalten. Hier ein bedingter Sprung, zum Verständnis für Nichtprogrammierer in Pseudocode:
wenn ( x < y ) mache { Abschnitt 1 } ansonsten { Abschnitt 2 }
Der Prozessor trifft also eine Entscheidung über x, auf deren Grundlage er dann spekulativ Abschnitt 1 oder 2 vorberechnet.
Caching
Die zweite Komponente, die von Meltdown und Spectre missbraucht wird, ist das so genannte Caching. Gemeint ist damit der Einsatz eines kleineren Speichers, der näher am Prozessor liegt als der Hauptspeicher und dadurch wesentlich schneller erreichbar und auslesbar ist. Benötigt der Prozessor Daten, schaut er zunächst im Cache nach – nur, wenn er dort nicht fündig wird, muss er sie aus dem Hauptspeicher laden, legt sie dann aber auch gleich im Cache ab, wo er schnelleren Zugriff darauf hat (da der Cache kleiner ist als der Hauptspeicher, werden ältere Daten überschrieben, wenn sie lange nicht mehr benutzt wurden). Ein Angreifer kann sich diesen beschleunigten Zugriff zunutze machen, um gecachte von ungecachten Daten zu unterscheiden.
Verwendung der Bausteine
Werden nun Instruktionen über die Out-of-order Execution vorausberechnet und dabei gleichzeitig gecacht, so sind die Ergebnisse dieser Berechnung im Cache auch dann vorhanden, wenn diese in umgekehrter Reihenfolge wieder zurückgesetzt werden muss.
Durch Meltdown und Spectre hat sich gezeigt, dass, wenn man den Cache entsprechend präpariert, Ergebnisse, die eigentlich nicht verfügbar sein dürften, in diesem Cache zwischengespeichert werden und dann unbefugt ausgelesen werden können. Wenn man es nun schafft, den Prozessor zu falschen Annahmen zu verleiten oder den Zugriff auf vertrauliche Speicherbereiche nicht hardwareseitig schützt, wird spekulativ Code ausgeführt, der nicht ausgeführt werden dürfte, dann im Cache zwischengespeichert und Angreifern so auf dem Silbertablett serviert.
Auslesen des Caches
Der Cache kann dabei folgendermaßen ausgelesen werden:
- Zunächst löscht der Angreifer alle Daten im Cache, bei Intel-Prozessoren mithilfe eines bestimmten Befehls (clflush), ansonsten indem er alle Daten im Cache mit gleichen Werten überschreibt.
- Danach führt der Angreifer Code aus, der auf einen bestimmten Speicherbereich zugreift, auf den er eigentlich keinen Zugriff haben dürfte. Wie genau das Umlenken im Detail funktioniert, ist je nach Angriffsart unterschiedlich – siehe dazu mehr in den nachfolgenden Abschnitten.
- Die ausgelesenen Daten werden dann in einem Speicherkonstrukt zwischengespeichert, welches so konstruiert ist, dass man anhand des abgelegten Platzes auf den Wert schließen kann – auch hierzu gleich mehr.
- Der Angreifer liest den Cache an der Stelle aus, wo das Speicherkonstrukt zwischengespeichert wurde. Eine der Positionen ist dabei schneller erreichbar als die anderen – diese Position muss ergo der zwischengespeicherte Wert sein, da er als einziger im Cache abgelegt wurde (vgl. konstruierte Abbildung 1).
- Anhand der Position im Speicherkonstrukt kann auf den tatsächlichen Wert geschlossen werden.

Zunächst bereinigt der Angreifer also einen bestimmten Speicherbereich im Cache – z. B. mithilfe spezieller Cache-Instruktionen, die den anvisierten Bereich leeren. Ist der Cache an dieser Stelle geleert, kann er in der folge beobachten, dass genau an der Stelle des gelöschten Eintrags der Cache nun einen neuen Eintrag enthält. Anschließend kann er von dieser Stelle im Cache ausgehend auf den echten Wert schließen. Wird nun ein Bytewert aus einem verbotenen Speicherbereich gesucht, kann er folgendermaßen im Cache abgelegt werden:
- Bytewert aus verbotenem Speicher lesen
- Ergebnis „verbotener Wert“ liegt zwischen 0 und 255
- Zugriff auf Array (verbotener Wert)
- Dieser Feldeintrag ist nun anstelle des verbotenen Werts im Cache zwischengespeichert
- Durchgang aller Einträge pro Feld im Cache und Messung der Zeit
- Die Stelle, die schneller ausgelesen wird, ist der gesuchte Wert
Beispiel:
Der Wert an verbotener Stelle wurde ausgelesen: Verbotener Wert = 3.
Nach Schritt 4 sieht der Cache an der Stelle des Arrays wie folgt aus:
- Array [0] = geleert
- Array [1] = geleert
- Array [2] = Eintrag vorhanden
- Array [3] = geleert
Umlenken der Out-of-order Execution
Am Ende muss der Prozessor nur noch dazu gebracht werden, Code auszuführen, den der Angreifer ausführen möchte. Das Vorgehen von Meltdown unterscheidet sich hier von Spectre:
Meltdown
Meltdown greift direkt auf eine Speicheradresse zu, die der Angreifer auslesen möchte. Die auftretenden Fehler fängt der Angreifer durch eine Ausnahmebehandlung ab. Bevor diese Ausnahmebehandlung jedoch in Kraft tritt, wird der Wert wie im letzten Abschnitt beschrieben zwischengespeichert und ausgelesen, so dass der Angreifer darauf zugreifen kann.
Spectre
Bei Spectre „trainiert“ der Angreifer den Prozessor vor dem Angriff mit bestimmten Werten, so dass diese in der spekulativen Ausführung verwendet werden. Spectre stellt dabei zwei Angriffsvarianten vor, welche die falsch vorbelegte spekulative Ausführung ausnutzen:
Bedingte Verzweigungen
Findet der Angreifer folgenden Code beim Opfer, so „trainiert“ der Angreifer den Prozessor mit gültigen Werten:
wenn ( x < array1_size ) y = array2[array1[x] * 256];
Er ruft wiederholt diesen Codeschnipsel mit Werten für x auf, die kleiner sind als array_size, so dass die spekulative Ausführung davon ausgeht, dass x nicht größer sein wird und die Bedingung somit erfüllt ist.
Beim eigentlichen Angriff verwendet der Angreifer dann einen eigentlich ungültigen Wert von x größer oder gleich array1_size und greift damit über die spekulative Ausführung auf den Speicher zu. Die spekulative Ausführung nimmt irrtümlicherweise die Bedingung als wahr an und liest eine Speicheradresse aus, die in Bereichen liegt, die eigentlich nicht für den Zugriff gedacht sind.
Indirekte Sprünge
Eine zweite Angriffsvariante, neben den bedingten Verzweigungen, verläuft über indirekte Sprünge: Indirekte Sprünge sind Befehle, die von Variablen abhängen. In diesen Variablen steht eine neue Adresse, zu der der Prozessor zur Laufzeit des Programmes springt. Programme nutzen solche Sprünge nicht nur häufig, oft ist der Inhalt der Variable auch von externen Eingaben abhängig, so dass der Angreifer das Ziel eines Sprunges selbst wählen und ansteuern kann.
Um diese Sprünge ausnutzen zu können, braucht der Angreifer nun eine Zieladresse, an der er mithilfe einer zweiten, von ihm kontrollierten Variablen, Daten aus dem Speicher auslesen kann. Auch wenn er nicht selbst auf diese Zieladresse zugreifen kann, kann er den Prozessor doch mit dieser Adresse so „vortrainieren“, dass dieser spekulativ davon ausgeht, dass die betreffende Adresse wieder angesprungen werden möchte. Im Angriffsschritt lässt der Angreifer diesen Code nun über die Out-of-Order Execution und den Cache-Seitenkanal an der Zieladresse ausführen und erhält somit eine weitere Möglichkeit, Speicher in Bereichen auszulesen, auf die er eigentlich nicht zugreifen darf.
Empfehlungen zum Schutz
Nachdem die Angriffe erklärt sind, stellt sich nun die Frage, wie man sich dagegen schützen kann. Allgemein ist zu empfehlen, Updates zeitnah einzuspielen. Das betrifft Software- ebenso wie Firmwareupdates.
Software
Allgemein gilt: Software möglichst automatisiert aktualisieren! Dazu zählt das Betriebssystem, der Browser und alle anderen Anwendungen. Dies mindert insbesondere die Gefahren, welche durch Spectre auftreten.
Firmware
Insbesondere für Meltdown sind aktuelle Firmwareupdates der Betriebssystemhersteller einzuspielen:
- Apple: Apple-Nutzer sollten die Updates aus dem App-Store einspielen. Die Microcode-Updates kommen hier als Firmware-Updates herein.
- Linux : Hier werden Microcode-Updates durch den Kernel gebootet. Das heißt, man sollte auf das Einspielen dieser Neuerungen achten.
- Windows: Windows hat nur die Möglichkeit von Software-Updates, welche immer aktuell gehalten werden sollten. Die Microcode-Patches müssen über das BIOS/UEFI eingespielt werden. Die Chiphersteller haben die Korrekturen an die BIOS/UEFI-Hersteller ausgeliefert, welche wiederum Patches zur Verfügung stellen.
Hierbei sollte man genauer hinschauen. Die Hersteller ziehen in unterschiedlicher Geschwindigkeit und Qualität nach. Besser ist es, schon vorher zu recherchieren, ob andere Nutzer bereits erfolgreich so etwas eingespielt haben.
Zusammenfassung
Alle drei Angriffsvarianten von Meltdown sowie die beiden Varianten von Spectre nutzen Performance-Features moderner Prozessoren aus. Die Lücken befinden sich in der Tiefe moderner Computer-Hardware.
Meltdown ist indes leichter zu beheben, indem aktuelle Versionen der Firmware von Intelprozessoren eingespielt werden.
Spectre hingegen wird uns aufgrund der Komplexität wahrscheinlich noch ein paar Jahre verfolgen. Prozessorenhersteller bringen Patches heraus, deren Instruktionen erst von den Softwareherstellern aufgegriffen werden müssen. Diese versuchen zunächst sich durch Maßnahmen innerhalb der Software zu schützen, die Vermeidung spekulativer Ausführungen etwa, was wiederum zu Performance-Verlusten auf den Computern mit Updates führen kann.
Anfang Mai 2018 wurden acht neue Spectre-Lücken gemeldet – zunächst ohne weitere Informationen zu den Details. Eine dieser Lücken soll wesentlich schwerwiegender als Spectre und dazu einfacher durchzuführen sein, weswegen man auch von Spectre Next Generation spricht. Die Veröffentlichung der konkreten Angriffsvarianten wurde auf Bitte von Intel zunächst verschoben; es sollen vier als „medium“ und vier als „high“ eingestufte Lücken sein. Bis Mitte Juni veröffentlichte Intel dann erste Details zu drei der Medium-Findings, die richtig gefährlichen Varianten lassen noch auf sich warten. Die bisher bekannten haben alle ein ähnliches Vorgehen wie Spectre: Sie verwenden Out-of-Order Executions und über unterschiedliche Hardware-Komponenten Seitenkanalangriffe.
Letztendlich hat sich die durch den Namen gesetzte Prophezeiung des „Gespenstes“ bewahrheitet. Und es ist äußerst fraglich, ob dies das Ende der Fahnenstange ist. Vielmehr werden in Zukunft mit hoher Wahrscheinlichkeit weitaus mehr Lücken dieser Art aufkommen. Das Prozessordesign muss deshalb fundamental neu überdacht werden, um diesen Gefahren Herr zu werden. Die Aussage von Bruce Schneier vom Anfang dieses Beitrags bestätigt sich immer mehr. Die Prozessoren der Zukunft müssen von Grund auf neu designt werden: mit dem Fokus auf Sicherheit – von Anfang an.
Weiterführendes Material
Weitere interessante Informationen zu Meltdown und Spectre:
Empfehlungen der Redaktion: Interessenten zum Thema IT-Security möchten wir außerdem folgende Beiträge empfehlen: Live Hacking. Warum IT-Security erfolgsrelevant ist und Social Engineering. Was tun gegen digitalen und analogen Trickbetrug?