Content Security Policy
Content Security Policy (CSP) ist ein Sicherheitskonzept, um Cross-Site-Scripting und andere Angriffe durch Einschleusen von Daten in Webseiten zu verhindern.<ref name="Stamm 2009" /> Es handelt sich um einen W3C-Empfehlungskandidaten zur Sicherheit von Webanwendungen.<ref name="CSPstatus" />
CSP wurde ursprünglich von der Mozilla Foundation entworfen und in Firefox 4.0 erstmals experimentell unterstützt.
Status[Bearbeiten]
Der offizielle Name des HTTP-Header-Felds ist Content-Security-Policy. Mozilla Firefox unterstützt diesen ab Version 23.<ref name="MozillaBlog" /> Google Chrome ab Version 25.<ref name="ChromiumBlog" />
Derzeit ist seitens W3C Version 2 standardisiert<ref>Skriptfehler: Ein solches Modul „Vorlage:Internetquelle“ ist nicht vorhanden. Mike West, Adam Barth, Dan Veditz, Skriptfehler: Ein solches Modul „DateTime“ ist nicht vorhanden. ehemals im Vorlage:Referrer (nicht mehr online verfügbar).Vorlage:Toter Link/Core (Seite nicht mehr abrufbar. Suche im Internet Archive)Skriptfehler: Ein solches Modul „TemplatePar“ ist nicht vorhanden.Skriptfehler: Ein solches Modul „TemplatePar“ ist nicht vorhanden.</ref> und Version 3 in Ausarbeitung.<ref>Content Security Policy Level 3, Redakteurentwurf vom 4. August 2017, abgerufen am 16. August 2017.</ref>
Ein früher genutztes Header-Feld war X-Content-Security-Policy, das vom Internet Explorer 10 und 11 unterstützt wurde.
Problem des klassischen Sicherheitskonzepts[Bearbeiten]
Webseiten können aktive Inhalte beispielsweise in Form von JavaScript-Code enthalten. Wenn die Webbrowser diesen Code ausführen, erzwingen sie die Einhaltung der Same-Origin-Policy. Dies bedeutet, dass Code von einer Quelle nicht auf Inhalte einer anderen Quelle zugreifen darf. So darf beispielsweise der Code in der Webseite eines Angreifers nicht auf die Elemente einer Onlinebanking-Webseite zugreifen.
In der Praxis sind jedoch Cross-Site-Scripting-Schwachstellen sehr verbreitet, wodurch die Same-Origin-Policy ausgehebelt wird. Eine Cross-Site-Scripting-Schwachstelle entsteht, wenn sich einer Webseite durch fehlerhafte Maskierung Code unterschieben lässt. Aus Sicht des Browsers kommt dieser untergeschobene Code aus der gleichen Quelle wie die angegriffene Webseite.
Arbeitsweise[Bearbeiten]
Konzept[Bearbeiten]
Die Ursache für Cross-Site-Scripting-Schwachstellen liegt in der fehlerhaften dynamischen Generierung von Inhalten in Webanwendungen. Die Content Security Policy erzwingt daher eine strikte Trennung zwischen Inhaltsdaten im HTML-Code und externen Dateien mit JavaScript-Code. In der Regel sind externe JavaScript-Dateien statisch und werden nicht dynamisch generiert.
Verbotene Konstrukte und Alternativen[Bearbeiten]
Die Trennung zwischen Code und Daten wird folgendermaßen erreicht:
- JavaScript-Blöcke
- der Form
<syntaxhighlight lang="html"> <script> [code] </script> </syntaxhighlight> müssen in externe Dateien in einer vertrauenswürdigen Domäne ausgelagert werden: <syntaxhighlight lang="html"> <script src="externalfile.js"></script> </syntaxhighlight> Alternativ können gesamte Code-Blöcke gehasht und als vertrauenswürdige Quelle angegeben werden.
- setTimeout() und setInterval()
- dürfen nicht mehr in der Variante aufgerufen werden, die den Code in einer Zeichenfolge enthält:
<syntaxhighlight lang="javascript"> window.setTimeout("[code]", 100); </syntaxhighlight> Stattdessen muss eine Referenz auf einen Callback übergeben werden: <syntaxhighlight lang="javascript"> window.setTimeout(function () { [code] }, 100); </syntaxhighlight>
- eval()
- sollte nach Möglichkeit vermieden werden. Moderne Browser bieten zum Parsen von Daten im JSON-Format die Funktionen
<syntaxhighlight inline lang="javascript"> JSON.parse(jsonString) </syntaxhighlight>
an.<ref name="NativeJSON" /> Über die Policy-Regel “unsafe-eval” kann der Aufruf von eval() explizit erlaubt werden, wodurch allerdings die Schutzfunktion von CSP eingeschränkt wird.
- Event-Handler-Attribute
- wie zum Beispiel
onclickin
<syntaxhighlight lang="html">
<a id="historyback" onclick="history.back()">…</a>
</syntaxhighlight>
müssen durch von externem Code hinzugefügte Event-Listener ersetzt werden. Das Beispiel kann so in JavaScript umgesetzt werden:
<syntaxhighlight lang="javascript">
document.getElementById("historyback").addEventListener("click", function () { history.back(); });
</syntaxhighlight>
Das a-Element wird hierbei über seine ID “historyback” adressiert und ein Event-Listener für das click-Ereignis hinzugefügt.
Evaluierung, Reporting[Bearbeiten]
Um die Auswirkungen der Aktivierung der CSP für eine Web-Applikation zu prüfen, ohne aber die CSP selbst durchzusetzen, sieht der W3C-Entwurf eine Möglichkeit vor, Verletzungen der CSP über die über report-uri angegebene URL zu protokollieren. Hierzu muss der report-only-Modus mittels Content-Security-Policy-Report-Only-Header verwendet werden.<ref>Die Reporting-Funktion der Content-Security-Policy (CSP). Artikel vom 30. August 2011, abgerufen am 14. August 2017.</ref><ref>The Content-Security-Policy-Report-Only HTTP Response Header Field</ref>
Dieses Reporting ist jedoch problematisch, da Sicherheitsforscher bereits vorgezeigt haben, wie diese Reports absichtlich falsch gesendet werden können und so die Aufmerksamkeit der Administratoren im Rahmen eines Angriffs an eine falsche Stelle gezogen wird. Dieses Verhalten lässt sich nicht einfach beheben, da der Report vom Browser gesendet wird und nicht vom Server.<ref>Skriptfehler: Ein solches Modul „Vorlage:Internetquelle“ ist nicht vorhanden. Skriptfehler: Ein solches Modul „DateTime“ ist nicht vorhanden. ehemals im Vorlage:Referrer (nicht mehr online verfügbar) (Skriptfehler: Ein solches Modul „Multilingual“ ist nicht vorhanden.).Vorlage:Toter Link/Core (Seite nicht mehr abrufbar. Suche im Internet Archive)Skriptfehler: Ein solches Modul „TemplatePar“ ist nicht vorhanden.Skriptfehler: Ein solches Modul „TemplatePar“ ist nicht vorhanden.</ref>
Weblinks[Bearbeiten]
- Content Security Policy Level 3, W3C-Arbeitsentwurf vom 13. September 2016, abgerufen am 14. August 2017.
- Content Security Policy Level 3, Redakteurentwurf vom 4. August 2017, abgerufen am 14. August 2017.
- Content Security Policy Tutorial. Artikel vom 24. September 2012, abgerufen am 14. August 2017.
Einzelnachweise[Bearbeiten]
<references> <ref name="Stamm 2009"> Sid Stamm: Skriptfehler: Ein solches Modul „Vorlage:Internetquelle“ ist nicht vorhanden. BackgroundSkriptfehler: Ein solches Modul „Vorlage:Internetquelle“ ist nicht vorhanden. In: Skriptfehler: Ein solches Modul „Vorlage:Internetquelle“ ist nicht vorhanden. Skriptfehler: Ein solches Modul „DateTime“ ist nicht vorhanden. ehemals im Vorlage:Referrer (nicht mehr online verfügbar) (Skriptfehler: Ein solches Modul „Multilingual“ ist nicht vorhanden.): Skriptfehler: Ein solches Modul „Text“ ist nicht vorhanden.Skriptfehler: Ein solches Modul „TemplatePar“ ist nicht vorhanden. </ref> <ref name="MozillaBlog"> Skriptfehler: Ein solches Modul „Vorlage:Internetquelle“ ist nicht vorhanden. Skriptfehler: Ein solches Modul „DateTime“ ist nicht vorhanden. ehemals im Vorlage:Referrer (nicht mehr online verfügbar) (Skriptfehler: Ein solches Modul „Multilingual“ ist nicht vorhanden.).Vorlage:Toter Link/Core (Seite nicht mehr abrufbar. Suche im Internet Archive)Skriptfehler: Ein solches Modul „TemplatePar“ ist nicht vorhanden.Skriptfehler: Ein solches Modul „TemplatePar“ ist nicht vorhanden. </ref> <ref name="ChromiumBlog"> Skriptfehler: Ein solches Modul „Vorlage:Internetquelle“ ist nicht vorhanden. Google, Skriptfehler: Ein solches Modul „DateTime“ ist nicht vorhanden. ehemals im Vorlage:Referrer (nicht mehr online verfügbar) (Skriptfehler: Ein solches Modul „Multilingual“ ist nicht vorhanden.).Vorlage:Toter Link/Core (Seite nicht mehr abrufbar. Suche im Internet Archive)Skriptfehler: Ein solches Modul „TemplatePar“ ist nicht vorhanden.Skriptfehler: Ein solches Modul „TemplatePar“ ist nicht vorhanden. </ref> <ref name="NativeJSON"> Alexis Deveria: Skriptfehler: Ein solches Modul „Vorlage:Internetquelle“ ist nicht vorhanden. Ehemals im Vorlage:Referrer (nicht mehr online verfügbar) (Skriptfehler: Ein solches Modul „Multilingual“ ist nicht vorhanden.).Vorlage:Toter Link/Core (Seite nicht mehr abrufbar. Suche im Internet Archive)Skriptfehler: Ein solches Modul „TemplatePar“ ist nicht vorhanden.Skriptfehler: Ein solches Modul „TemplatePar“ ist nicht vorhanden. </ref> <ref name="CSPstatus"> Skriptfehler: Ein solches Modul „Vorlage:Internetquelle“ ist nicht vorhanden. Status of this documentSkriptfehler: Ein solches Modul „Vorlage:Internetquelle“ ist nicht vorhanden. Skriptfehler: Ein solches Modul „DateTime“ ist nicht vorhanden. ehemals im Vorlage:Referrer (nicht mehr online verfügbar) (Skriptfehler: Ein solches Modul „Multilingual“ ist nicht vorhanden.).Vorlage:Toter Link/Core (Seite nicht mehr abrufbar. Suche im Internet Archive)Skriptfehler: Ein solches Modul „TemplatePar“ ist nicht vorhanden.Skriptfehler: Ein solches Modul „TemplatePar“ ist nicht vorhanden. </ref> </references>