Do not let your CDN betray you!

Mit Subresource Integrity gefährliche Skripte blocken
Keine Kommentare

Im Mozilla Firefox Developer Edition 43 und in anderen modernen Browsern lassen sich extern eingebundene JavaScript-Bibliotheken kontrollieren und auf diese Weise bösartige Veränderungen verhindern. Durch die Nutzung der W3C-Spezifikation Subresource Integrity soll die Integrität von Skripten geprüft und ausgeschlossen werden, dass veränderte Skripte zum Einsatz kommen. So können Entwickler gefahrenlos von der Leistungssteigerung durch die Nutzung von Content Delivery Networks (CDN) profitieren.

Mozilla unterstützt seit Firefox 43 Subresource Integrity, also die Überprüfung der Integrität von Skripten, die in Websites verwendet werden. Das schützt davor, dass nachträglich veränderte Skripte ausgeführt werden. Man erhält also immer exakt die Version, die man aufgrund des Hash-Wertes erwarten würde – oder eben eine Fehlermeldung und ein blockiertes Skript. Dabei wird auf Hash-Werte zurückgegriffen, die ein Skript eindeutig erkennbar machen. Frederik Braun und Francois Marier erklären im Mozilla-Blog, wie Subresource Integrity genau funktioniert und auf was man bei der Verwendung achten muss.

Subresource Integrity nutzen

Die Verwendung von Subresource Integrity ist dabei relativ simpel:

<script src="https://code.jquery.com/jquery-2.1.4.min.js"
integrity="sha384-R4/ztc4ZlRqWjqIuvf6RX5yb/v90qNGx6fS48N0tRxiGkqveZETq72KgDVJCp2TC"
crossorigin="anonymous"></script>

Die Idee dahinter ist die Folgende: Beim Erstellen einer Website wird das Skript zusammen mit seinem kryptografischen Hash (z. B. SHA-348) erfasst. Der Browser kann dann das Skript herunterladen und die Zeichenkette aus der heruntergeladenen Datei berechnen. Das Skript wird nur ausgeführt, wenn beide Hashs übereinstimmen. Die Sicherheitseigenschaften einer kollisionssicheren Hash-Funktion führen dazu, dass eine Veränderung im Skript zu einer komplett unterschiedlichen Zeichenkette führt. Subresource Integrity hilft Seitenbetreibern dabei, Veränderungen aufzudecken und zu verhindern – egal, ob sie von einem kompromittierten Content Delivery Network oder einem bösartigen Angreifer stammen.

Damit Subresource Integrity funktioniert, ist es wichtig, dass das CDN Cross-Origin Resource Sharing (CORS) unterstützt. Das crossorigin-Attribut im Code-Snippet erzwingt einen CORS-aktiven Load. Der Wert „anonymous“ zeigt an, dass der Browser alle Cookies oder Authentifizierungen auslassen sollte, die der User mit der Domain assoziiert. Dieser Vorgang schützt vor cross-origin Schwachstellen und verkleinert zudem den Request.

Stellen Sie Ihre Fragen zu diesen oder anderen Themen unseren entwickler.de-Lesern oder beantworten Sie Fragen der anderen Leser.

Features der Subresource Integrity

Integrity Syntax: Das Integrity-Attribut beinhaltet nicht nur den Hash-Wert, sondern auch den „Digest-Name“. Die Syntax des Attributs erlaubt unzählige Tokens mit diesem Name-Wert-Format. Das wiederum ermöglicht es Seitenbetreibern, Hashes von verschiedener Stärke und Werte von multiplen Skripten zu spezifizieren. Dieser Vorgang ist besonders nützlich für Browser-Sniffing und Content Negotiation.

Ausfallsicherung: Um zu verhindern, dass User auf einer nicht-funktionierenden Website landen, empfiehlt das Mozilla-Entwicklerteam, eine Kopie des Skripts auf dem eigenen Rechner zu hosten. Hat sich dennoch ein Fehler eingeschlichen, kann mit dem folgenden Code-Snippet Abhilfe geschaffen werden:

<script>window.jQuery || document.write('<script src="/jquery-2.1.4.min.js?x67037"><\/script>')</script>

Der Code überprüft, ob jQuery definiert wurde – ist das nicht der Fall, fügt er einen Skript-Tag ein, der dieselbe ursprüngliche Version des Skripts lädt.

HTTP oder HTTPS: Subresource Integrity läuft sowohl unter HTTP als auch unter HTTPS. Betreibt man eine Website nur mit HTTP, kann der Browser dennoch überprüfen, ob das Skript im CDN modifiziert wurde, allerdings ist das Skript nicht gegen aktive Netzwerkattacken geschützt. Um Vertraulichkeit, Integrität und Authentizität der Web-Applikationen zu gewährleisten, sollte HTTPS für die gesamte Website verwendet werden.

Subresource Integrity kann dabei helfen, die eigene Website bei der Nutzung von vor allem unbekannten Content Delivery Networks sicherer zu machen. Und dafür müssen nur ein paar Attribute zu den Skript-Tags hinzugefügt werden. Statt also dem Browser zu sagen: „Lade das Skript von einem fremden Server und führe es aus“, heißt es jetzt: „Lade das Skript von einem fremden Server, aber führe es nur aus, wenn es den von mir angegebenen Hash-Wert besitzt.“


Subresource Integrity lässt sich übrigens bereits in CSS nutzen: Das Integrity-Attribut muss dafür einfach auf den <link>-Tag angewendet werden. Das Mozilla-Team arbeitet nach eigenen Angaben am Support für weitere Subresources.

Wer schon einmal dem Browser-Support testen oder mit Beispielen experimentieren möchte, findet auf https://srihash.org/ ein geeignetes Werkzeug. Das Tool übernimmt die grobe Arbeit der Berechnung von Hashes und überprüft, ob die CDN bereits HTTPS unterstützt. Weitere Informationen zu Subresource Integrity finden sich in der Dokumentation sowie in den Spezifikationen.

Aufmacherbild: Software developer programming code on computer von Shutterstock / Urheberrecht: McIek

Unsere Redaktion empfiehlt:

Relevante Beiträge

Hinterlasse einen Kommentar

Hinterlasse den ersten Kommentar!

avatar
400
  Subscribe  
Benachrichtige mich zu:
X
- Gib Deinen Standort ein -
- or -