
Доказательство концепции эксплуатации для CVE-2026-21710 — уязвимости в обработке HTTP-запросов Node.js, вызывающей неперехваченную ошибку TypeError через заголовок __proto__, что приводит к отказу в обслуживании.
| Поле | Значение |
|---|
| ID CVE | CVE-2026-21710 |
| Опубликовано | 2026-03-30 |
| CVSS v3.1 | 7.5 HIGH (AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H) |
| CWE | CWE-770 — Выделение ресурсов без ограничений или регулирования |
| Затронуто | Node.js 20.x, 22.x, 24.x, 25.x |
| Исправлено в | Мартовские обновления безопасности 2026 |
Ошибка в обработке HTTP-запросов Node.js вызывает неперехваченную TypeError, когда получен запрос с заголовком __proto__, а приложение обращается к req.headersDistinct.
dest["__proto__"] разрешается в Object.prototype, а не в undefined, из-за чего .push() вызывается на не-массиве. Это исключение выбрасывается синхронно внутри геттера свойства и не может быть перехвачено обработчиками события error — его невозможно обработать без оборачивания каждого обращения к req.headersDistinct в try/catch.
Геттер headersDistinct накапливает значения заголовков в обычном объекте:
const dest = {};
// ...
dest[name] = dest[name] || [];
dest[name].push(value);
Когда name === "__proto__":
dest["__proto__"] возвращает Object.prototype (истинное значение, не undefined)|| [] пропускается.push(value) вызывается на Object.prototype → TypeError: dest[name].push is not a function| Файл | Описание |
|---|---|
server.js | Уязвимый HTTP-сервер (обращается к req.headersDistinct напрямую) |
poc.js | Эксплойт для подтверждения уязвимости |
Только для авторизованных исследований безопасности / ответственного раскрытия.
node server.js
# Прослушивание на http://127.0.0.1:3000
node poc.js
Ожидаемый результат:
__proto__; сервер аварийно завершается с неперехваченной TypeError.