Sono state rivelate informazioni sul metodo di attacco "Continuation flood", che riguarda diverse implementazioni del protocollo HTTP/2, tra cui Apache httpd, Apache Traffic Server, Node.js, oghttp, Go net/http2, Envoy, oghttp e nghttp2. La vulnerabilità può essere sfruttata per attacchi a server che supportano HTTP/2.0 e, a seconda dell'implementazione, porta a un esaurimento della memoria (interruzione dell'elaborazione delle richieste o arresto anomalo dei processi) o alla creazione di un carico elevato sulla CPU (rallentamento dell'elaborazione delle richieste). Secondo il ricercatore che ha scoperto la vulnerabilità, il problema rilevato è più pericoloso rispetto alla vulnerabilità "Rapid Reset" trovata lo scorso anno, utilizzata per realizzare alcuni dei più grandi attacchi DDoS fino a quel momento.
L'alto livello di pericolo è spiegato dal fatto che per compromettere il funzionamento server, provocare un arresto anomalo o una seria riduzione delle prestazioni è sufficiente generare un flusso di richieste opportunamente formulate da un normale computer. In alcuni casi, per eseguire l'attacco, basta anche una sola connessione TCP. Inoltre, il traffico legato all'esecuzione dell'attacco non si distingue in alcun modo nei log rispetto alle normali richieste degli utenti.
La vulnerabilità è causata dalle peculiarità nella gestione dei frame HEADERS e CONTINUATION nelle richieste tramite il protocollo HTTP/2. I frame HEADERS vengono utilizzati in HTTP/2 per trasmettere gli header HTTP, mentre i frame CONTINUATION servono a suddividere l'invio degli header HTTP in più fasi (ad esempio, quando gli header non possono essere contenuti in un solo frame o quando si devono prima inviare gli header che possono essere completati in questa fase, per poi inviare gli header di cui i valori non possono essere ancora determinati). Quando gli header vengono trasmessi in più fasi, inizialmente viene inviato un frame HEADERS senza il flag END_HEADERS, seguito da più frame CONTINUATION con ulteriori header e termina la lista un frame CONTINUATION con il flag END_HEADERS.
Il metodo di attacco consiste nell'inviare un flusso ininterrotto di frame CONTINUATION senza impostare il flag END_HEADERS. Tale attività porta alla trasmissione di server un gran numero di intestazioni che il server memorizza nella memoria volatile fino a quando la memoria disponibile al processo non è esaurita. Per creare un alto carico sulla CPU, oltre all'esaurimento della memoria, l'attaccante può sfruttare la compressione del contenuto dei frame CONTINUATION utilizzando il formato HPACK, la cui解析 richiede calcoli. Nelle implementazioni del protocollo HTTP/1.1, per proteggersi dagli attacchi di flooding con le intestazioni, è stato applicato un limite alla dimensione delle intestazioni e un timeout per il tempo di invio della connessione. Per HTTP/2, a causa della complessità del protocollo, molte implementazioni non hanno previsto metodi simili di protezione contro l'invio infinito di intestazioni.
La vulnerabilità rappresenta il pericolo maggiore per gli utenti di Node.js (CVE-2024-27983), poiché questa implementazione consente di provocare un crash inviando solo pochi frame al server. A causa di una situazione di race condition in Node.js, per attivare il crash tramite il controllo Assert, è sufficiente chiudere la connessione durante l'invio di un flusso incompleto di intestazioni (crash se nel momento della chiusura delle connessioni non è ancora arrivato un frame CONTINUATION con il flag END_HEADERS). La vulnerabilità è stata corretta in Node.js 18.20.1, 21.7.2 e 20.12.1, nonché nelle recenti versioni delle librerie llhttp e undici. Nelle nuove versioni di Node.js è stata anche corretta una vulnerabilità meno pericolosa (CVE-2024-27982) di tipo "request smuggling", che permette di infiltrarsi nel contenuto delle richieste di altri utenti manipolando il valore di "Content Length", elaborato nello stesso thread tra il frontend e il backend.
Vulnerabilità legate alla gestione dei CONTINUATION in altre implementazioni di HTTP/2.0:
- oghttp (CVE-2024-27919) — consumo di memoria illimitato.
- Tempesta FW (CVE-2024-2758) — bypass delle restrizioni.
- Libreria PHP amphp/http, amphp/http-client e amphp/http-server (CVE-2024-2653) — consumo di memoria illimitato, fino all'esaurimento totale della memoria disponibile.
- Pacchetto Go net/http (CVE-2023-45288) — creazione di un alto carico sulla CPU.
- Libreria nghttp2 (CVE-2024-28182) — attivazione di un attacco di denial of service.
- Apache Httpd (CVE-2024-27316) — consumo eccessivo di memoria e creazione di carico sulla CPU.
- Apache Traffic Server (CVE-2024-31309) — consumo eccessivo di risorse.
- Envoy (CVE-2024-30255) — creazione di un alto carico sulla CPU (per un carico completo di un core della CPU è necessaria una connessione di 300Mbit/s).
Fonte: opennet.ru
