Forschende von Netflix und Google in verschiedenen Implementierungen des HTTP/2-Protokolls acht Schwachstellen erkannt, die einen Denial-of-Service-Angriff durch die gezielte Übermittlung eines speziell formatierten Streams von Netzwerkanfragen ermöglichen. Die Probleme betreffen mehr oder weniger die meisten HTTP-Server mit Unterstützung für HTTP/2 und führen entweder zu einem Mangel an verfügbarer Arbeitsspeicher oder zu einer übermäßigen CPU-Auslastung. Updates zur Behebung dieser Schwachstellen wurden bereits in und , sind jedoch derzeit für Apache httpd und .
Die Probleme resultierten aus den im HTTP/2-Protokoll eingeführten Komplikationen, die mit der Verwendung binärer Strukturen, dem Datenstromlimitierungssystem innerhalb von Verbindungen, dem Stream-Priorisierungsmechanismus sowie ICMP-ähnlichen Kontrollnachrichten, die auf der HTTP/2-Verbindungsebene arbeiten (z. B. Ping-Operationen, Rücksetzungen und Steuerungen des Streams), verbunden sind. Viele Implementierungen haben die Flüsse der Kontrollnachrichten nicht ordnungsgemäß begrenzt, organisierten die Prioritätswarteschlange bei der Anfragebearbeitung ineffizient oder nutzten suboptimale Implementierungen von Flusssteuerungsalgorithmen.
Die meisten identifizierten Angriffsarten bestehen darin, bestimmte Anfragen an den Server zu senden, die eine große Zahl von Antworten generieren. Wenn der Client dabei keine Daten aus dem Socket liest und die Verbindung nicht trennt, wird die Antwortpuffer-Warteschlange auf der Serverseite kontinuierlich gefüllt. Dieses Verhalten erzeugt eine Belastung für das System zur Verwaltung der Netzwerkverbindungswarteschlangen und führt, je nach den spezifischen Implementierungsmerkmalen, zu einem Erschöpfen des verfügbaren Speichers oder CPU-Ressourcen.
Identifizierte Schwachstellen:
- CVE-2019-9511 (Data Dribble) — Ein Angreifer fordert eine große Menge an Daten in mehreren Streams an, indem er die Größe des Gleitfensters und die Priorität des Streams manipuliert, was den Server zwingt, die Daten in Blöcken von je 1 Byte in die Warteschlange zu stellen;
- CVE-2019-9512 (Ping Flood) — Ein Angreifer sendet kontinuierlich Ping-Nachrichten über eine HTTP/2-Verbindung und initiiert damit das Füllen einer internen Warteschlange für gesendete Antworten auf der anderen Seite;
- CVE-2019-9513 (Resource Loop) — Ein Angreifer erstellt mehrere Anfrage-Streams und ändert kontinuierlich die Priorität der Streams, was zu einer Vermischung des Prioritätenbaums führt;
- CVE-2019-9514 (Reset Flood) — Ein Angreifer erzeugt mehrere Streams
und sendet über jeden Stream eine fehlerhafte Anfrage, was dazu führt, dass der Server RST_STREAM-Frames sendet, diese jedoch nicht für die Füllung der Antwortwarteschlange akzeptiert; - CVE-2019-9515 (Settings Flood) — Ein Angreifer sendet einen Stream leerer "SETTINGS"-Frames, auf die der Server bestätigen muss, dass er jede Anfrage erhalten hat;
- CVE-2019-9516 (0-Length Headers Leak) — Ein Angreifer sendet einen Stream von Headern mit Leerzeichen für Namen und Wert, wobei der Server für jeden Header einen Speicherpuffer reserviert und diesen bis zum Ende der Sitzung nicht freigibt;
- CVE-2019-9517 (Interne Datenpufferung) — Angreifer öffnet
ein gleitendes HTTP/2-Fenster, um Daten vom Server ohne Einschränkungen zu senden, während das TCP-Fenster geschlossen bleibt, was verhindert, dass die Daten tatsächlich in den Socket geschrieben werden. Anschließend sendet der Angreifer Anfragen, die eine große Antwort erfordern; - CVE-2019-9518 (Leere Frames Überflutung) — Der Angreifer sendet einen Datenstrom mit den Typen DATA, HEADERS, CONTINUATION oder PUSH_PROMISE, aber mit leerem Payload und ohne End-of-Stream-Flag. Der Server verschwendet Zeit mit der Verarbeitung jedes Frames, die im Verhältnis zur Bandbreite des Angreifers unverhältnismäßig ist.
Quelle: opennet.ru
