Meltdown/Spectre

Überblick

Am 3. Januar wurden bei Project Zero Sicherheitslücken in modernen CPUs aufgedeckt, mit denen ein Prozess im schlimmsten Fall beliebigen Arbeitsspeicher lesen kann – einschließlich Arbeitsspeicher, der nicht zu diesem Prozess gehört. Diese Sicherheitslücken heißen Spectre und Meltdown. Wie trägt Chrome dazu bei, das Web zu schützen, und was sollten Webentwickler für ihre eigenen Websites tun?

Kurzfassung; DR

Wenn Sie im Web surfen, sollten Sie dafür sorgen, dass Ihr Betriebssystem und Ihr Browser auf dem neuesten Stand sind. Darüber hinaus haben Chrome-Nutzer die Möglichkeit, die Website-Isolierung zu aktivieren.

Wenn Sie Webentwickler sind, empfiehlt das Chrome-Team:

  • Verhindern Sie nach Möglichkeit, dass Cookies in den Arbeitsspeicher des Rendererprozesses gelangen, indem Sie die Cookie-Attribute SameSite und HTTPOnly verwenden und nicht aus document.cookie lesen.
  • Achten Sie darauf, dass Ihre MIME-Typen korrekt sind, und geben Sie einen X-Content-Type-Options: nosniff-Header für alle URLs mit nutzerspezifischen oder vertraulichen Inhalten an, um die Cross-Origin-Leseblockierung für Nutzer, die die Website-Isolierung aktiviert haben, optimal zu nutzen.
  • Aktivieren Sie die Website-Isolierung und teilen Sie dem Chrome-Team mit, ob sie Probleme auf Ihrer Website verursacht.

Wenn Sie wissen möchten, warum diese Schritte hilfreich sind, lesen Sie weiter.

Das Risiko

Es gibt viele verschiedene Erklärungen für diese Sicherheitslücken, sodass ich keine weitere hinzufügen werde. Wenn Sie daran interessiert sind, wie diese Sicherheitslücken ausgenutzt werden können, empfehle ich Ihnen den Blogpost meiner Kollegen aus dem Google Cloud-Team.

Sowohl Meltdown als auch Spectre ermöglichen möglicherweise einen Prozess zum Lesen des Arbeitsspeichers, den er nicht lesen sollte. Manchmal können mehrere Dokumente von verschiedenen Websites einen Prozess in Chrome gemeinsam nutzen. Dies kann passieren, wenn der Nutzer die andere Datei über window.open, <a href="..." target="_blank"> oder iFrames geöffnet hat. Wenn eine Website nutzerspezifische Daten enthält, besteht die Möglichkeit, dass eine andere Website diese neuen Sicherheitslücken verwendet, um diese Nutzerdaten zu lesen.

Risikominderungen

Das Chrome- und V8-Entwicklerteam ergreift zahlreiche Maßnahmen, um diese Bedrohung einzudämmen.

Website-Isolierung

Die Auswirkungen der erfolgreichen Ausnutzung von Spectre können stark reduziert werden, indem verhindert wird, dass sensible Daten jemals einen Prozess mit von Angreifern gesteuertem Code teilen. Das Chrome-Team hat hierfür eine Funktion namens Website-Isolierung entwickelt:

Die Website-Isolierung wurde aufgrund einiger bekannter Probleme noch nicht standardmäßig aktiviert und das Chrome-Team würde gerne möglichst viele Praxistests durchführen. Als Webentwickler sollten Sie die Website-Isolierung aktivieren und prüfen, ob Ihre Website weiterhin funktioniert. Wenn du den Dienst jetzt aktivieren möchtest, aktiviere chrome://flags#enable-site-per-process. Wenn Sie eine Website finden, die nicht funktioniert, melden Sie den Fehler und geben Sie dabei an, dass Sie die Website-Isolierung aktiviert haben.

Websiteübergreifende Dokumentblockierung

Auch wenn alle websiteübergreifenden Seiten separaten Prozessen zugeordnet sind, können Seiten dennoch einige websiteübergreifende Unterressourcen wie Bilder und JavaScript anfordern. Um zu verhindern, dass vertrauliche Informationen diese Informationen offenlegen, umfasst die Website-Isolierung die Funktion zur websiteübergreifenden Dokumentblockierung, die einschränkt, welche Netzwerkantworten an den Renderer-Prozess gesendet werden.

Eine Website kann zwei Datentypen von einem Server anfordern: „Dokumente“ und „Ressourcen“. Dokumente sind hier HTML-, XML-, JSON- und Textdateien. Eine Website kann Dokumente aus ihrer eigenen Domain oder aus anderen Domains mit freizügigen CORS-Headern empfangen. Zu den Ressourcen gehören Dinge wie Bilder, JavaScript, CSS und Schriftarten. Ressourcen können von jeder Website eingebunden werden.

Die websiteübergreifende Richtlinie zum Blockieren von Dokumenten verhindert in den folgenden Fällen, dass ein Prozess „Dokumente“ von anderen Quellen empfängt:

  1. Sie haben den MIME-Typ HTML, XML, JSON oder Text/Nur
  2. Sie haben entweder einen X-Content-Type-Options: nosniff-HTTP-Antwortheader oder eine schnelle Inhaltsanalyse („Sniffing“) bestätigt, dass der Typ korrekt ist.
  3. CORS erlaubt den Zugriff auf das Dokument nicht explizit

Dokumente, die durch diese Richtlinie blockiert werden, werden dem Prozess als leer angezeigt, obwohl die Anfrage weiterhin im Hintergrund ausgeführt wird.

Beispiel: Ein Angreifer erstellt ein <img>-Tag, das eine JSON-Datei mit sensiblen Daten wie <img src="https://yourbank.com/balance.json"> enthält. Ohne die Website-Isolierung würde der Inhalt der JSON-Datei im Arbeitsspeicher des Renderer-Prozesses ankommen. Dann stellt der Renderer fest, dass es sich nicht um ein gültiges Bildformat handelt, und rendert kein Bild. Mit Spectre gibt es jedoch jetzt eine Möglichkeit, diesen Speicherblock möglicherweise zu lesen. Durch die Blockierung von websiteübergreifenden Dokumenten wird verhindert, dass der Inhalt dieser Datei jemals in den Arbeitsspeicher des Prozesses gelangt, in dem der Renderer ausgeführt wird, da der MIME-Typ durch die websiteübergreifende Dokumentblockierung blockiert wird.

Laut Nutzermesswerten gibt es viele JavaScript- und CSS-Dateien, die mit den MIME-Typen text/html oder text/plain bereitgestellt werden. Um zu vermeiden, dass Ressourcen blockiert werden, die versehentlich als Dokumente markiert wurden, versucht Chrome, die Antwort zu prüfen, um sicherzustellen, dass der MIME-Typ korrekt ist. Dieses Sniffing ist nicht perfekt. Wenn Sie also sicher sind, dass Sie die richtigen Content-Type-Header auf Ihrer Website festlegen, empfiehlt das Chrome-Team, allen Antworten den Header X-Content-Type-Options: nosniff hinzuzufügen.

Wenn Sie die websiteübergreifende Dokumentblockierung ausprobieren möchten, aktivieren Sie die Website-Isolierung wie oben beschrieben.

SameSite Cookies

Kehren wir zum obigen Beispiel zurück: <img src="https://yourbank.com/balance.json">. Dies funktioniert nur, wenn yourbank.com ein Cookie gespeichert hat, mit dem der Nutzer automatisch angemeldet wird. Cookies werden normalerweise für alle Anfragen an die Website gesendet, die das Cookie setzt – auch wenn die Anfrage von einem Drittanbieter mit einem <img>-Tag gestellt wird. SameSite-Cookies sind ein neues Attribut, das angibt, dass ein Cookie nur an eine Anfrage angehängt werden soll, die von derselben Website stammt, daher auch der Name. Zum Zeitpunkt der Erstellung dieses Dokuments wird dieses Attribut nur in Chrome und Firefox 58 oder höher unterstützt.

HTTPOnly und document.cookie

Werden die Cookies Ihrer Website nur serverseitig und nicht von Client-JavaScript verwendet, gibt es Möglichkeiten, zu verhindern, dass die Daten des Cookies in den Renderer-Prozess gelangen. Sie können das Cookie-Attribut HTTPOnly festlegen, das den Zugriff auf das Cookie über clientseitiges Script in unterstützten Browsern wie Chrome explizit verhindert. Wenn die Einstellung HTTPOnly nicht möglich ist, können Sie die Offenlegung des Ladens von Cookie-Daten für den gerenderten Prozess begrenzen. Lesen Sie dazu document.cookie nur, wenn es unbedingt erforderlich ist.

Wenn Sie mit target="_blank" eine Verknüpfung zu einer anderen Seite erstellen, hat die geöffnete Seite Zugriff auf Ihr window-Objekt und kann von Ihrer Seite zu einer anderen URL wechseln. Ohne Website-Isolierung funktioniert die Website-Isolierung nicht wie Ihre Seite. Zum besseren Schutz deiner Seite sollten Links zu externen Seiten, die in einem neuen Fenster geöffnet werden, immer rel="noopener" angeben.

Timer mit hoher Auflösung

Um Meltdown oder Spectre auszunutzen, muss ein Angreifer messen, wie lange es dauert, einen bestimmten Wert aus dem Speicher zu lesen. Dazu ist ein zuverlässiger und genauer Timer erforderlich.

Eine API, die die Webplattform anbietet, ist performance.now(), das auf 5 Mikrosekunden genau eingestellt ist. Zur Entschärfung haben alle gängigen Browser die Auflösung von performance.now() verringert, um das Ausführen der Angriffe zu erschweren.

Eine andere Möglichkeit, einen Timer mit hoher Auflösung zu erhalten, ist die Verwendung eines SharedArrayBuffer. Der Zwischenspeicher wird von einem dedizierten Worker verwendet, um einen Zähler zu erhöhen. Der Hauptthread liest diesen Zähler und verwendet ihn als Timer. Vorerst haben Browser entschieden, SharedArrayBuffer zu deaktivieren, bis andere Gegenmaßnahmen vorliegen.

V8

Zum Ausnutzen von Spectre ist eine speziell entwickelte Abfolge von CPU-Anweisungen erforderlich. Das V8-Team hat Maßnahmen zur Risikominderung für bekannte Proofs of Concepts für Angriffe implementiert und arbeitet an Änderungen an dem optimierenden Compiler TurboFan, durch den der generierte Code auch bei Auslösung dieser Angriffe sicher wird. Diese Änderungen an der Codegenerierung können jedoch zu Leistungseinbußen führen.

Mehr Sicherheit im Web

Die Entdeckung von Spectre und Meltdown und deren Auswirkungen war viel unsicher. Ich hoffe, dieser Artikel hat Ihnen ein besseres Bild davon gemacht, was die Chrome- und V8-Teams tun, um die Webplattform zu schützen, und wie Webentwickler vorhandene Sicherheitsfunktionen nutzen können. Bei Fragen können Sie sich gern über Twitter an mich wenden.