X-Content-Type-Options Header richtig konfigurieren

Was macht der X-Content-Type-Options Header?

Der Header verhindert MIME Type Sniffing (oder Content Type Sniffing) durch den Browser. Dabei versucht der Browser aufgrund der Inhalte einer Datei zu erkennen, um was für einen Datei Typ es sich handelt.

Bei einem gesetzten X-Content-Type-Options Header wird der Browser dagegen gezwungen, sich auf den Datei Typ zu verlassen der im Content-Type Header definiert ist.

Wenn die Datei im Content-Type Header als „image/jpeg“ definiert ist, der Inhalt aber nicht einem JPG Bild entspricht, dann kann sie nicht dargestellt werden. Dadurch können Angriffe durch bösartige Dateien unterbunden werden.

Was können die Auswirkungen eines nicht gesetzten X-Content-Type-Options Headers sein?

Upload Funktionen sind in der Regel auf bestimmte Dateitypen beschränkt (was aus Security Sicht auch sinnvoll und richtig ist). In manchen Fällen lassen sich diese Upload Beschränkungen durch Hacker aber umgehen, indem der Content-Type Header zwar auf einem legitimen Wert belassen wird (z.B. image/jpeg) der eigentliche Inhalt der Datei aber manipuliert wird, beispielsweise durch das Einfügen von JavaScript Code.

Wenn kein X-Content-Type-Options Header gesetzt ist, versucht der Browser dann möglicherweise den Dateityp aufgrund des Inhalts der Datei zu erraten. Im Fall der manipulierten Datei würde er dort JavaScript Code finden und diesen entsprechend ausführen. Dadurch kann ein Angreifer über eine manipulierte Datei potenziell Code im Browser seiner Opfer ausführen (etwa um Session Cookies zu stehlen).

Dies wird durch die folgende Grafik verdeutlicht:

X-Content-Type-Options-Header

Der Content-Type Header („Ich bin ein Bild“) wird ignoriert, stattdessen errät der Browser den Dateityp basierend auf dem Datei Inhalt. Da dort JavaScript Code gefunden wird, wird dieser dargestellt (= ausgeführt) und der Angriff verläuft erfolgreich.

Wäre der X-Content-Type-Options Header dagegen gesetzt, dürfte der Browser den Inhalt der Datei nicht untersuchen, sondern müsste sie basierend auf dem Content-Type Header darstellen. Im Falle unserer manipulierten Datei würde dies zu einem Fehler führen, da die Datei als Bild deklariert ist, aber JS Code enthält. Die Darstellung wäre damit nicht möglich und der Angriff unterbunden.

Das wird durch die folgende Grafik visualisiert:

Der Browser ist nun gezwungen, sich auf den Content-Type Options Header zu verlassen und muss die Datei als Bild darstellen. Da die Datei manipuliert ist, kann sie nicht dargestellt werden und es kommt zu einem Fehler. Der Angriff ist damit gescheitert.

Anmerkung: Zu einem Fehler kommt es natürlich nur bei einer manipulierten Datei. Die normalen Bilder von legitimen Usern sind durch diese Maßnahme nicht beeinträchtigt und werden weiterhin korrekt als Bilder dargestellt:

Welche Werte gibt es für den X-Content-Type-Options Header?

  • nosniff
    • Der Header kann nur auf einen einzigen Wert gesetzt werden, der das Sniffen des Content Types unterbindet

Auf welche Werte sollte der X-Content-Type-Options Header gesetzt sein?

Der Header sollte auf den Wert nosniff gesetzt werden.