Meltdown/Spectre

Überblick

Am 3. Januar hat Project Zero Sicherheitslücken in modernen CPUs aufgedeckt, die ein Prozess verwenden kann, um im schlimmsten Fall beliebige Arbeitsspeicher zu lesen, einschließlich Arbeitsspeicher, der nicht zu diesem Prozess gehört. Diese Sicherheitslücken wurden als Spectre und Meltdown bezeichnet. Wie trägt Chrome zum Schutz des Webs bei und was sollten Webentwickler für ihre eigenen Websites tun?

Zusammenfassung

Wenn Sie im Web surfen, sollten Sie Ihr Betriebssystem und Ihren Browser auf dem neuesten Stand halten. Außerdem können Chrome-Nutzer die Website-Isolierung aktivieren.

Wenn Sie Webentwickler sind, berät das Chrome-Team:

  • Verhindern Sie nach Möglichkeit, dass Cookies in den Arbeitsspeicher des Renderer-Prozesses gelangen, indem Sie die Cookie-Attribute SameSite und HTTPOnly verwenden und das Lesen von document.cookie vermeiden.
  • Achten Sie darauf, dass Ihre MIME-Typen korrekt sind, und geben Sie für URLs mit nutzerspezifischen oder vertraulichen Inhalten einen X-Content-Type-Options: nosniff-Header an, um die Cross-Origin Read Blocking für Nutzer, die die Website-Isolierung aktiviert haben, optimal zu nutzen.
  • Aktivieren Sie die Website-Isolierung und informieren Sie das Chrome-Team, wenn dadurch Probleme auf Ihrer Website auftreten.

Wenn Sie wissen möchten, warum Ihnen diese Schritte weiterhelfen, lesen Sie weiter.

Das Risiko

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

Sowohl Meltdown als auch Spectre ermöglichen möglicherweise einem Prozess, Arbeitsspeicher zu lesen, in dem er nicht in der Lage sein sollte. Es kann vorkommen, dass mehrere Dokumente von verschiedenen Websites einen Prozess in Chrome gemeinsam nutzen. Dies kann passieren, wenn der eine den anderen mit 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 zum Lesen dieser Nutzerdaten verwendet.

Abwehrmaßnahmen

Das Entwicklerteam von Chrome und V8 unternimmt mehrere Anstrengungen, um diese Bedrohung zu minimieren.

Website-Isolierung

Die Auswirkungen einer erfolgreichen Ausnutzung von Spectre können erheblich reduziert werden, indem verhindert wird, dass sensible Daten jemals einen Prozess mit von einem Angreifer kontrolliertem Code teilen. Das Chrome-Team hat an einer Funktion namens Website-Isolierung gearbeitet, die dieses Ziel ermöglicht:

Die Website-Isolierung ist noch nicht standardmäßig aktiviert, da es einige bekannte Probleme gibt und das Chrome-Team gern möglichst viele Feldtests möchte. Als Webentwickler sollten Sie die Website-Isolierung aktivieren und prüfen, ob Ihre Website weiterhin funktioniert. Wenn Sie sie jetzt aktivieren möchten, aktivieren Sie chrome://flags#enable-site-per-process. Wenn Sie eine Website finden, die nicht funktioniert, helfen Sie uns bitte, indem Sie einen Fehler melden und erwähnen Sie, dass Sie die Website-Isolierung aktiviert haben.

Websiteübergreifende Dokumentblockierung

Selbst wenn alle websiteübergreifenden Seiten in separaten Prozessen platziert werden, können Seiten trotzdem einige websiteübergreifende Unterressourcen wie Bilder und JavaScript anfordern. Um zu verhindern, dass vertrauliche Informationen diese Informationen offenlegen, enthält die Website-Isolierung eine Funktion zur websiteübergreifenden Blockierung von Dokumenten, die begrenzt, welche Netzwerkantworten an den Renderer-Prozess gesendet werden.

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

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

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

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

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

Laut Nutzermesswerten werden viele JavaScript- und CSS-Dateien mit den MIME-Typen text/html oder text/plain gesendet. Damit Ressourcen, die versehentlich als Dokumente markiert werden, nicht blockiert werden, versucht Chrome, die Antwort auszulesen, 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 Ihren Antworten den Header X-Content-Type-Options: nosniff hinzuzufügen.

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

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, das den Nutzer automatisch anmeldet. Cookies werden normalerweise für alle Anfragen an die Website gesendet, die das Cookie platziert, auch wenn die Anfrage von einem Drittanbieter über ein <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 wird der Name verwendet. Leider wird dieses Attribut zum Zeitpunkt der Erstellung dieses Artikels nur von Chrome und Firefox 58 oder höher unterstützt.

HTTPOnly und document.cookie

Falls die Cookies Ihrer Website nur serverseitig und nicht von Client-JavaScript verwendet werden, gibt es verschiedene Möglichkeiten, wie Sie verhindern können, dass die Cookie-Daten in den Renderer-Prozess gelangen. Sie können das Cookie-Attribut HTTPOnly festlegen, das in unterstützten Browsern wie Chrome explizit den Zugriff auf das Cookie über clientseitiges Script verhindert. Wenn das Festlegen von HTTPOnly nicht möglich ist, können Sie die Offenlegung beim Laden von Cookiedaten durch den gerenderten Prozess beschränken, indem Sie document.cookie nur lesen, wenn es unbedingt erforderlich ist.

Wenn Sie mithilfe von target="_blank" eine Verknüpfung zu einer anderen Seite erstellen, hat die geöffnete Seite Zugriff auf Ihr window-Objekt und kann zu einer anderen URL auf Ihrer Seite navigieren. Ohne Website-Isolierung läuft die Seite ohne Website-Isolierung im selben Prozess wie Ihre Seite. Zum besseren Schutz Ihrer Seite sollte für Links zu externen Seiten, die in einem neuen Fenster geöffnet werden, immer rel="noopener" angegeben werden.

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 von der Webplattform angebotene API ist performance.now(), die auf 5 Mikrosekunden genau ist. Zur Entschärfung wurde bei allen gängigen Browsern die Auflösung von performance.now() reduziert, um das Bereitstellen der Angriffe zu erschweren.

Eine andere Möglichkeit für einen Timer mit hoher Auflösung ist die Verwendung von SharedArrayBuffer. Der Zwischenspeicher wird von einem dedizierten Worker verwendet, um einen Zähler zu inkrementieren. Der Hauptthread liest diesen Zähler und verwendet ihn als Timer. Derzeit wird „SharedArrayBuffers“ in den Browsern deaktiviert, bis andere Abhilfemaßnahmen eingeführt wurden.

V8

Zur Nutzung von Spectre ist eine speziell erstellte Abfolge von CPU-Anweisungen erforderlich. Das V8-Team hat Abwehrmaßnahmen für bekannte Proofs of Concept für Angriffe implementiert und arbeitet an Änderungen am Optimierungs-Compiler TurboFan, die den generierten Code auch dann sicher machen, wenn diese Angriffe ausgelöst werden. Diese Änderungen bei der Codegenerierung können jedoch zu Leistungseinbußen führen.

Mehr Sicherheit für das Web

Es gab eine Menge Unsicherheit über die Entdeckung von Spectre und Meltdown und ihre Auswirkungen. Ich hoffe, dass dieser Artikel einen Einblick in die Maßnahmen der Chrome- und V8-Teams zum Schutz der Webplattform gegeben hat und wie Webentwickler sie durch die Nutzung vorhandener Sicherheitsfunktionen unterstützen können. Wenn ihr Fragen habt, könnt ihr euch gerne über Twitter an mich wenden.