
CVE-2026-21710에 대한 개념 증명 익스플로잇으로, Node.js HTTP 요청 처리 결함으로 인해 `__proto__` 헤더를 통한 처리되지 않은 TypeError가 발생하여 서비스 거부(DoS)로 이어집니다.
| 필드 | 값 |
|---|
| CVE ID | 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년 3월 보안 릴리스 |
Node.js HTTP 요청 처리의 결함으로 인해 __proto__라는 이름의 헤더가 포함된 요청을 수신하고 애플리케이션이 req.headersDistinct에 접근할 때 처리되지 않은 TypeError가 발생합니다.
dest["__proto__"]는 undefined가 아닌 Object.prototype으로 해석되므로, 배열이 아닌 객체에 대해 .push()가 호출됩니다. 이 예외는 프로퍼티 getter 내부에서 동기적으로 발생하며 error 이벤트 리스너로는 가로챌 수 없습니다. 즉, 모든 req.headersDistinct 접근을 try/catch로 감싸지 않는 한 처리할 수 없습니다.
headersDistinct getter는 헤더 값을 일반 객체에 누적합니다:
const dest = {};
// ...
dest[name] = dest[name] || [];
dest[name].push(value);
name === "__proto__"인 경우:
dest["__proto__"]는 Object.prototype을 반환합니다 (truthy이며 undefined가 아님)|| [] 초기화가 건너뛰어집니다Object.prototype에 대해 .push(value)가 호출됨 → TypeError: dest[name].push is not a function| 파일 | 설명 |
|---|---|
server.js | 취약한 HTTP 서버 (req.headersDistinct에 직접 접근) |
poc.js | 개념 증명 익스플로잇 |
공인된 보안 연구 / 책임 있는 공개 전용입니다.
node server.js
# Listening on http://127.0.0.1:3000
node poc.js
예상 출력:
__proto__ 헤더가 전송되고, 서버가 처리되지 않은 TypeError로 인해 중단됩니다.