Ir para o conteúdo principal
ArchPrompts
Voltar ao blog
Caderno técnico / Nota de campo

Radar Tech: o CVE que mora no seu grafo de dependências e não no seu código

Uma falha crítica no decodificador Brotli atravessou Node.js, Python, curl, Bun, Envoy e Istio em 48 horas — e as ferramentas de varredura não a viram. O incidente revela o componente sem dono que quase todo time tem: capacidade de runtime herdada de uma dependência transitiva.

João Gabriel
5 min de leitura
Radar Tech: o CVE que mora no seu grafo de dependências e não no seu código
AP / Prancha visual 01
Leitura principal

O que aconteceu

O CVE-2026-111497 saiu pelo Node.js e ganhou apelido de node2shell: falha de escrita fora dos limites (out-of-bounds write) no decodificador de Brotli da Google, CVSS 4.0 de 9.2. Em 24 horas, a mesma falha atravessou o ecossistema: pacotes Python, libbrotli, curl, Bun, Envoy e Istio. Patches existem, mas o detalhe que importa para arquitetura não é a lista de versões — é que a falha estava no seu grafo de dependências sem aparecer em nenhum lugar que você lê.

Três fatos do incidente merecem atenção de quem desenha sistema:

  • Ele é bidirecional. Um cliente malicioso derruba o servidor; um servidor malicioso derruba o cliente que aceita resposta comprimida. Não é um problema de borda, é de toda chamada HTTP de saída.
  • Não requer import. Se Brotli ou brotlicffi estiver instalado, requests, httpx, urllib3 e aiohttp passam a anunciar Accept-Encoding: br e a decodificar respostas sozinhos. O código da aplicação nunca menciona Brotli.
  • A ferramenta de varredura não vê. Na data do anúncio, o CVE não estava mapeado para nenhum dos dois pacotes PyPI. pip-audit, Dependabot e afins reportavam limpo enquanto o decodificador vulnerável rodava em produção.

A raiz técnica é prosaica e por isso vale ser contada: uma função que decide o tipo de bloco retornava um booleano, e falso significava tanto "o fluxo está malformado" quanto "preciso de mais bytes". O chamador não conseguia distinguir as duas coisas — e no caminho rápido descartava o retorno inteiro. Fluxo forjado força uma troca de bloco impossível, o decodificador continua com o estado antigo e escreve fora do buffer. O bug foi encontrado em fevereiro e corrigido no código-fonte, mas ninguém o classificou como falha de segurança, então nenhum release levou o conserto até esta semana. Um conserto que não vira release não protege ninguém.

O problema de arquitetura: o decodificador tem dono?

Quando a notícia chega, a pergunta habitual é "quais serviços usam Brotli?". Ela é a pergunta errada, e é por isso que a resposta sai vazia ou absurda — às vezes os dois.

O componente vulnerável não é código seu. É capacidade de runtime herdada de uma dependência transitiva, carregada por um extra (httpx[brotli]), por um wheel compilado numa imagem que ninguém reconstrói, ou pelo pacote do sistema operacional que veio com o vendor. Ele tem três propriedades que o tornam invisível:

  • Não aparece no código. Não há import brotli para o grep achar. O caminho de execução é escolhido por um header (Content-Encoding: br) que um servidor externo decide enviar.
  • Não aparece na política. SBOM lista pacote, raramente lista quem decidiu aceitar aquele formato. "Temos SBOM" e "sabemos onde decodificamos Brotli" são afirmações diferentes.
  • Muda de dono. Numa imagem, o dono é o time da imagem; num servidor gerenciado, é o fornecedor; num binário compilado, é quem assina o build. Três notificações possíveis, nenhuma garantida.

A consequência é a pergunta de arquitetura que realmente decide o incidente: quem é o dono do formato que você aceita decodificar? Se nenhuma pessoa responde com nome, você não tem um problema de patch — tem um componente sem dono, e o próximo CVE de descompressão vai encontrar exatamente o mesmo buraco.

Descompressão é superfície de ataque, não otimização

Este é o terceiro incidente na mesma família em poucos anos — de bibliotecas de compactação a parsers de formato e cascatas de erro em middleware. O padrão se repete porque a compressão é tratada como detalhe de performance: alguém liga o suporte para economizar banda, ninguém documenta, e o decodificador passa a aceitar bytes controlados por terceiros.

A regra que sobrevive ao próximo CVE é estreita e desconfortável:

  • Todo decoder que toca bytes de fora é código de segurança — merece dono, inventário e teste com entrada malformada, igual a um parser de protocolo.
  • Aceitar um formato é uma decisão de arquitetura, não um flag de performance. Accept-Encoding e Content-Encoding são política de fronteira.
  • Desligar é mais rápido que patchar. Enquanto não há patch, rejeitar br na borda e remover o formato do que você anuncia resolve a exposição — mas só se o controle estiver antes do decoder, não depois da resposta baixada.
  • Fallback não é garantido. Tirar o suporte pode virar erro de aplicação quando o servidor insiste em Brotli. Isso é um modo de falha que precisa ser testado, não descoberto em produção.

O caminho que fecha a classe de falha

O patch (Brotli 1.2.1, brotlicffi 1.2.1.0, runtimes atualizados) é obrigatório e é a parte fácil. A parte que fica é eliminar a cegueira:

  • Inventário por caminho de decodificação, não por pacote: quais serviços aceitam corpo comprimido, quais chamam URLs de terceiros com resposta comprimida, quais imagens embutem decodificador nativo.
  • Ordem por exposição real: primeiro quem aceita requisição de fora ou busca URL arbitrária (webhook, preview, crawler, importador), depois o resto.
  • Evidência de fechamento: versão efetiva em runtime, não lockfile. Imagem reconstruída, pod reiniciado, Content-Encoding: br rejeitado e comprovado por teste.
  • Governança da exceção: todo serviço que ficar exposto por decisão consciente precisa de prazo e nome. Exposição sem prazo é esquecimento com outro nome.

O que fazer hoje com o dossiê que você tem

  1. Liste cada serviço com suas superfícies de decodificação: entrada (aceita br?), saída (baixa de terceiros?), imagem (decoder nativo embutido?), binário (compilado com o runtime antigo?).
  2. Para cada linha, marque quem é o dono do patch — seu time, o vendor ou ninguém. "Ninguém" é o achado mais importante do laudo.
  3. Classifique a exposição antes da versão: aceita corpo externo é mais urgente que servidor interno que só fala com serviços conhecidos.
  4. Escreva a mitigação compensatória com o ponto exato de inserção — na borda, antes de qualquer processamento de corpo.
  5. Registre a decisão (aceitar ou não formatos comprimidos de terceiros, e como isso é revisto) com o risco residual e o dono das lacunas.

Nada disso é resposta a este CVE. É o mesmo raciocínio para qualquer decodificador herdado — imagem, fonte, archive, serialização — e é por isso que vale ter o documento pronto antes do próximo nome de shell aparecer no feed.

Do conceito à execução

Ferramentas práticas para levar as decisões desta nota ao seu próximo projeto.

12 / selecionados
Cadeia de ataque do incidente Snowflake×Wiz: do PR gerado por IA ao roubo do token Jira via injeção em GitHub Actions.
Segurança
01 / 02

Revisor de Segurança de Patches Gerados por IA (injeção em CI/CD)

por João Gabriel

gpt-4ClaudeGemini
—(0)
0 vendas
R$ 19,90
Cadeia do ataque: evento não confiável interpolado em run: expõe segredo interno via gate 'sempre verdadeiro'.
Segurança
01 / 02

ADR de Hardening de GitHub Actions contra injeção de script

por João Gabriel

GPT-4oclaude-3-7-sonnetgemini-2.0-flash
—(0)
0 vendas
R$ 14,90
Modelo de ameaças: as 4 superfícies de ataque em agentes de codificação com IA, inspiradas pelo Cursor 0day e Memory Heist.
ADR
01 / 02

ADR de Adoção de Agentes de Código com Guardrails de Segurança

por João Gabriel

gpt-4claude-3.5-sonnetclaude-4+2
—(0)
0 vendas
R$ 19,90
O antipadrão: uma chave de plataforma única no gateway multi-tenant gera blast radius global.
Segurança
01 / 03

ADR de Segredos em Multi-Tenant: elimine chaves compartilhadas e reduza o blast radius

por João Gabriel

gpt-4ClaudeGemini
—(0)
0 vendas
R$ 29,90
A mesma credencial mora em cinco superfícies — rotacionar uma não a remove das outras.
Segurança
01 / 02

Escriba de Blast Radius de Credenciais: laudo, ordem de rotação e ADR para segredo exposto em plataforma

por João Gabriel

gpt-4ClaudeGemini
—(0)
0 vendas
R$ 19,90
A política vive fora do agente: o dossiê vira declaração fail-closed, e um mecanismo independente nega o resto mesmo se o agente cooperar com o ataque.
Segurança
01 / 03

Arquiteto de Fronteira de Execução do Agente: política, contenção e provas de escape

por João Gabriel

gpt-4ClaudeGemini
—(0)
0 vendas
R$ 29,90
Quatro superfícies de criptografia legada (TLS na borda, PKI/mTLS, assinatura de código, CMS/chaves) com o que é risco hoje e o padrão-alvo em cada uma — convergindo para um ADR consolidado e um roteiro em 3 fases (inventário, nova CA/HSM+rotação, desligar legado).
Segurança
01 / 03

Kit Crypto-Agility: ADR e roteiro para aposentar criptografia legada

por João Gabriel

gpt-4ClaudeGemini
—(0)
0 vendas
R$ 19,90
Camadas de controle de um agente LLM conectado: o usuário instrui um orquestrador que, para qualquer efeito colateral, passa por um gateway de política zero-confiança antes de tocar sistemas OAuth/dados sensíveis (e-mail, cloud, repositórios).
Segurança
01 / 03

Agente LLM Conectado e Seguro: ADR, modelo de ameaças e gates de tool-call

por João Gabriel

gpt-4ClaudeGemini
—(0)
0 vendas
R$ 19,90
A fronteira que se audita: rede, execucao, identidade, dados e monitoramento — cada requisito so vale com um artefato verificavel.
Segurança
01 / 02

Auditor de Contenção de Fornecedor de IA: transforme promessas de sandbox e egress em evidência auditável

por João Gabriel

gpt-4ClaudeGemini
—(0)
0 vendas
R$ 19,90
Fluxo do ataque de supply-chain via npm (incidente Keyv, ago/2026) e a superficie de governanca.
Segurança
01 / 02

ADR de Supply Chain: dependências zero-trust e runbook para pacote comprometido

por João Gabriel

gpt-4ClaudeGemini
—(0)
0 vendas
R$ 19,90
Cadeia de remediação em frota de borda: da exposição (boletim + inventário) à classificação de versão, à separação CLASSE A/CLASSE B e à prova da correção.
Segurança
01 / 02

Arquiteto de Correção de Frota: laudo de remediação para CVEs exploradas em appliances de borda

por João Gabriel

gpt-4gpt-5Claude+3
—(0)
0 vendas
R$ 29,90
Pipeline de Desenvolvimento Seguro na Era da IA: estágios planejamento→implementação→verificação→entrega com feedback loop e papéis IA/humano.
Segurança
01 / 02

SSDLC na Era da IA: decisões e gates de segurança para times com copilotos

por João Gabriel

gpt-4ClaudeGemini+1
—(0)
0 vendas
R$ 19,90