Pular para o conteúdo principal

The Identity at the Core

A crônica definitiva da gestão de identidades e acessos

Traduzido automaticamente do original em inglês. A redação pode conter imperfeições. Leia o original em inglês

Depois do PHP2Shell, Chega Seu Primo: Node2Shell

Conheça o Node2Shell (CVE-2026-111497): como uma falha de memória nativa no Brotli do Node.js transforma dados comprimidos não confiáveis em RCE, e por que o IAM de workload é o verdadeiro alvo.

Por Paulo Barrilli
5 min de leitura87 visualizações0 comentários

Se você achava que o departamento de marketing de segurança ia tirar o resto da semana do Halloween de folga depois do PHP2Shell, tenho uma má notícia. Poucas horas após os advisories do PHP serem publicados em 21 de outubro, uma segunda vulnerabilidade ganhou nome nas redes sociais: "Node2Shell."

Desta vez, o alvo é o CVE-2026-111497 (), uma vulnerabilidade de alta a crítica divulgada na versão de segurança do Node.js de 21 de outubro de 2026. Assim como seu primo PHP2Shell, o branding está fazendo muito esforço (o próprio Node.js nunca usou o nome "Node2Shell" em seu advisory), e mais uma vez a história real está por baixo do hype: uma falha de corrupção de memória em C/C++ nativo enterrada sob uma linguagem de script com segurança de memória, pronta para entregar a um atacante as chaves de qualquer identidade de serviço que o runtime possua.

Vamos ver o que o registro do CVE e os advisories oficiais realmente confirmam, onde está a exposição real, e por que esta semana é uma aula magistral de risco de identidade de workload.

O Que o Registro do CVE Realmente Diz

Apesar da fantasia "2Shell" combinando, o CVE-2026-111497 não é um bug de injeção de JavaScript, nem é exclusivo do Node.js. É uma escrita fora dos limites (CWE-787) na biblioteca de compressão Brotli upstream do Google (versões 1.0.3 a 1.2.0), que o Node.js empacota dentro de seu runtime.

Esses são os fatos verificados até agora:

  • A Falha: Quando o decodificador Brotli processa um stream comprimido malformado e especialmente criado, ele falha em interromper a execução em entradas inválidas e escreve além do final de seu buffer de memória alocado (corrigido via commit upstream do Brotli 0ed4268a).

  • A Pontuação: O registro do CVE do Google atribui uma pontuação CVSS v4.0 de 9.2 (Crítica), enquanto o advisory de segurança do Node.js a classifica como Alta e avisa explicitamente que o impacto inclui Execução Remota de Código (RCE).

  • As Pré-condições: Sua aplicação está exposta se descomprime dados Brotli não confiáveis. Isso ocorre diretamente se seu código chama os métodos de descompressão Brotli do node:zlib (zlib.brotliDecompress, createBrotliDecompress) em payloads fornecidos pelo usuário, ou automaticamente quando o fetch() nativo do Node (Undici) recebe uma resposta HTTP com Content-Encoding: br de um servidor upstream não confiável ou controlado pelo atacante.

  • O Raio de Impacto Além do Node: Como o bug existe no Brotli upstream, o Bun (corrigido na v1.4.4) e os pacotes Brotli / brotlicffi do Python (corrigidos na 1.2.1) também publicaram atualizações emergenciais em 22 de outubro.

  • Versões do Node Afetadas e Corrigidas: O Node.js corrigiu a falha em 21 de outubro nas versões v22.23.4, v24.22.1 e v26.12.1. Crucialmente, o Node.js 20 e versões anteriores chegaram ao End of Life e não receberão correções upstream. Isso cria um enorme ponto cego operacional, dado quantos containers de produção e funções serverless ainda fixam o Node 20.

  • Status de Exploração: Embora múltiplos repositórios de Proof of Concept (PoC) tenham aparecido no GitHub em 22 de outubro e pesquisadores tenham demonstrado execução intermitente de código contra containers Node 24 sem patch, o catálogo Known Exploited Vulnerabilities (KEV) da CISA () ainda lista a exploração ativa como "nenhuma".

A Rivalidade Entre Irmãos: Por Que o Node2Shell É Ainda Mais Sorrateiro para o IAM

Se o PHP2Shell foi uma invasão frontal contra servidores web legados e modernos, o Node2Shell mira no tecido conjuntivo das arquiteturas cloud modernas: API gateways, proxies de filtragem SSRF, processadores de webhook, camadas Backend for Frontend (BFF) e orquestradores de agentes de IA que fazem fetch() de URLs externas em nome dos usuários.

E o que mais foi publicado exatamente nesse mesmo lote de segurança do Node.js de 21 de outubro?

  • CVE-2026-105482: Uma falha de truncamento na resolução de DNS (dns.resolve*) via bytes NUL embutidos que permite a um atacante passar por uma verificação de allowlist para um domínio enquanto consulta outro.

  • CVE-2026-106069 e CVE-2026-105483: Dois bypasses de verificação de hostname TLS (tls.checkServerIdentity) envolvendo endereços IP não canônicos e Unicode de largura total.

  • CVE-2026-106073: Um bypass em fs.realpathSync contra o Permission Model embutido do Node.

Juntando tudo isso, você enxerga a cadeia dos sonhos do atacante: burlar um allowlist de URL ou uma verificação TLS para enganar um serviço Node.js a buscar um endpoint controlado pelo atacante, retornar um payload malicioso com Content-Encoding: br, acionar a escrita fora dos limites do Brotli em código C nativo e ultrapassar o sandbox do JavaScript.

O Prêmio de Identidade Dentro de um Processo Node.js

Uma vez que um exploit pousa em um worker Node.js, o atacante não precisa soltar um .php web shell clássico em disco (MITRE ATT&CK T1505.003) quando o process.env já está na memória. Em ambientes de microsserviços e serverless modernos, um runtime Node comprometido é uma mina de ouro de identidades:

  • Proliferação do process.env: Entre em praticamente qualquer container Node.js e despeje as variáveis de ambiente. Você encontrará AWS_SECRET_ACCESS_KEY, DATABASE_URL, STRIPE_SECRET_KEY, chaves de assinatura JWT internas e tokens OAuth de terceiros em texto simples na memória.

  • Identidade de Workload Cloud e Metadata: Se aquele serviço Node roda no Kubernetes ou ECS sem escopo estrito de pod ou task role, ou em EC2 com IMDSv1 habilitado (), um atacante que sequestra o processo Node herda imediatamente a IAM role cloud vinculada ao nó de computação.

  • Confiança de Saída por Padrão: Ao contrário dos workers PHP tradicionais que raramente precisam chamar URLs externas, os serviços Node são construídos para se comunicar com tudo. Um payload malicioso executando dentro do binário node se mistura perfeitamente ao tráfego HTTPS de saída normal, a menos que você aplique filtragem estrita de egresso e tokens de curta duração vinculados a audiências específicas.

O Que Fazer Antes de Segunda-feira

Primeiro, faça patch do runtime, não apenas do seu package.json. Como o Brotli é compilado no próprio binário do Node.js, o npm audit fix não vai te salvar. Você precisa reconstruir suas imagens de container base e atualizar os runtimes para Node.js 22.23.4, 24.22.1 ou 26.12.1 (e Bun 1.4.4 ou Brotli 1.2.1 onde aplicável). Se você ainda está no Node 20, este é o seu alerta de que End of Life significa RCE sem correção.

Segundo, se você não consegue aplicar patch em um serviço hoje à noite e ele busca URLs externas não confiáveis ou aceita uploads comprimidos, remova br dos cabeçalhos Accept-Encoding de saída e bloqueie Content-Encoding: br de entrada no seu WAF ou reverse proxy até que o runtime seja atualizado.

Por fim, use o PHP2Shell e o Node2Shell como um exercício de tabletop duplo para seu time de identidade. Duas linguagens completamente diferentes e dois bugs de memória C nativo foram publicados exatamente no mesmo dia, e ambos terminam com exatamente a mesma pergunta: "Quando o runtime é enganado a executar o código de um estranho, quais permissões deixamos por aí para ele herdar?"

Reduza a IAM role, mova segredos de longa duração para fora do process.env e audite suas identidades de máquina. Na semana que vem, haverá outro bug "2Shell", e ele não vai se importar em qual linguagem você escreveu sua aplicação.

#node2shell#cve2026111497#php2shell#nodejs#brotli#workloadidentity#iam#secretsmanagement
Compartilhar:XLinkedInFacebook

Seja o primeiro a comentar

Somente para membros: cadastre-se se tiver algo que valha a pena dizer.

Nenhum comentário ainda.