Nieuwe HTTP/2-kwetsbaarheid stelt webservers bloot aan DoS-aanvallen

Uit nieuw onderzoek is gebleken dat het CONTINUATION-frame in het HTTP/2-protocol kan worden misbruikt om Denial-of-Service (DoS)-aanvallen uit te voeren.

De techniek heeft de codenaam gekregen HTTP/2 VERVOLG Overstroming door veiligheidsonderzoeker Bartek Nowotarski, die de kwestie op 25 januari 2024 meldde bij het CERT Coördinatiecentrum (CERT/CC).

“Veel HTTP/2-implementaties beperken of zuiveren het aantal CONTINUATION-frames dat binnen een enkele stream wordt verzonden niet op de juiste manier”, zei CERT/CC in een advies op 3 april 2024.

“Een aanvaller die pakketten naar een doelserver kan sturen, kan een stroom CONTINUATION-frames verzenden die niet aan de headerlijst in het geheugen worden toegevoegd, maar nog steeds door de server worden verwerkt en gedecodeerd of aan de headerlijst worden toegevoegd, waardoor een Onvoldoende geheugen (OOM) crash.”

Net als bij HTTP/1 gebruikt HTTP/2 headervelden binnen verzoeken en antwoorden. Deze koptekstvelden kunnen koptekstlijsten bevatten, die op hun beurt zijn geserialiseerd en opgesplitst in kopblokken. De headerblokken worden vervolgens verdeeld in blokfragmenten en verzonden binnen HEADER of zogenaamde CONTINUATION-frames.

“Het CONTINUATION-frame (type=0x9) wordt gebruikt om een ​​reeks headerblokfragmenten voort te zetten”, luidt de documentatie voor RFC 7540.

Cyberbeveiliging

“Elk aantal CONTINUATION-frames kan worden verzonden, zolang het voorgaande frame zich in dezelfde stream bevindt en een HEADERS-, PUSH_PROMISE- of CONTINUATION-frame is zonder dat de vlag END_HEADERS is ingesteld.”

Voor het laatste frame dat headers bevat, is de vlag END_HEADERS ingesteld, die aan het externe eindpunt aangeeft dat dit het einde van het headerblok is.

Volgens Nowotarski is CONTINUATION Flood een klasse van kwetsbaarheden binnen verschillende HTTP/2-protocolimplementaties die een ernstiger bedreiging vormen vergeleken met de Rapid Reset-aanval die in oktober 2023 aan het licht kwam.

“Een enkele machine (en in bepaalde gevallen slechts een enkele TCP-verbinding of een handvol frames) heeft het potentieel om de beschikbaarheid van de server te verstoren, met gevolgen variërend van servercrashes tot substantiële prestatievermindering”, aldus de onderzoeker. “Opmerkelijk genoeg zijn verzoeken die een aanval vormen niet zichtbaar in HTTP-toegangslogboeken.”

De kwetsbaarheid heeft in de kern te maken met de onjuiste afhandeling van HEADERS en meerdere CONTINUATION-frames die de weg vrijmaken voor een DoS-conditie.

Met andere woorden: een aanvaller kan een nieuwe HTTP/2-stream tegen een doelserver starten met behulp van een kwetsbare implementatie en HEADERS en CONTINUATION-frames verzenden zonder ingestelde END_HEADERS-vlag, waardoor een eindeloze stroom headers ontstaat die de HTTP/2-server nodig zou hebben analyseren en in het geheugen opslaan.

Hoewel de exacte uitkomst varieert afhankelijk van de implementatie, variëren de gevolgen van een onmiddellijke crash na het verzenden van een paar HTTP/2-frames en een crash van onvoldoende geheugen tot CPU-uitputting, waardoor de beschikbaarheid van de server wordt beïnvloed.

“RFC9113 […] noemt meerdere beveiligingsproblemen die kunnen optreden als CONTINUATION-frames niet correct worden afgehandeld”, aldus Nowotarski.

Cyberbeveiliging

“Tegelijkertijd wordt er geen specifiek geval genoemd waarin CONTINUATION-frames worden verzonden zonder de uiteindelijke END_HEADERS-vlag, wat gevolgen kan hebben voor de getroffen servers.”

Het probleem heeft gevolgen voor verschillende projecten, zoals amphp/http (CVE-2024-2653), Apache HTTP Server (CVE-2024-27316), Apache Tomcat (CVE-2024-24549), Apache Traffic Server (CVE-2024-31309), Envoy proxy (CVE-2024-27919 en CVE-2024-30255), Golang (CVE-2023-45288), h2 Rust krat, nghttp2 (CVE-2024-28182), Node.js (CVE-2024-27983), en Tempesta FW (CVE-2024-2758).

Gebruikers wordt aangeraden de getroffen software te upgraden naar de nieuwste versie om potentiële bedreigingen te beperken. Als er geen oplossing is, is het raadzaam om HTTP/2 op de server tijdelijk uit te schakelen.

Thijs Van der Does