
Exploit de prueba de concepto para CVE-2026-21710, una falla en el manejo de solicitudes HTTP de Node.js que provoca un TypeError no capturado a través del encabezado __proto__, lo que conduce a una denegación de servicio.
| Campo | Valor |
|---|
| ID CVE | CVE-2026-21710 |
| Publicado | 2026-03-30 |
| CVSS v3.1 | 7.5 ALTO (AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H) |
| CWE | CWE-770 — Asignación de recursos sin límites ni limitación |
| Afectados | Node.js 20.x, 22.x, 24.x, 25.x |
| Corregido en | Lanzamientos de seguridad de marzo de 2026 |
Una falla en el manejo de solicitudes HTTP de Node.js provoca un TypeError no capturado cuando se recibe una solicitud con una cabecera llamada __proto__ y la aplicación accede a req.headersDistinct.
dest["__proto__"] se resuelve a Object.prototype en lugar de undefined, lo que hace que se llame a .push() sobre un elemento que no es un array. Esta excepción se lanza de forma síncrona dentro de un getter de propiedad y no puede ser interceptada por los listeners del evento error — no se puede manejar sin envolver cada acceso a req.headersDistinct en un try/catch.
El getter headersDistinct acumula los valores de las cabeceras en un objeto plano:
const dest = {};
// ...
dest[name] = dest[name] || [];
dest[name].push(value);
Cuando name === "__proto__":
dest["__proto__"] devuelve Object.prototype (truthy, no undefined)|| [].push(value) sobre Object.prototype → TypeError: dest[name].push is not a function| Archivo | Descripción |
|---|---|
server.js | Servidor HTTP vulnerable (accede a req.headersDistinct directamente) |
poc.js | Exploit de prueba de concepto |
Solo para investigación de seguridad autorizada / divulgación responsable.
node server.js
# Escuchando en http://127.0.0.1:3000
node poc.js
Salida esperada:
__proto__; el servidor se bloquea con un TypeError no capturado.