Meltdown/Spectre

Übersicht

Am 3. Januar enthüllte Project Zero Sicherheitslücken in modernen CPUs, die ein Prozess nutzen kann, um (im schlimmsten Fall) beliebigen Arbeitsspeicher zu lesen – einschließlich Arbeitsspeicher, der nicht zu diesem Prozess gehört. Diese Sicherheitslücken wurden Spectre und Meltdown genannt. Was tut Chrome, um das Web sicherer zu machen, und was sollten Webentwickler für ihre eigenen Websites tun?

Kurzfassung

Als Nutzer, der im Web surft, sollten Sie darauf achten, dass Ihr Betriebssystem und Ihr Browser immer auf dem neuesten Stand sind. Außerdem können Chrome-Nutzer die Website-Isolierung aktivieren.

Wenn Sie Webentwickler sind, empfiehlt das Chrome-Team:

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

Wenn Sie sich fragen, warum diese Schritte helfen, lesen Sie weiter.

Das Risiko

Es gibt bereits viele Erklärungen für diese Schwachstellen, daher werde ich keine weitere hinzufügen. Wenn Sie wissen möchten, wie diese Sicherheitslücken ausgenutzt werden können, empfehle ich Ihnen, sich den Blogpost meiner Kollegen aus dem Google Cloud-Team anzusehen.

Sowohl Meltdown als auch Spectre ermöglichen es einem Prozess, Speicher zu lesen, auf den er eigentlich keinen Zugriff haben sollte. Manchmal werden mehrere Dokumente von verschiedenen Websites in Chrome in einem gemeinsamen Prozess verarbeitet. Dies kann passieren, wenn eine der beiden Seiten mit window.open, <a href="..." target="_blank"> oder iFrames geöffnet wurde. Wenn eine Website nutzerspezifische Daten enthält, besteht die Möglichkeit, dass eine andere Website diese neuen Sicherheitslücken nutzt, um diese Nutzerdaten zu lesen.

Maßnahmen zur Risikominderung

Das Chrome- und V8-Entwicklungsteam unternimmt mehrere Anstrengungen, um diese Bedrohung zu minimieren.

Website-Isolierung

Die Auswirkungen eines erfolgreichen Spectre-Exploits können erheblich reduziert werden, indem verhindert wird, dass sensible Daten jemals einen Prozess mit vom Angreifer kontrolliertem Code gemeinsam nutzen. Das Chrome-Team hat an einer Funktion gearbeitet, mit der dies erreicht werden soll. Sie heißt Website-Isolierung:

Die Website-Isolierung ist noch nicht standardmäßig aktiviert, da es einige bekannte Probleme gibt und das Chrome-Team so viele Feldtests wie möglich durchführen möchte. Wenn Sie Webentwickler sind, sollten Sie die Website-Isolierung aktivieren und prüfen, ob Ihre Website weiterhin funktioniert. Wenn Sie die Funktion jetzt aktivieren möchten, aktivieren Sie chrome://flags#enable-site-per-process. Wenn Sie eine Website finden, die nicht funktioniert, erstellen Sie bitte einen Fehlerbericht und geben Sie an, dass Sie die Site Isolation aktiviert haben.

Websiteübergreifende Dokumentblockierung

Auch wenn alle seitenübergreifenden Seiten in separaten Prozessen verarbeitet werden, können Seiten weiterhin rechtmäßig einige seitenübergreifende untergeordnete Ressourcen wie Bilder und JavaScript anfordern. Um zu verhindern, dass vertrauliche Informationen durch diese Informationen offengelegt werden, enthält die Site Isolation die Funktion Cross-Site Document Blocking, die einschränkt, welche Netzwerkantworten an den Renderer-Prozess gesendet werden.

Eine Website kann zwei Arten von Daten von einem Server anfordern: „Dokumente“ und „Ressourcen“. Dokumente sind HTML-, XML-, JSON- und Textdateien. Eine Website kann Dokumente von ihrer eigenen Domain oder von anderen Domains mit permissiven CORS-Headern empfangen. Ressourcen umfassen unter anderem Bilder, JavaScript, CSS und Schriftarten. Ressourcen können von jeder Website eingebunden werden.

Die richtlinienübergreifende Dokumentblockierungsrichtlinie verhindert, dass ein Prozess „Dokumente“ von anderen Ursprüngen empfängt, wenn:

  1. Sie haben den MIME-Typ HTML, XML, JSON oder text/plain und
  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 lässt den Zugriff auf das Dokument nicht explizit zu.

Dokumente, die durch diese Richtlinie blockiert werden, werden dem Prozess als leer präsentiert, obwohl die Anfrage im Hintergrund weiterhin erfolgt.

Beispiel: Ein Angreifer erstellt ein <img>-Tag, das eine JSON-Datei mit vertraulichen Daten wie <img src="https://yourbank.com/balance.json"> enthält. Ohne Site Isolation würde der Inhalt der JSON-Datei in den Arbeitsspeicher des Renderer-Prozesses gelangen. Dort würde der Renderer feststellen, dass es sich nicht um ein gültiges Bildformat handelt, und kein Bild rendern. Mit Spectre gibt es jedoch jetzt eine Möglichkeit, diesen Speicherbereich potenziell auszulesen. Durch die websiteübergreifende Dokumentblockierung wird verhindert, dass die Inhalte dieser Datei in den Speicher des Prozesses gelangen, in dem der Renderer ausgeführt wird, da der MIME-Typ durch die websiteübergreifende Dokumentblockierung blockiert wird.

Laut Nutzermesswerten werden viele JavaScript- und CSS-Dateien mit den MIME-Typen text/html oder text/plain ausgeliefert. Um zu vermeiden, dass Ressourcen blockiert werden, die versehentlich als Dokumente gekennzeichnet sind, versucht Chrome, die Antwort zu analysieren, um sicherzustellen, dass der MIME-Typ korrekt ist. Diese Erkennung ist nicht perfekt. Wenn Sie also sicher sind, dass Sie die richtigen Content-Type-Header auf Ihrer Website festlegen, empfiehlt das Chrome-Team, den X-Content-Type-Options: nosniff-Header in alle Ihre Antworten aufzunehmen.

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">. Das funktioniert nur, wenn auf yourbank.com ein Cookie gespeichert ist, mit dem der Nutzer automatisch angemeldet wird. Cookies werden in der Regel für alle Anfragen an die Website gesendet, die das Cookie festlegt, auch wenn die Anfrage von einem Drittanbieter über ein <img>-Tag erfolgt. SameSite-Cookies sind ein neues Attribut, das angibt, dass ein Cookie nur an eine Anfrage angehängt werden soll, die von derselben Website stammt. Leider wird dieses Attribut zum Zeitpunkt der Veröffentlichung dieses Dokuments nur von Chrome und Firefox 58+ unterstützt.

HTTPOnly und document.cookie

Wenn die Cookies Ihrer Website nur serverseitig und nicht von Client-JavaScript verwendet werden, 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 explizit verhindert, dass auf das Cookie über clientseitiges Script in unterstützten Browsern wie Chrome zugegriffen wird. Wenn die Einstellung HTTPOnly nicht möglich ist, können Sie die Offenlegung von Cookie-Daten für den gerenderten Prozess einschränken, indem Sie document.cookie nur lesen, wenn es unbedingt erforderlich ist.

Wenn Sie mit target="_blank" auf eine andere Seite verweisen, hat die geöffnete Seite Zugriff auf Ihr window-Objekt, kann Ihre Seite zu einer anderen URL weiterleiten und befindet sich ohne Website-Isolierung im selben Prozess wie Ihre Seite. Um Ihre Seite besser zu schützen, 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 Arbeitsspeicher zu lesen. Dazu ist ein zuverlässiger und genauer Timer erforderlich.

Eine API, die die Webplattform bietet, ist performance.now(), die auf 5 Mikrosekunden genau ist. Als Gegenmaßnahme haben alle wichtigen Browser die Auflösung von performance.now() verringert, um die Angriffe zu erschweren.

Eine weitere Möglichkeit, einen Timer mit hoher Auflösung zu erhalten, ist die Verwendung eines SharedArrayBuffer. Der Puffer wird von einem dedizierten Worker verwendet, um einen Zähler zu erhöhen. Der Hauptthread liest diesen Zähler und verwendet ihn als Zeitgeber. Bis dahin haben Browser beschlossen, SharedArrayBuffer zu deaktivieren.

V8

Um Spectre auszunutzen, ist eine speziell entwickelte Sequenz von CPU-Befehlen erforderlich. Das V8-Team hat Gegenmaßnahmen für bekannte Proof-of-Concept-Angriffe implementiert und arbeitet an Änderungen an TurboFan, dem optimierenden Compiler, damit der generierte Code auch dann sicher ist, wenn diese Angriffe ausgelöst werden. Diese Änderungen bei der Codeerstellung können jedoch zu Leistungseinbußen führen.

Sicherheit im Web

Die Entdeckung von Spectre und Meltdown und ihre Auswirkungen haben zu großer Unsicherheit geführt. Ich hoffe, dieser Artikel hat Ihnen einen Einblick in die Maßnahmen gegeben, die die Chrome- und V8-Teams ergreifen, um die Webplattform sicher zu halten, und wie Webentwickler mit vorhandenen Sicherheitsfunktionen dazu beitragen können. Wenn Sie Fragen haben, können Sie sich gern Twitter an mich wenden.