A família 2Shell cresceu: depois do PHP, pesquisadores demonstraram execução remota de código no Node.js, com build oficial no alvo. O nome que os pesquisadores deram: Node2Shell.
O caso é da Imperva. O alvo era a imagem oficial do Node 24.22.0 para Linux arm64, sem depurador e sem build customizado, e o caminho foi o decoder Brotli que o runtime carrega embutido, CVE-2026-111497. O Node divulgou a falha e publicou a correção em 21 de outubro, o mesmo dia do patch de emergência do PHP, e a versão 24.22.1 rejeita os mesmos dados que executavam código na anterior.
Como a aplicação chega ao decoder que ninguém escolheu
O decoder Brotli existe nas linhas 22.x, 24.x e 26.x, e a aplicação alcança por dois caminhos que quase ninguém lista no inventário: lendo uma resposta comprimida com Brotli pelo fetch() nativo, ou recebendo um corpo de requisição Brotli decodificado por middleware (o Express 5 decodifica nos parsers de corpo, ao lado de gzip e deflate).
Servidor Node puro, sem middleware, não decodifica por conta própria. Mas quem usa framework, usa. E o decoder não foi escolhido: veio embutido no runtime, o que é a definição de superfície de ataque que inventário de pacote declarado não enxerga.
A calibragem honesta da exploração
A primeira prova de conceito pública só executou código num build propositalmente enfraquecido, e na build padrão o autor reportou crash e leitura limitada de memória. A demonstração da Imperva atravessou essa linha no build oficial, mas precisou de várias tentativas, e não há exploração na natureza reportada até 22 de outubro.
A calibragem importa porque define a prioridade: RCE demonstrado no build oficial com várias tentativas é correção desta semana; prova de conceito em build enfraquecido é correção do ciclo. As duas atualizam; a urgência é diferente.
O que fazer
- Atualizar para a 24.22.1, lembrando que imagens de container e artefatos que embutem o binário do Node precisam de atualização própria, que inventário de pacote sozinho não pega.
- Mapear as linhas fora de suporte: a 20.x e anteriores não recebem a correção e ficam expostas.
- Limitar tráfego Brotli não confiável na borda enquanto a atualização alcança o parque: Imperva e Vercel já publicaram regras.
- Descer o inventário até o binário: imagem de container, decoder embutido, versão de linha e data de fim de vida.
Conclusão
A semana desenhou o mapa: PHP, kernel e agora o decoder que ninguém escolheu instalar. O perímetro do serviço inclui o que o runtime carrega dentro, e o inventário que só olha pacote declarado não enxerga esse andar.
A família 2Shell provavelmente ganhará mais membros, porque a técnica (caminho até um decoder embutido com dado hostil) não é específica de runtime. A defesa que sobrevive à família é o inventário que desce até o binário e a borda que filtra o que o runtime vai decodificar.