Meltdown/Spectre

Übersicht

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

Zusammenfassung

Als Nutzer, der im Web surft, 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, empfiehlt das Chrome-Team Folgendes:

  • Verhindern Sie nach Möglichkeit, dass Cookies in den Arbeitsspeicher des Renderer-Prozesses gelangen. Verwenden Sie dazu die Cookie-Attribute SameSite und HTTPOnly und vermeiden Sie das Lesen von document.cookie.
  • Prüfen Sie, ob 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 das Blockieren von Cross-Origin-Lesezugriffen für Nutzer mit aktivierter Website-Isolation optimal zu nutzen.
  • Aktivieren Sie die Website-Isolierung und teilen Sie dem Chrome-Team mit, wenn dadurch Probleme auf Ihrer Website auftreten.

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

Das Risiko

Es gab bereits eine Vielzahl von Erklärungen zu diesen Sicherheitslücken, daher möchte ich hier nicht noch eine weitere hinzufügen. Wenn Sie wissen möchten, wie diese Sicherheitslücken ausgenutzt werden können, lesen Sie den Blogpost meiner Kollegen vom Google Cloud-Team.

Sowohl Meltdown als auch Spectre ermöglichen es einem Prozess, Speicher zu lesen, der eigentlich nicht lesbar sein sollte. Manchmal teilen sich mehrere Dokumente von verschiedenen Websites einen Prozess in Chrome. Das kann passieren, wenn eine Seite über window.open, <a href="..." target="_blank"> oder iframes geöffnet wurde. Wenn eine Website nutzerspezifische Daten enthält, besteht die Gefahr, dass eine andere Website diese neuen Sicherheitslücken ausnutzt, um diese Nutzerdaten zu lesen.

Abhilfemaßnahmen

Das Chrome- und V8-Entwicklerteam arbeitet an mehreren Maßnahmen, 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 angreiferkontrolliertem Code teilen. Das Chrome-Team arbeitet an einer Funktion namens Website-Isolierung, die genau das ermöglicht:

Die Website-Isolierung ist noch nicht standardmäßig aktiviert, da es einige bekannte Probleme gibt und das Chrome-Team möglichst viele Tests vor der Veröffentlichung durchführen möchte. Wenn Sie Webentwickler sind, sollten Sie die Website-Isolierung aktivieren und prüfen, ob Ihre Website weiterhin funktioniert. Wenn du die Funktion jetzt aktivieren möchtest, aktiviere 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 Website-Isolation aktiviert haben.

Websiteübergreifende Dokumentblockierung

Auch wenn alle websiteübergreifenden Seiten in separate Prozesse verschoben werden, können Seiten weiterhin legitim einige websiteübergreifende Unterressourcen anfordern, z. B. Bilder und JavaScript. Um zu verhindern, dass vertrauliche Informationen gehackt werden, enthält die Website-Isolation die Funktion Websiteübergreifendes Blockieren von Dokumenten, mit der eingeschränkt wird, welche Netzwerkantworten an den Rendering-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 permissiven CORS-Headern empfangen. Zu den Ressourcen gehören beispielsweise Bilder, JavaScript, CSS und Schriftarten. Ressourcen können von jeder Website eingebunden werden.

Mit der Richtlinie zum Blockieren von Dokumenten wird verhindert, dass ein Prozess „Dokumente“ von anderen Ursprüngen empfängt, wenn:

  1. Sie haben den MIME-Typ „text/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 erlaubt nicht explizit den Zugriff auf das Dokument

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

Beispiel: Angreifer erstellen 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 erkennt der Renderer, dass es sich nicht um ein gültiges Bildformat handelt, und rendert kein Bild. Mit Spectre gibt es jedoch jetzt eine Möglichkeit, diesen Arbeitsspeicherblock möglicherweise zu lesen. Durch das blockieren von Dokumenten über Websites 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 das blockieren von Dokumenten über Websites blockiert wird.

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

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

SameSite Cookies

Kehren wir zum Beispiel oben zurück: <img src="https://yourbank.com/balance.json">. Das funktioniert nur, wenn deinebank.de ein Cookie gespeichert hat, über das der Nutzer automatisch angemeldet wird. Cookies werden in der Regel für alle Anfragen an die Website gesendet, auf der das Cookie gesetzt wird – 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. Daher der Name. Leider wird dieses Attribut derzeit nur von Chrome und Firefox 58 und höher unterstützt.

HTTPOnly und document.cookie

Wenn die Cookies Ihrer Website nur serverseitig und nicht durch clientseitiges JavaScript verwendet werden, gibt es Möglichkeiten, zu verhindern, dass die Daten des Cookies in den Rendering-Prozess gelangen. Sie können das Cookie-Attribut HTTPOnly festlegen, um explizit zu verhindern, dass über unterstützte Browser wie Chrome über clientseitiges Script auf das Cookie zugegriffen wird. Wenn die Einstellung von HTTPOnly nicht möglich ist, können Sie die Weitergabe von Cookie-Daten zum Laden an den gerenderten Prozess begrenzen, indem Sie document.cookie nur lesen, wenn es unbedingt erforderlich ist.

Wenn Sie mit target="_blank" auf eine andere Seite verlinken, hat die geöffnete Seite Zugriff auf Ihr window-Objekt, kann auf Ihrer Seite zu einer anderen URL wechseln und wird ohne Website-Isolierung im selben Prozess wie Ihre Seite ausgeführt. Zum besseren Schutz Ihrer 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 Arbeitsspeicher zu lesen. Dazu ist ein zuverlässiger und genauer Timer erforderlich.

Eine der APIs, die die Webplattform bietet, ist performance.now(), die auf 5 Mikrosekunden genau ist. Als Abhilfemaßnahme haben alle gängigen Browser die Auflösung von performance.now() verringert, um die Durchführung von Angriffen zu erschweren.

Eine weitere Möglichkeit, einen Timer mit hoher Auflösung zu erhalten, ist die Verwendung eines SharedArrayBuffer. Der Puffer wird von einem speziellen Worker verwendet, um einen Zähler zu erhöhen. Der Haupt-Thread liest diesen Zähler und verwendet ihn als Timer. Die Browser haben sich vorerst dazu entschieden, SharedArrayBuffer zu deaktivieren, bis andere Maßnahmen ergriffen wurden.

V8

Für die Ausnutzung von Spectre ist eine speziell erstellte Abfolge von CPU-Anweisungen erforderlich. Das V8-Team hat Maßnahmen für bekannte Proof-of-Concept-Angriffe implementiert und arbeitet an Änderungen an TurboFan, dem optimierenden Compiler, 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.

Das Web schützen

Die Entdeckung von Spectre und Meltdown und ihre Auswirkungen haben viel Unsicherheit ausgelöst. Ich hoffe, dass dieser Artikel Ihnen einen Einblick in die Arbeit der Chrome- und V8-Teams zur Sicherheit der Webplattform gegeben hat und dass Sie Webentwickler dazu anregen konnte, die vorhandenen Sicherheitsfunktionen zu nutzen. Bei Fragen kannst du dich gern über Twitter an mich wenden.