Node.js: 16 vulnerabilità, falle HTTP/2 e perdite di memoria

Node.js: 16 vulnerabilità, falle HTTP/2 e perdite di memoria

Node.js ha corretto 16 vulnerabilità nei rami 22.x, 24.x e 26.x, incluse diverse che consentono a client non autenticati di bloccare server HTTP/2 o di indurli a esporre memoria appartenente ad altre connessioni. Le patch sono state pubblicate l'11 novembre nelle versioni 22.23.5, 24.22.3 e 26.13.1.

Il Progetto Node.js ha pubblicato gli aggiornamenti di sicurezza per i tre rami attivi. La distribuzione delle vulnerabilità tra i rami non è uniforme: l'elenco riguarda i rami 24.x e 26.x in tutte le sue 16 voci, mentre il ramo 22.x è interessato da 11 vulnerabilità, secondo il dettaglio pubblicato da 窓の杜. La gravità si suddivide in sette falle alte, sei medie e tre basse.

La maggiore concentrazione riguarda il codice dei server HTTP/2, HTTPS e TLS incluso in Node.js. Il rischio dipende da come è realizzato il server: alcune falle si attivano con una configurazione predefinita, mentre altre richiedono percorsi, callback o metodi specifici. Le patch aggiornano anche dipendenze come llhttp, undici e SQLite.

HTTP/2: dall'arresto del processo alla fuga di risposte

CVE-2026-123863 consente a un client non autenticato di provocare l'arresto del processo tramite un server HTTP/2 predefinito. È sufficiente che il server risponda prima di aver ricevuto l'intero corpo della richiesta, un comportamento che il progetto descrive come comune. L'attacco funziona sia su TLS sia su connessioni non cifrate e interessa i rami 24.x e 26.x.

Il problema si verifica durante la chiusura di una sessione HTTP/2: uno stream può conservare buffer di intestazioni allocati da nghttp2 dopo essere stato rimosso dall'insieme degli stream della sessione. Quando la sessione viene distrutta, un controllo interno rileva che la memoria contabilizzata non è pari a zero e termina il processo. Il progetto lo identifica come una variante di CVE-2024-27983, la cui precedente correzione non copriva questo caso.

Un'altra vulnerabilità alta, CVE-2026-123865, fa sì che memoria e descrittori di file rimangano trattenuti indefinitamente. L'attaccante può avviare la chiusura remota con un messaggio GOAWAY(NO_ERROR) e poi provocare un errore di protocollo, per esempio con un'intestazione di frame troppo grande. La sessione rimane bloccata e il socket resta nello stato CLOSE_WAIT; la falla interessa tutti e tre i rami attivi.

Le fughe di dati si verificano anche con CVE-2026-123866, un uso dopo il rilascio della memoria durante la distruzione di uno stream HTTP/2. Se la scrittura è ancora bloccata dalla contropressione quando lo stream viene distrutto — per esempio dopo un RST_STREAM del client o la scadenza di un timeout del server —, il socket può inviare memoria già liberata invece della risposta prevista. Tale memoria può includere buffer di risposta di altre connessioni.

Nei rami 24.x e 26.x, un client può innescare la falla autonomamente dopo le modifiche alle dimensioni della finestra introdotte nelle versioni 24.22.0 e 26.9.0. In tutti e tre i rami è possibile attivarla anche se l'applicazione distrugge lo stream, per esempio alla scadenza del timeout di inattività.

CVE-2026-123874 consente di corrompere la memoria del server quando questo invia file tramite stream.respondWithFile() o stream.respondWithFD(). Se il client reimposta lo stream mentre una scrittura è ancora in coda, l'oggetto può essere liberato prima che l'operazione sia terminata e poi utilizzato come se fosse ancora valido. La falla interessa i rami 24.x e 26.x, sia con TLS sia senza cifratura. Un problema correlato, CVE-2026-123875, può bloccare tutti e tre i rami se il client annulla un download servito con questi metodi.

Anche HTTPS e TLS possono esporre dati

Nei server HTTPS, CVE-2026-123864 consente a un client non autenticato di leggere memoria appartenente ad altre connessioni. Il Progetto Node.js avverte che questa potrebbe includere chiavi private TLS e richieste di altri utenti. Perché si verifichino le condizioni necessarie, il gestore deve chiamare res.flushHeaders() prima che sia arrivato l'intero corpo e poi eseguire res.end() con dei dati; per ottenere la memoria divulgata serve inoltre un percorso che restituisca o memorizzi i corpi delle richieste.

La falla deriva da una scrittura TLS di lunghezza zero che rientra nell'analizzatore HTTP mentre questo elabora il corpo. Tale rientro causa un uso dopo il rilascio della memoria e una lettura oltre i limiti dell'heap, che il server può copiare nella risposta a quella richiesta. Interessa tutti e tre i rami attivi; i server HTTP non cifrati creati con node:http non sono interessati.

Un'altra falla alta, CVE-2026-123872, interessa i server TLS che applicano requisiti diversi per i certificati client a seconda del nome host. Durante una rinegoziazione TLS 1.2, un client autenticato per un host consentito può modificare il nome del server e trasferire tale autenticazione a un host con regole più restrittive. Tutti e tre i rami attivi sono interessati.

Nei rami 24.x e 26.x, CVE-2026-126051 consente di bloccare un server TLS se utilizza gli hook SNICallback, OCSPRequest, newSession o resumeSession, oppure il metodo server.addContext(). Il problema riguarda callback differiti che non considerano la possibilità che il socket venga distrutto prima della loro esecuzione. Il progetto descrive una sequenza in cui un ClientHello e la chiusura del socket arrivano nello stesso ciclo, causando un'eccezione non gestita.

Esistono altri due bypass nella configurazione TLS. CVE-2026-123867 può consentire a un certificato accettato dall'autorità di certificazione predefinita di raggiungere un host che avrebbe dovuto richiedere un'altra CA, quando viene configurato un contesto SNI che imposta solo la CA e non un certificato server. CVE-2026-123877, invece, interessa https.Agent: una sessione TLS memorizzata con una policy di attendibilità più ampia può essere riutilizzata in una richiesta successiva con una policy più restrittiva. Entrambe le falle interessano tutti e tre i rami attivi.

Node.js 16 vulnerabilidades: fallos HTTP/2 y fugas de memoria
© Node.js Project

Memoria, credenziali e permessi

Il gruppo comprende anche una falla di gravità media, CVE-2026-123868, che consente di esaurire la memoria nei server HTTP/2 dei rami 24.x e 26.x. I dati in ingresso che rimangono nella coda di lettura di uno stream non vengono conteggiati nel budget della sessione. Il progetto spiega che un attaccante può inviare circa 10 byte per frame mentre il server ne trattiene circa 114; in questo modo, decine di megabyte inviati possono trasformarsi in centinaia di megabyte trattenuti. Il limite maxSessionMemory non arresta questa crescita.

È presente anche un overflow di un byte in session.altsvc() (CVE-2026-123828), nei rami 24.x e 26.x, quando l'applicazione fornisce un'origine lunga e controllata dall'attaccante. L'errore può corrompere la memoria e causare l'interruzione del processo. In tutti e tre i rami, CVE-2026-123871 espone le credenziali del proxy nei messaggi ERR_PROXY_INVALID_CONFIG: alcuni percorsi di errore inserivano l'URL completo, con nome utente e password, in messaggi che possono finire in stderr, nei log dei container o nei servizi di segnalazione degli errori.

Le tre falle di gravità bassa completano il conteggio. CVE-2026-123829 può rivelare nomi di file e directory che il processo non è autorizzato a leggere quando si utilizza fs.watch() ricorsivo su macOS o Windows. L'elenco di 窓の杜 include anche CVE-2026-123862, un problema di zlib per cui la combinazione di una chiamata params() in sospeso con destroy() provoca un errore interno non intercettabile, e CVE-2026-106071, descritto come un'eccessiva concessione di permessi sul file system tramite una ricerca radix con caratteri jolly.

RamoVersione correttaVulnerabilità che lo interessano
22.x22.23.511
24.x24.22.316
26.x26.13.116

Gli aggiornamenti delle dipendenze accompagnano le patch di Node.js. 窓の杜 indica llhttp 9.4.4 per i rami 22.x, 24.x e 26.x; undici 8.12.4 e 7.30.2 per i rami 26.x e 24.x; SQLite 3.54.1 per tutti e tre i rami; e Brotli 1.2.1 per i rami 24.x e 26.x. Il Progetto Node.js menziona gli aggiornamenti di llhttp, undici e SQLite, senza indicare i numeri di versione nel proprio avviso.

Le patch non coprono i rami fuori supporto

Le versioni corrette sono 22.23.5, 24.22.3 e 26.13.1. Heroku ha annunciato di averle rese disponibili per le build sulla propria piattaforma l'11 novembre. L'avviso del Progetto Node.js specifica che i rami fuori supporto, inclusi 20.x e 25.x, non ricevono correzioni con questa pubblicazione e rimangono vulnerabili.

Il progetto indica che aggiornare alla versione corretta di ciascun ramo è l'unica soluzione inclusa nel suo avviso: non propone misure temporanee per i server che non possono ancora farlo. Inoltre, non segnala attacchi che abbiano sfruttato queste vulnerabilità né specifica se i server che potrebbero aver esposto chiavi TLS o altri segreti debbano sostituirli dopo l'aggiornamento.

Fonti: The Hacker News, Progetto Node.js, Autorità di numerazione CVE della OpenJS Foundation, 窓の杜, Heroku Dev Center