I ricercatori delle aziende Netflix e Google hanno riscontrato otto vulnerabilità in diverse implementazioni del protocollo HTTP/2, che consentono di provocare un'interruzione del servizio inviando flussi di richieste di rete formattati in un certo modo. I problemi, in misura variabile, interessano la maggior parte dei server HTTP che supportano HTTP/2 e portano all'esaurimento della memoria disponibile per il lavoro o all'eccessivo carico sulla CPU. Gli aggiornamenti per risolvere queste vulnerabilità sono già stati rilasciati in e , ma fino ad ora per Apache httpd e .
I problemi sono stati causati da complicazioni introdotte nel protocollo HTTP/2, legate all'uso di strutture binarie, a un sistema di limitazione dei flussi di dati all'interno delle connessioni, al meccanismo di prioritizzazione dei flussi e alla presenza di messaggi di controllo simili a ICMP, operanti a livello di connessione HTTP/2 (ad esempio, operazioni di ping, reset e configurazione del flusso). Molte implementazioni non limitavano adeguatamente il flusso di messaggi di controllo, organizzavano in modo inefficace il lavoro della coda delle priorità durante l'elaborazione delle richieste o utilizzavano implementazioni poco ottimali degli algoritmi di controllo del flusso.
La maggior parte dei metodi di attacco identificati consiste nell'inviare richieste specifiche al server, che portano alla generazione di un gran numero di risposte. Se, in questo contesto, il client non legge i dati dal socket e non interrompe la connessione, la coda di buffering delle risposte sul lato server si riempie continuamente. Tale comportamento genera un carico sul sistema di gestione delle code di elaborazione delle connessioni di rete e, a seconda delle caratteristiche di implementazione, può portare all'esaurimento della memoria disponibile o delle risorse CPU.
Vulnerabilità identificate:
- CVE-2019-9511 (Data Dribble) — l'attaccante richiede un grande volume di dati in più thread, manipolando la dimensione della finestra di scorrimento e la priorità del thread, costringendo il server a mettere i dati in coda a blocchi di 1 byte;
- CVE-2019-9512 (Ping Flood) — l'attaccante inonda continuamente il server con messaggi ping attraverso una connessione HTTP/2, causando il riempimento della coda interna delle risposte inviate dall'altra parte;
- CVE-2019-9513 (Resource Loop) — l'attaccante crea diversi thread di richieste e modifica continuamente la priorità dei thread, causando una mescolanza dell'albero delle priorità;
- CVE-2019-9514 (Reset Flood) — l'attaccante crea diversi thread
e invia attraverso ogni flusso una richiesta non corretta, causando l'invio da parte del server dei pacchetti RST_STREAM, ma non li accetta per riempire la coda delle risposte; - CVE-2019-9515 (Settings Flood) — l'attaccante invia un flusso di pacchetti vuoti "SETTINGS", a cui il server è obbligato a confermare la ricezione di ogni richiesta;
- CVE-2019-9516 (0-Length Headers Leak) — l'attaccante invia un flusso di intestazioni con nome nullo e valore nullo, e il server assegna un buffer in memoria per ciascuna intestazione e non lo libera fino alla fine della sessione;
- CVE-2019-9517 (Internal Data Buffering) — l'attaccante apre
una finestra scorrevole HTTP/2 per inviare dati dal server senza limitazioni, ma tiene la finestra TCP chiusa, impedendo così di scrivere effettivamente i dati nel socket. Successivamente, l'attaccante invia richieste che richiedono una grande risposta; - CVE-2019-9518 (Empty Frames Flood) — l'attaccante invia un flusso di pacchetti di tipo DATA, HEADERS, CONTINUATION o PUSH_PROMISE, ma con un contenuto utile vuoto e senza flag di chiusura del flusso. Il server spende tempo per elaborare ciascun pacchetto, in modo sproporzionato rispetto alla larghezza di banda utilizzata dall'attaccante.
Fonte: opennet.ru
