Fehlende HTTP Strict Transport Security
CWE-319CWE-523OWASP A02:2021Aktualisiert 4. September 20264 Min. Lesezeit
HTTP Strict Transport Security weist den Browser an, eine Website künftig ausschließlich über HTTPS aufzurufen. Fehlt der Header oder steht die Gültigkeitsdauer auf wenigen Tagen, kann ein Angreifer im selben Netz die erste Anfrage auf HTTP zurückdrängen und den Verkehr abfangen oder verändern, bevor die Verschlüsselung überhaupt beginnt.
Praktisch jede Website läuft heute über HTTPS, und dennoch beginnt ein Browserbesuch auffällig oft mit einer unverschlüsselten Anfrage. Jemand tippt eine Adresse ohne Protokoll ein, klickt auf einen alten Link oder folgt einem jahrealten Lesezeichen. Genau auf diese eine erste Anfrage wartet ein Angreifer. Im Folgenden lesen Sie, wie HSTS dieses Fenster schließt und welche Einstellungen dabei schieflaufen.
Was ist HTTP Strict Transport Security?
HTTP Strict Transport Security (HSTS) ist ein HTTP-Header, mit dem ein Server den Browser anweist, diese Domain künftig ausschließlich über HTTPS aufzurufen. Der Browser merkt sich diese Anweisung für den angegebenen Zeitraum und wandelt fortan jede http://-Adresse dieser Domain in https:// um, noch bevor auch nur ein Byte ins Netz geht.
Der Unterschied zu einer gewöhnlichen Weiterleitung ist fein, aber entscheidend. Eine Weiterleitung ist eine Antwort des Servers: Der Browser muss also zuerst eine unverschlüsselte Anfrage senden, um zu erfahren, dass er auf HTTPS wechseln soll. HSTS ist eine Anweisung, an die sich der Browser erinnert: Es geht keine unverschlüsselte Anfrage mehr hinaus, um herauszufinden, dass sie nicht hätte hinausgehen dürfen.
Stellen Sie sich einen Empfang vor, an dem Besucher ihren Ausweis zeigen müssen. Eine Weiterleitung ist die Empfangskraft, die sagt: “Sie stehen jetzt drinnen, gehen Sie bitte kurz zurück und melden Sie sich ordentlich an.” HSTS ist das Schild an der Außenseite, das Besucher bereits gelesen hatten, bevor sie hineingingen. Im ersten Fall hat jemand schon in der Halle gestanden, im zweiten nicht.
Wie funktioniert ein Downgrade-Angriff?
Der Angriff spielt sich im Netzwerk ab: in einem öffentlichen WLAN, an einem kompromittierten Router oder bei einem zwischengeschalteten Anbieter. Der Angreifer muss keine Verschlüsselung brechen, er muss nur verhindern, dass sie überhaupt zustande kommt.
Verwundbar:
HTTP/1.1 301 Moved Permanently
Location: https://portal.example/anmelden
Auf den ersten Blick ist das korrekt: Der Server leitet Besucher sauber auf HTTPS weiter. Das Problem ist, dass der Nutzer, um diese Antwort zu erhalten, zunächst Folgendes senden musste:
GET /anmelden HTTP/1.1
Host: portal.example
Diese Anfrage geht in lesbarer Form über das Netz. Ein Angreifer, der dazwischensitzt, lässt die Weiterleitung nie ankommen. Stattdessen hält er die Verbindung zum Nutzer selbst über HTTP aufrecht, spricht auf der Rückseite sehr wohl HTTPS mit Ihrem Server und liest alles mit, was das Opfer eintippt: Benutzername, Passwort, Session-Cookie. Der Nutzer sieht eine funktionierende Anmeldeseite und bemerkt allenfalls, dass das Schloss fehlt.
Sicher:
HTTP/1.1 200 OK
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
Nach einem einzigen erfolgreichen HTTPS-Besuch merkt sich der Browser dies ein Jahr lang. Tippt der Nutzer danach portal.example in die Adresszeile, sendet der Browser sofort eine HTTPS-Anfrage; es gibt keine unverschlüsselte Anfrage mehr, die sich abfangen ließe. includeSubDomains weitet diese Regel auf jede Subdomain aus, was wichtig ist, weil ein vergessenes test.portal.example sonst eine offene Seitentür bliebe. Mit preload gelangt die Domain auf eine im Browser selbst hinterlegte Liste, sodass bereits der allererste Besuch geschützt ist.
includeSubDomains erst ein, wenn Sie sicher wissen, dass jede Subdomain HTTPS unterstützt, einschließlich interner Testumgebungen und Systeme von Lieferanten. Eine Subdomain, die nur über HTTP läuft, wird nach dieser Einstellung für alle Besucher unerreichbar, und der Browser merkt sich das für die volle Laufzeit.Welche Auswirkungen hat fehlendes HSTS?
Der Schweregrad wird üblicherweise als niedrig bis mittel bewertet, weil der Angreifer eine Position im Netzwerkpfad benötigt. Diese Bedingung wiegt weniger schwer, als sie klingt: Ein öffentliches Netz in Zug, Hotel oder Café, ein nachgebildeter WLAN-Zugangspunkt oder ein kompromittiertes Heimgerät genügen.
Gelingt der Angriff, ist der Schaden allerdings vollständig. Der Angreifer liest alles mit, was über die Verbindung geht: Zugangsdaten, Session-Cookies, personenbezogene Daten und die Inhalte von Formularen. Zudem kann er die Antwort verändern, womit der Weg zu einer nachgebauten Anmeldemaske oder eingeschleustem Skriptcode offensteht. Da in diesem Szenario das Session-Cookie erbeutet wird, muss der Angreifer das Passwort nicht einmal kennen, um weiterzukommen.
Ein zu kurzer max-age-Wert schwächt den Schutz, ohne ihn ganz aufzuheben. Steht der Wert auf 30 Tagen, ist ein Nutzer, der sechs Wochen nicht vorbeigekommen ist, beim nächsten Besuch erneut verwundbar, also genau in dem Moment, in dem er die Adresse wieder eintippt.
Wie spürt man fehlendes HSTS auf?
Die Prüfung beginnt bei der HTTPS-Antwort: Gibt es einen Strict-Transport-Security-Header, und wenn ja, wie lang ist der max-age-Wert? Ein Wert unter einem Jahr verdient Aufmerksamkeit, ein Wert von null schaltet den Schutz aktiv ab.
Danach folgt die Untersuchung, die Scanner meist auslassen. Wird der Header auch auf Subdomains gesetzt, oder deckt includeSubDomains Domains ab, die selbst kein HTTPS anbieten? Leitet die HTTP-Fassung der Website korrekt auf HTTPS weiter, und geschieht das auf den richtigen Pfad? Wird der Header versehentlich nur auf der Startseite gesetzt und nicht auf der API oder dem Anmeldeendpunkt? Und steht die Domain auf der Preload-Liste, obwohl es noch eine Subdomain ohne Zertifikat gibt? AssistSec prüft bei einem Penetrationstest die vollständige Zertifikatskette und die Weiterleitungsstruktur und beurteilt, ob in der Praxis noch ein Pfad besteht, über den ein Nutzer unverschlüsselt mit Ihrer Anwendung sprechen kann.
Wie verhindert man fehlendes HSTS?
- Senden Sie
Strict-Transport-Securitybei jeder HTTPS-Antwort mit, mitmax-age=31536000als Richtwert. - Ergänzen Sie
includeSubDomains, sobald Sie sicher sind, dass alle Subdomains HTTPS unterstützen. - Bauen Sie die Laufzeit schrittweise auf: kurz beginnen, prüfen, ob alles funktioniert, dann auf ein Jahr erhöhen.
- Leiten Sie weiterhin von HTTP auf HTTPS weiter; HSTS ersetzt diese Weiterleitung nicht, sondern ergänzt sie.
- Erwägen Sie die Aufnahme in die Preload-Liste für Domains, die dauerhaft und vollständig über HTTPS laufen.
- Setzen Sie den Header nie auf einer unverschlüsselten Antwort; Browser ignorieren ihn dort, was ein falsches Sicherheitsgefühl erzeugt.
- Überwachen Sie die Gültigkeit Ihrer Zertifikate aktiv, denn mit HSTS können Besucher einen Zertifikatsfehler nicht mehr wegklicken.
- Regeln Sie den Header zentral in Ihrem Webserver oder Proxy, damit neue Hosts und Routen ihn automatisch übernehmen.
Quellen
Häufige Fragen
Genügt eine Weiterleitung von HTTP auf HTTPS nicht?
Nein, denn diese Weiterleitung selbst geht unverschlüsselt hinaus. Ein Angreifer zwischen Nutzer und Server kann diese erste Anfrage abfangen und die Antwort ersetzen, sodass der Browser nie bei der HTTPS-Fassung ankommt. Die Weiterleitung bleibt nötig, aber HSTS ist das, was verhindert, dass überhaupt noch eine unverschlüsselte Anfrage hinausgeht.
Welchen max-age-Wert sollte ich setzen?
Üblich sind 31536000 Sekunden, also ein Jahr. Kürzere Werte wie 30 Tage kommen regelmäßig vor und sind besser als nichts, verkleinern aber das Zeitfenster, in dem der Browser die Regel behält. Bauen Sie im Zweifel auf: Beginnen Sie mit wenigen Minuten, prüfen Sie, ob alles funktioniert, und erhöhen Sie schrittweise auf ein Jahr.
Was bewirkt die Preload-Option?
Mit preload gelangt Ihre Domain auf eine Liste, die in den Browsern selbst hinterlegt ist. Der Browser weiß dann schon vor dem allerersten Besuch, dass Ihre Website nur über HTTPS erreichbar ist, womit auch die Eröffnungsanfrage geschützt ist. Vorsicht: Die Entfernung von dieser Liste dauert Monate, tun Sie das also nur, wenn jede Subdomain dauerhaft HTTPS unterstützt.
Kann HSTS meine Website unerreichbar machen?
Ja, und deshalb ist eine sorgfältige Einführung nötig. Sobald ein Browser die Regel gespeichert hat, verweigert er für die verbleibende Laufzeit jede unverschlüsselte Verbindung. Läuft Ihr Zertifikat ab oder bietet eine Subdomain nur HTTP an, können Besucher nicht daran vorbeiklicken. Testen Sie daher zunächst mit einem kurzen max-age.
Verwandte Artikel
- SchwachstellenCWE-327A02:2021Cryptographic FailuresCryptographic Failures erklärt: MD5 für Passwörter, ECB-Modus, feste IVs und selbstgebaute Krypto, und warum Argon2id und AES-GCM es besser machen.
- SchwachstellenCWE-319A02:2021Unsicherer Transport und schwaches TLSUnsicherer Transport erklärt: Plain HTTP, fehlendes HSTS, veraltete TLS-Versionen und Cookies ohne Secure, und wie Sie HTTPS überall erzwingen.
- SchwachstellenCWE-16A05:2021Security MisconfigurationSecurity Misconfiguration erklärt: wie Standardpasswörter, Debug-Modi und offene Cloud-Buckets Angreifern Zugang geben, und wie Sie sich schützen.
- SchwachstellenCWE-1004A07:2021Ungeschütztes AuthentifizierungscookieEin Session-Cookie ohne HttpOnly, Secure und SameSite ist auslesbar, abfangbar und missbrauchbar. Lesen Sie, was jedes Attribut genau abdeckt.