Il 24 agosto 2026 il TrendAI Zero Day Initiative ha reso pubblica l'advisory ZDI-26-590, che documenta una vulnerabilità di esecuzione codice remoto in libwebsockets, libreria C leggera per WebSocket e HTTP ampiamente integrata in firmware embedded e dispositivi IoT. La falla risiede nel parsing dell'header path HTTP/2 HPACK: l'assenza di un bounds check nella funzione lws_frag_append() consente a un attaccatore remoto di scrivere oltre i limiti di un buffer allocato, ottenendo l'esecuzione arbitraria di codice nel contesto del processo server. La segnalazione al vendor è avvenuta il 3 luglio 2026; la pubblicazione coordinata avviene oggi con patch disponibile.
- La vulnerabilità ZDI-26-590 (CVE-2026-19773, riservato) consente RCE remoto non autenticato su installazioni di libwebsockets che utilizzano HTTP/2
- La root cause è un bounds check mancante in
lws_frag_append()durante il parsing HPACK del path header, con conseguente out-of-bounds write - La patch, verificabile nel commit 8241518 del repository GitHub, aggiunge un singolo controllo sulla dimensione massima dei dati header prima dell'incremento del puntatore
- L'advisory ZDI non specifica punteggio CVSS né elenco versioni affette; non risultano documentati exploit in-the-wild al momento della pubblicazione
Il difetto nel parser HTTP/2 HPACK
Il nucleo della vulnerabilità si colloca nel percorso di elaborazione dei frame HTTP/2 in libwebsockets. Il protocollo HTTP/2 utilizza HPACK per comprimere gli header della richiesta; nel parsing del campo path, la funzione lws_frag_append() in lib/roles/h2/hpack.c incrementa il puntatore ah->pos senza verificare che la posizione risulti ancora entro i limiti del buffer ah->data, dimensionato secondo max_http_header_data.
L'advisory ZDI descrive il meccanismo con precisione: "The issue results from the lack of proper validation of user-supplied data, which can result in a write past the end of an allocated buffer". Questa condizione apre una finestra per la corruzione della memoria heap o stack adiacente, a seconda della configurazione di compilazione e dell'architettura target.
La gravità è amplificata dalla natura non autenticata dell'attacco. Come riporta la stessa fonte: "Authentication is not required to exploit this vulnerability". Ogni endpoint esposto a Internet che impieghi libwebsockets con HTTP/2 abilitato risulta potenzialmente raggiungibile senza prerequisiti di accesso.
La patch di una sola riga e il suo significato
Il commit 8241518 nel repository ufficiale di libwebsockets, identificato come risposta al caso ZDI-CAN-31036, contiene una modifica chirurgica. Prima dell'operazione ah->data[ah->pos++], il codice aggiunge il controllo:
"if ((unsigned int)ah->pos >= wsi->a.context->max_http_header_data)" — Commit patch libwebsockets 8241518
Se la condizione risulta vera, la funzione interrompe l'elaborazione restituendo un errore. La natura minimalista della correzione—una singola riga condizionale—mette in luce la fragilità strutturale del parser originale e la densità di impatto che può derivare da un'omissione apparentemente marginale.
Il commit attribuisce la scoperta a Maher Azzouzi in collaborazione con il TrendAI Zero Day Initiative. La timeline documenta circa sette settimane di coordinamento tra segnalazione e pubblicazione, un intervallo compatibile con il ciclo standard di disclosure responsabile gestito da ZDI.
Perché la libreria libwebsystems espone un'ampia superficie
libwebsockets è progettata per ambienti con risorse limitate: il suo footprint ridotto in memoria e assenza di dipendenze esterne pesanti la rendono candidata naturale per router, dispositivi IoT, gateway industriali e applicazioni server embedded che richiedono contemporaneamente HTTP, HTTP/2 e WebSocket. Questa distribuzione capillare si traduce in una superficie di attacco geograficamente e sectorialmente dispersa, spesso sotto il controllo diretto di team di firmware piuttosto che di operatori di sicurezza dedicati.
L'advisory ZDI non elenca versioni specifiche affette. Questa assenza costituisce un limite operativo rilevante: gli integratori non dispongono di un criterio immediato per discriminare tra build vulnerabili e non. La verifica ricade sull'analisi del codice sorgente o sulla presenza del commit 8241518 nella storia del repository locale.
La fonte non specifica inoltre se HTTP/2 sia abilitato di default nelle configurazioni standard di libwebsockets o se richieda un'attivazione esplicita in fase di compilazione. Questo dato mancante incide sulla valutazione del rischio istantaneo per sistemi legacy che potrebbero non esporre il servizio HTTP/2.
Cosa fare adesso
Le azioni seguenti discendono direttamente dai fatti documentati nel dossier e nelle fonti primarie:
- Verificare la presenza del commit 8241518 nella versione di libwebsockets in uso; se assente, pianificare l'aggiornamento alla versione che include la correzione
- Controllare se la build locale di libwebsockets include il supporto HTTP/2; se HTTP/2 non è necessario per l'applicazione, valutare la disabilitazione in compilazione come riduzione della superficie
- Ispezionare i log di accesso per richieste HTTP/2 anomale che possano indicare tentativi di exploit contro il path header, tenendo presente che nessuna signature specifica è documentata nelle fonti
- Contattare i maintainer dei progetti upstream che dipendono da libwebsockets per verificare lo stato di integrazione della patch nei rispettivi cicli di release
Un pattern ricorrente nei parser di protocolli binari
La struttura di questa vulnerabilità rientra in una famiglia ben documentata: parser di protocolli complessi che delegano la gestione dei limiti al chiamante, con il chiamante che non effettua il controllo. HPACK, in particolare, richiede la decodifica di campi di lunghezza variabile con riferimento a tabelle dinamiche; questa complessità intrinseca aumenta la probabilità di errori di confinamento nei buffer di accumulo.
Il caso ZDI-26-590 aggiunge un esempio contemporaneo a una cronologia che include vulnerabilità simili in implementazioni HTTP/2 di vendor diversi. La differenza qui risiede nella penetrazione verticale di libwebsockets in ecosistemi dove il ciclo di patch è condizionato dai tempi del firmware, non dell'infrastruttura cloud.
L'assenza di un punteggio CVSS e di un elenco versioni affette nel testo dell'advisory ZDI costituisce una lacuna informativa che rallenta la prioritizzazione automatica da parte dei sistemi di vulnerability management. Gli operatori dovranno compensare con analisi manuale del codice o con il tracciamento del commit specifico.
Fonti
- http://www.zerodayinitiative.com/advisories/ZDI-26-590/
- http://www.zerodayinitiative.com/advisories/published/
- https://www.cve.org/CVERecord?id=CVE-2026-19773
- http://www.zerodayinitiative.com/advisories/upcoming/
- https://github.com/warmcat/libwebsockets/commit/824151862f37bc72f46d9a3e01d5b9408d313a0b
- https://www.trendmicro.com/
Le informazioni sono state verificate sulle fonti citate e aggiornate al momento della pubblicazione.