Schutzmaßnahmen: Content Security Policy gegen XSS, Teil 4
Nach der
allgemeinen Einführung
in die Content Security Policy, dem Überblick über die
Anweisungen
und
Schlüsselwörter sowie Inline-Code und -Styles
geht es in dieser Folge zuerst um die Möglichkeit, mittels
eval()
und ähnlichen Funktionen harmlosen Text in im
Falle eines Angriffs meist bösen Code umzuwandeln.
eval()
ist bekanntlich evil!
Bisher haben Sie erfahren, wie Sie mit der CSP das Einbinden von Skripten
von unerwünschten Servern verhindern und den gefährlichen
Inline-Code ausschalten können. Damit legen Sie den Angreifern schon
einige gewaltige Steine in den Weg. Unter Umständen enthält Ihre
Anwendung aber auch einen geheimen Tunnel unter allen Steinen hindurch:
Funktionsaufrufe wie eval()
, setTimeout([string],
...)
, setInterval([string], ...)
oder new
Function()
können genutzt werden, auf den ersten Blick
harmlosen Text in bösartigen Code umzuwandeln. Und zwar, indem der
Angreifer diesen Funktionen JavaScript-Code unterschiebt, der dann
ausgeführt wird.
Das würde den Schutz durch die CSP natürlich unterlaufen, weshalb
diese Funktionen auch von der CSP gesperrt werden. Das hat natürlich
Auswirkungen auf den vorhandenen Code. Wenn Sie zum Beispiel JSON-Daten
über eval()
auswerten, funktioniert das bei aktivierter
CSP nicht mehr. Stattdessen können Sie die Auswertung aber problemlos
über JSON.parse
durchführen.
Aufrufe von setTimeout()
und setInterval()
mit
Strings müssen in Aufrufe mit Inline-Funktionen umgewandelt werden.
Aus zum Beispiel
setTimeout("alert('Das ist schlecht!')", 10);
wird dann beispielsweise
setTimeout(function () {
alert('Das ist gut!')
}, 10);
(für setInterval()
funktioniert das genauso), und aus
new Function("return irgendwas");
wird zum Beispiel
function() {
return irgendwas
};
CSP aushebeln
Falls Sie auf eine der unsicheren Funktionen angewiesen sind, können Sie
sie ebenso wie den unsicheren Inline-Code bei Bedarf einschalten.
Zuständig dafür ist das Schlüsselwort 'unsafe-eval'
als
zulässige Quelle in der Anweisung script-src
:
Content-Security-Policy: script-src 'unsafe-eval'
Aber denken Sie dabei daran: Sie unterlaufen damit einen Teil der
Schutzfunktionen der CSP. Wäre ich fies, würde ich schreiben "Wenn Sie
'unsafe-inline'
oder 'unsafe-eval'
einschalten,
können Sie die CSP auch genau so gut gleich ganz ausschalten!". Aber
ich bin ja nicht fies. Oh, was steht denn da?
Spass beiseite, denken Sie einfach daran: Jede Ausnahme, die Sie Ihrer Anwendung einräumen, kann ein Angreifer gegen Ihre Anwendung und deren Benutzer ausnutzen. Das wollen Sie doch bestimmt nicht?
CSP zum Bericht, bitte
Die CSP arbeitet komplett auf der Client-Seite und schützt Ihre Benutzer.
Das ist schön und auch so gewollt. Manchmal wäre es aber ganz gut, wenn
man wüsste, was denn da auf dem Client blockiert wurde. Und das ist in der
Tat über die Anweisung report-uri
möglich. Wird die gesetzt,
sendet der Browser JSON-Formatierte Berichte über blockierte URI und
ähnliches. Aktiviert wird der Bericht über
Content-Security-Policy: default-src 'self'; ...; report-uri http://anwendung.example/pfad/zum/parser;
Sie müssen die gesendeten natürlich auch entgegen nehmen, im
Beispiel mit dem Skript unter
http://anwendung.example/pfad/zum/parser
. Die gesendeten
Berichte sehen dann zum Beispiel so aus:
{
"csp-report": {
"document-uri": "http://anwendung.example/eine/seite.html",
"referrer": "http://boeser-server.example/",
"blocked-uri": "http://boeser-server.example/boeses.js",
"violated-directive": "script-src 'self'",
"original-policy": "script-src 'self' report-uri http://anwendung.example/pfad/zum/parser;"
}
}
Der Bericht enthält folgende Informationen:
- Die Seite, auf der ein Regelverstoß festgestellt wurde
(
document-uri
), - den Referrer der Seite (
referrer
), - die Ressource, die gegen die CSP verstoßen hat und deshalb
blockiert wurde (
blocked-uri
), - die Anweisung, gegen die verstoßen wurde
(
violated-directive
) und - die komplette CSP der Seite (
original-policy
)
CSP im reinen Berichts-Modus
Zu Testzwecken ist es oft wünschenswert, zwar über alle
Regelverstöße und blockierten Ressourcen informiert zu werden,
aber ohne dass dabei die Client-seitige Anwendung durch Fehler lahm gelegt
wird. Für diesen Zweck kann die CSP in einen Berichts-Modus versetzt
werden. Wenn Sie statt des Content-Security-Policy
-Headers
einen Content-Security-Policy-Report-Only
-Header mit genau den
gleichen Anweisungen senden, wird die CSP zwar theoretisch beachtet und
Regelverstöße an den Server gesendet, die geforderten
Einschränkungen aber praktisch nicht durchgesetzt:
Content-Security-Policy-Report-Only: default-src 'self'; ...; report-uri http://anwendung.example/pfad/zum/parser;
Wie Sie oben schon bemerkt haben, wird im Bericht auch die Original-Policy
angegeben. Praktischerweise ist es möglich, sowohl
Content-Security-Policy
-Header als auch
Content-Security-Policy-Report-Only
-Header zu senden und damit
eine Policy durchzusetzen und gleichzeitig eine andere zu testen. Das
bietet sich zum Beispiel an, wenn Sie eine funktionierende Policy haben,
aber zum Beispiel nach Änderungen am Code eine neue Policy testen
möchten.
Damit ist das Thema "Content Security Policy" abgeschlossen. Ab der nächsten Folge geht es um Schutzmaßnahmen gegen Angriffe auf/über Pufferüberlauf-Schwachstellen.
Übersicht über alle Artikel zum Thema
- Schutzmaßnahmen: Content Security Policy gegen XSS, Teil 1
- Schutzmaßnahmen: Content Security Policy gegen XSS, Teil 2
- Schutzmaßnahmen: Content Security Policy gegen XSS, Teil 3
- Schutzmaßnahmen: Content Security Policy gegen XSS, Teil 4
- Schutzmaßnahmen: Der Pufferüberlauf im Überblick
- Schutzmaßnahmen: Canary und DEP gegen Pufferüberlauf-Schwachstellen
- Schutzmaßnahmen: ASLR gegen Pufferüberlauf-Schwachstellen
- Schutzmaßnahmen: ASLR kann unterlaufen werden
- Schutzmaßnahmen: Weitere Angriffe trotz ASLR
Trackbacks
www.ceilers-news.de am : PingBack
Die Anzeige des Inhaltes dieses Trackbacks ist leider nicht möglich.www.ceilers-news.de am : PingBack
Die Anzeige des Inhaltes dieses Trackbacks ist leider nicht möglich.www.ceilers-news.de am : PingBack
Die Anzeige des Inhaltes dieses Trackbacks ist leider nicht möglich.www.drweb.de am : PingBack
Die Anzeige des Inhaltes dieses Trackbacks ist leider nicht möglich.