
Prova de conceito de exploit para CVE-2026-21710, uma falha no tratamento de requisições HTTP do Node.js que causa um TypeError não capturado por meio do cabeçalho __proto__, levando à negação de serviço.
| Campo | Valor |
|---|
| ID CVE | CVE-2026-21710 |
| Publicado | 2026-03-30 |
| CVSS v3.1 | 7.5 ALTA (AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H) |
| CWE | CWE-770 — Alocação de Recursos Sem Limites ou Limitação |
| Afetados | Node.js 20.x, 22.x, 24.x, 25.x |
| Corrigido em | Lançamentos de Segurança de Março de 2026 |
Uma falha no tratamento de requisições HTTP do Node.js causa um TypeError não capturado quando uma requisição é recebida com um cabeçalho chamado __proto__ e a aplicação acessa req.headersDistinct.
dest["__proto__"] resolve para Object.prototype em vez de undefined, fazendo com que .push() seja chamado em um não-array. Essa exceção é lançada sincronamente dentro de um getter de propriedade e não pode ser interceptada por listeners do evento error — ela não pode ser tratada sem envolver cada acesso a req.headersDistinct em um try/catch.
O getter headersDistinct acumula valores de cabeçalhos em um objeto simples:
const dest = {};
// ...
dest[name] = dest[name] || [];
dest[name].push(value);
Quando name === "__proto__":
dest["__proto__"] retorna Object.prototype (truthy, não undefined)|| [] é ignorada.push(value) é chamado em Object.prototype → TypeError: dest[name].push is not a function| Arquivo | Descrição |
|---|---|
server.js | Servidor HTTP vulnerável (acessa req.headersDistinct diretamente) |
poc.js | Exploit de prova de conceito |
Apenas para pesquisa de segurança autorizada / divulgação responsável.
node server.js
# Ouvindo em http://127.0.0.1:3000
node poc.js
Saída esperada:
__proto__ é enviado; o servidor trava com um TypeError não capturado.