Website-Skripte mit CSP, Hashes und Nonces schützen

Beitrag vom Oktober 2024 aus dem Bereich Security von Arthur Weder

XSS-Angriffe (Cross-Site-Scripting) zählen zu den häufigsten Bedrohungen im Internet. Dabei versuchen Angreifer, unsichere Daten als vertrauenswürdig erscheinen zu lassen, um mithilfe eingeschleusten Codes Zugriff auf eine Website zu erlangen oder sensible Informationen auszuspähen. Erfahren Sie, wie Sie sich mit Content Security Policies (CSP) effektiv vor XSS-Angriffen schützen können.

Website-Skripte mit CSP, Hashes und Nonces schützen

Wie funktioniert ein XSS-Angriff?

Stellen Sie sich vor, Ihre Website enthält ein Eingabefeld, etwa für eine Suchfunktion. Anstatt einen Text-String einzugeben, könnte ein Nutzer ein Skript hinterlegen, beispielsweise:

<script>alert(0);</script>

Dies stellt die einfachste Form eines XSS-Angriffs dar. Wird die Alert-Box nach Betätigen der Suchfunktion angezeigt, hat die Website den Skript-Code ausgeführt. Dies bedeutet, dass der Code des Angreifers als vertrauenswürdig angesehen wurde. Mit Content Security Policies (CSP) lässt sich die Ausführung solcher Inline-Skripte verhindern.

Content Security Policies (CSP)

Content Security Policies sind ein Schutzmechanismus, der das Ausführen unerwünschter Skripte unterbindet. Mithilfe von HTTP-Response-Headern können Sie festlegen, welche Ressourcen der Browser von welchen Quellen laden darf. Alles, was nicht explizit freigegeben wurde, wird blockiert. Der Browser prüft diese Regeln und verhindert viele gängige Angriffsmethoden, wie das Einbetten externer Ressourcen. So können beispielsweise JavaScript-Dateien von fremden Servern blockiert werden.

Ein einfacher CSP-Standard-Eintrag lautet:

Content-Security-Policy: default-src 'self'

Damit lädt der Browser ausschließlich Ressourcen vom selben Webserver. Externe Inhalte wie YouTube-Videos oder JavaScript-Bibliotheken werden in diesem Fall blockiert. Auch das Tracking mit Google Analytics funktioniert nicht mehr. Standardmäßig verhindert CSP die Ausführung aller Inline-Skripte.

Hashes

Wird CSP mit den Standardeinstellungen aktiviert und die Website enthält Inline-Skripte, erscheint in der Browser-Konsole eine Fehlermeldung wie:

Refused to execute inline script because it violates the following Content Security Policy: "default-src 'self'". 
Either the unsafe-inline keyword, a hash('sha256-7ighj4gd6sfacJptoIgk396ur'), or nonce … 
is required to enable inline execution.

Das betroffene Skript wird nicht ausgeführt. Die Ausführung kann dann wie folgt erlaubt werden:

  • durch das Schlüsselwort unsafe-inline (nicht empfohlen),
  • durch die Nutzung eines Hashes oder
  • durch den Einsatz einer Nonce.

Das Schlüsselwort unsafe-inline hebt den Schutz komplett auf, wodurch alle Skripte ausgeführt werden. Dies ist äußerst unsicher und sollte vermieden werden.

Alternativ können Sie den in der Fehlermeldung genannten SHA-256-Hash verwenden, um die CSP entsprechend zu erweitern:

Content-Security-Policy: default-src 'self'; script-src 'sha256-7ighj4gd6sfacJptoIgk396ur'

Diese Methode erlaubt ausschließlich die Ausführung des spezifischen Inline-Skripts, dessen Hash angegeben wurde und eignen sich daher besonders für statische Inline-Skripte.

Hinweis:
Jede Änderung am Code des Script-Blocks führt zu einem neuen Hash.

Nonces

Während Hashes für statische Skripte ideal sind, eignen sie sich nicht für dynamisch generierte Inhalte. Für diese Fälle kommen Nonces zum Einsatz.

Eine Nonce ist eine einmalig generierte, zufällige Nummer. Sie erlaubt einem gesamten Skript-Block die Ausführung, unabhängig von dessen Inhalt. Ein Beispiel für die Nutzung einer Nonce sieht wie folgt aus:

Content-Security-Policy: default-src 'self'; script-src 'nonce-7ighj4gd6sfacJptoIgk396ur'

<script type="text/javascript" nonce="7ighj4gd6sfacJptoIgk396ur">

Die Nonce im CSP-Header muss mit der Nonce im Skript-Tag übereinstimmen. Dies bietet mehr Flexibilität, allerdings bleibt bei dynamischem Inhalt das Risiko von Angriffen bestehen.

Zusammenfassung

Mit CSP schützen Sie Ihre Website und deren Nutzer effektiv vor Angriffen.

  • Ohne CSP können alle Inline-Skripte ausgeführt werden.
  • Mit einer Nonce wird ein spezifischer Skript-Block erlaubt, unabhängig vom Inhalt.
  • Ein Hash erlaubt die Ausführung eines exakt definierten Skripts.
  • Die Standardeinstellung blockiert alle Inline-Skripte vollständig.

Fehlerhafte CSP-Konfigurationen können dazu führen, dass die Website nicht wie gewünscht funktioniert.

CSP Evaluator
https://csp-evaluator.withgoogle.com

CSP Validator
https://cspvalidator.org

Passende Beiträge aus dem Bereich Security

Sicherer Umgang mit SVG-Dateien

Sicherer Umgang mit SVG-Dateien

Als Website-Betreiber oder Entwickler trägst du die Verantwortung, deine Nutzer und deine Anwendung vor potenziellen Si...

Generieren von CSP-Hashes über die CLI oder PHP

Generieren von CSP-Hashes über die CLI oder PHP

Ich versuche derzeit, auf einer Seite eine Content-Security-Policy im strikt dynamischen Modus einzurichten. Da es sich ...

Sitzungsfixierung - Cookie-Jar-Overflow-Angriffe

Sitzungsfixierung - Cookie-Jar-Overflow-Angriffe

Auf den ersten Blick könnte man meinen, dass Angreifer mit Cross-Site Scripting (XSS) problemlos Session-Cookies stehle...