Subresource Integrity

Subresource Integrity (SRI) ist eine Sicherheitsfunktion, die es Browsern ermöglicht, sicherzustellen, dass die von ihnen geladenen Ressourcen (zum Beispiel von einem CDN) ohne unerwartete Manipulationen geliefert werden. Es funktioniert, indem Sie einen kryptografischen Hash angeben, den eine geladene Ressource erfüllen muss.

Hinweis: Bei der Überprüfung der Subresource-Integrität einer Ressource, die von einem anderen Ursprung als dem Dokument geliefert wird, in das sie eingebettet ist, überprüfen Browser die Ressource zusätzlich mithilfe von Cross-Origin Resource Sharing (CORS), um sicherzustellen, dass der Ursprung, der die Ressource liefert, deren Freigabe für den anfragenden Ursprung erlaubt.

Wie Subresource Integrity hilft

Webseiten entscheiden sich manchmal dafür, sich auf Dritte wie ein Content Delivery Network (CDN) zu verlassen, um einige ihrer Ressourcen zu hosten, anstatt alle Ressourcen selbst zu hosten. Ein Dokument, das zum Beispiel von https://example.com bereitgestellt wird, könnte eine Ressource von einem anderen Standort einbinden:

html
<script src="https://not-example.com/script.js"></script>

Dies birgt ein Risiko, denn wenn ein Angreifer die Kontrolle über den Drittanbieter-Host erlangt, kann dieser beliebigen bösartigen Inhalt in seine Dateien einfügen (oder die Dateien komplett ersetzen) und somit potenziell auch Seiten angreifen, die Dateien von ihm abrufen.

Subresource Integrity ermöglicht es Ihnen, einige Risiken solcher Angriffe zu mindern, indem sichergestellt wird, dass die Dateien, die Ihre Webanwendung oder Ihr Webdokument abruft, ohne dass ein Angreifer zusätzlichen Inhalt in diese Dateien eingefügt hat — und ohne dass irgendwelche anderen Änderungen an diesen Dateien vorgenommen wurden — geliefert wurden.

Verwendung der Subresource Integrity

Sie nutzen die Subresource Integrity-Funktion, indem Sie einen Base64-kodierten kryptografischen Hash einer Ressource (Datei), die Sie dem Browser zum Abruf anweisen, in den Wert des integrity-Attributs eines <script>-Elements oder eines <link>-Elements mit rel="stylesheet", rel="preload" oder rel="modulepreload" angeben.

Ein integrity-Wert beginnt mit mindestens einem String, wobei jeder String ein Präfix enthält, das einen bestimmten Hash-Algorithmus angibt (derzeit sind die erlaubten Präfixe sha256, sha384 und sha512), gefolgt von einem Bindestrich und endend mit dem eigentlichen base64-kodierten Hash.

Hinweis: Ein integrity-Wert kann mehrere durch Leerzeichen getrennte Hashes enthalten. Eine Ressource wird geladen, wenn sie mit einem dieser Hashes übereinstimmt.

Beispiel einer integrity-Zeichenkette mit base64-kodiertem SHA-384-Hash:

sha384-oqVuAfXRKap7fdgcCY5uykM6+R9GqQ8K/uxy9rx7HNQlGYl1kPzQho1wx4JwY8wC

oqVuAfXRKap7fdgcCY5uykM6+R9GqQ8K/uxy9rx7HNQlGYl1kPzQho1wx4JwY8wC ist also der „Hash“-Teil, und das Präfix sha384 zeigt an, dass es sich um einen SHA-384-Hash handelt.

Hinweis: Der „Hash“-Teil eines integrity-Werts ist streng genommen ein kryptografischer Digest, der durch die Anwendung einer bestimmten Hash-Funktion auf eine Eingabe (z. B. eine Skript- oder Stylesheet-Datei) gebildet wird. Es ist jedoch üblich, die Abkürzung „Hash“ zu verwenden, um kryptografischer Digest zu meinen, und das wird in diesem Artikel verwendet.

Tools zum Generieren von SRI-Hashes

SRI Hash Generator

Der SRI Hash Generator ist ein Online-Tool, mit dem Sie SRI-Hashes generieren können.

Verwendung von OpenSSL

Sie können SRI-Hashes von der Kommandozeile aus mit OpenSSL generieren, indem Sie einen Befehl wie diesen ausführen:

bash
cat FILENAME.js | openssl dgst -sha384 -binary | openssl base64 -A

In einer Windows-Umgebung können Sie mit dem folgenden Code ein Tool zum Generieren von SRI-Hashes erstellen:

batch
@echo off
set bits=384
openssl dgst -sha%bits% -binary %1% | openssl base64 -A > tmp
set /p a= < tmp
del tmp
echo sha%bits%-%a%
pause

Um diesen Code zu verwenden:

  1. Speichern Sie diesen Code in einer Datei mit dem Namen sri-hash.bat im Windows "SendTo"-Ordner in Ihrer Umgebung (zum Beispiel C:\Users\USER\AppData\Roaming\Microsoft\Windows\SendTo).
  2. Klicken Sie mit der rechten Maustaste auf eine Datei im Datei-Explorer, wählen Sie Senden an... und dann sri-hash. Sie sehen den Integritätswert in einem Befehlsfenster.
  3. Wählen Sie den Integritätswert aus und klicken Sie mit der rechten Maustaste, um ihn in die Zwischenablage zu kopieren.
  4. Drücken Sie eine Taste, um das Befehlsfenster zu schließen.

Hinweis: Wenn OpenSSL nicht auf Ihrem System installiert ist, besuchen Sie die OpenSSL-Projektwebsite für Informationen zum Herunterladen und Installieren. Das OpenSSL-Projekt hostet selbst keine Binärdistributionen von OpenSSL, führt jedoch eine informelle Liste von Drittanbieterdistributionen: https://github.com/openssl/openssl/wiki/Binaries.

Verwendung von shasum

Sie können SRI-Hashes mit shasum generieren, indem Sie einen Befehl wie diesen ausführen:

bash
shasum -b -a 384 FILENAME.js | awk '{ print $1 }' | xxd -r -p | base64
  • Der "pipe-through" xxd-Schritt konvertiert die hexadezimale Ausgabe von shasum in Binärdaten.
  • Der "pipe-through" awk-Schritt ist notwendig, weil shasum den gehashte Dateinamen in seiner Ausgabe an xxd weitergeben wird. Das kann katastrophale Folgen haben, wenn der Dateiname zufällig gültige Hex-Zeichen enthält — denn xxd würde dies ebenfalls dekodieren und an base64 weitergeben.

Cross-Origin Resource Sharing und Subresource Integrity

Für die Überprüfung der Subresource-Integrität einer Ressource, die von einem anderen Ursprung als dem Dokument, in das sie eingebettet ist, bereitgestellt wird, überprüfen Browser die Ressource zusätzlich mit Cross-Origin Resource Sharing (CORS), um sicherzustellen, dass der Ursprung, der die Ressource bereitstellt, deren Freigabe für den anfragenden Ursprung gestattet. Daher muss die Ressource mit einem Access-Control-Allow-Origin-Header geliefert werden, der die Freigabe der Ressource für den anfragenden Ursprung erlaubt; zum Beispiel:

http
Access-Control-Allow-Origin: *

Beispiele

In den folgenden Beispielen wird angenommen, dass oqVuAfXRKap7fdgcCY5uykM6+R9GqQ8K/uxy9rx7HNQlGYl1kPzQho1wx4JwY8wC bereits als der erwartete SHA-384-Hash (Digest) eines bestimmten Skripts example-framework.js bekannt ist und dass es eine Kopie des Skripts unter https://example.com/example-framework.js gibt.

Subresource Integrity mit dem <script>-Element

Sie können das folgende <script>-Element verwenden, um einem Browser mitzuteilen, dass er das Skript https://example.com/example-framework.js nicht ausführen darf, bevor er es nicht mit dem erwarteten Hash verglichen und eine Übereinstimmung festgestellt hat.

html
<script
  src="https://example.com/example-framework.js"
  integrity="sha384-oqVuAfXRKap7fdgcCY5uykM6+R9GqQ8K/uxy9rx7HNQlGYl1kPzQho1wx4JwY8wC"
  crossorigin="anonymous"></script>

Hinweis: Weitere Einzelheiten zum Zweck des crossorigin-Attributs finden Sie unter CORS-Einstellungen von Attributen.

Wie Browser mit Subresource Integrity umgehen

Browser gehen mit SRI folgendermaßen um:

  1. Wenn ein Browser ein <script>- oder <link>-Element mit einem integrity-Attribut trifft, muss er, bevor er das Skript ausführt oder bevor er ein vom <link>-Element angegebenes Stylesheet anwendet, das Skript oder das Stylesheet zuerst mit dem erwarteten Hash im integrity-Wert vergleichen.

    Bei der Überprüfung der Subresource-Integrität einer Ressource, die von einem anderen Ursprung als dem Dokument, in das sie eingebettet ist, bereitgestellt wird, überprüfen Browser die Ressource zusätzlich mit Cross-Origin Resource Sharing (CORS), um sicherzustellen, dass der Ursprung, der die Ressource liefert, deren Freigabe für den anfragenden Ursprung erlaubt.

  2. Wenn das Skript oder das Stylesheet nicht mit dem zugehörigen integrity-Wert übereinstimmt, muss der Browser die Ausführung des Skripts ablehnen oder die Anwendung des Stylesheets verweigern und stattdessen einen Netzwerkfehler zurückgeben, der anzeigt, dass das Abrufen dieses Skripts oder Stylesheets fehlgeschlagen ist.

Spezifikationen

Specification
HTML
# attr-link-integrity
Subresource Integrity
# the-integrity-attribute
HTML
# attr-script-integrity

Browser-Kompatibilität

html.elements.link.integrity

html.elements.script.integrity

Siehe auch