Einige Webbrowser verfügen über eine Funktionalität namens Content-/MIME-Sniffing. Eigentlich gut gemeint, kann diese Funktionalität aber auch von Angreifern missbraucht werden. Um dies zu verhindern, kann der HTTP-Security-Header X-Content-Type-Options eingesetzt werden.
X-Content-Type-Options: Beschreibung Funktionsweise
Wird eine Website über einen Webbrowser aufgerufen, teilt der Webserver innerhalb der HTTP-Anfrage dem Webbrowser mit, um welchen Content- bzw. MIME-Type es sich bei der vom Webbrowser angefragten und vom Webserver ausgelieferten Ressource handelt. Nehmen wir an wir betreiben eine Website z.B. mit WordPress die Javascript einbindet.
# <body>
# <p>Webseite</p>
# <script type="text/javascript" src="test.js"></script>
# </body>
Der Webbrowser fragt nun dieses JavaScript vom Webserver an:
# GET /test.js HTTP/2
# Host: www.deinewebsite.de
Der Webserver beantwortet dem Webbrowser die Anfrage mit der angefragte JavaScript-Datei und teilt ihm den entsprechenden Content-Type mit:
# HTTP/2 200 OK
# date: Tue, 04 Jan 2022 15:12:45 GMT
# content-type: application/javascript; charset=UTF-8
# content-length: 2817
Das Javascript würde anschließend vom Browser ausgeführt werden.
Würde nun bei dem Webserver eine fehlerhafte Konfiguration vorliegen und der Webserver das Javascript an Stelle von <aplication/javascript> als <text/plain> ausliefern. Dann würde das wie folgt aussehen:
# HTTP/2 200 OK
# date: Tue, 04 Jan 2022 15:13:51 GMT
# content-type: text/plain; charset=UTF-8
# content-length: 2817
Hacker attakieren mit Content Sniffing
Ruft man nun die selbe Website mit einen X-Content-Sniffing fähigen Browser auf, würde dieser zunächst die vom Webserver ausgelieferte Date untersuchen. Dabei würde der Webbrowser feststellen, dass es sich bei der ausgelieferten Datei nicht um ein Text, sondern um ein JavasScript handelt und dies dann als solche ausführen.
Gepaart mit Fails im XSS würde dies eine erhebliche Sicherheitslücke darstellen. Hacker könnten so z.B. Grafikdateien mit einem implementiertem Java Code (Malware) einschleusen oder gar den Code im JavaScript so umschreiben, dass man damit erheblichen Schaden anrichten kann. Da der Webbrowser bei seiner Dateianalyse ein JavaScript Code feststellt und diesen dann ausführt.
MIME Sniffing mit X-Content-Type-Options verbieten
Daher sollten unbedingt darauf geachtet werden, dass Serverseitig dem Browser das Erraten der sogenannten Response-Typen untersagt wird. Hierzu muss nun der Webserver entsprechend angepasst werden.
Aus diesem Grund sollte dem Server die Anweisung für X-Content-Type-Options hinzugefügt werden:
Anweisung für Apache:
# Header always set X-Content-Type-Options "nosniff"
Anweisung für NGINX:
# add_header X-Content-Type-Options "nosniff";
Anweisung für .htaccess:
<IfModule mod_headers.c>
Header set X-Content-Type-Options nosniff
</IfModule>
Die in Datei<.htaccess> enthaltenen Anweisungen beschreiben Informationen für Zugriffsberechtigungen auf den Webserver, Search-Bots, Spider, etc. Auf dieses Thema werde ich in einem gesonderten Beitrag noch einmal ausführlicher eingehen. Dennoch sollte sich diese Datei grundsätzlich im Root-Verzeichnis befinden. Wenn nicht sollte diese angelegt werden.