
CVE-2026-21717에 대한 개념 증명(PoC)으로, Node.js V8 문자열 해싱 충돌 취약점으로 인해 조작된 JSON 페이로드를 통해 서비스 거부(DoS)가 발생합니다.
Node.js V8 문자열 해싱 예측 가능한 충돌 취약점으로 인한 서비스 거부(DoS)
V8의 문자열 해싱 메커니즘의 심각한 취약점으로 인해 공격자가 Node.js 애플리케이션에서 심각한 성능 저하를 유발할 수 있습니다. 정수 형태의 문자열은 숫자 값으로 해싱되어 해시 충돌을 쉽게 예측할 수 있습니다. V8 내부 문자열 테이블에서 많은 충돌을 유발하는 악의적인 입력을 구성함으로써, 공격자는 성능을 크게 저하시키거나 서비스 거부를 유발할 수 있습니다.
이 취약점은 V8의 문자열 내부화(internalization) 프로세스에서 비롯됩니다. JSON 파싱이 발생하면 짧은 문자열이 자동으로 해시 테이블에 내부화됩니다. 정수 형태의 문자열은 숫자 값으로 해싱되어 예측 가능한 충돌을 일으키며, 공격자가 심각한 성능 저하를 유발하는 이차(quadratic) 프로빙 체인을 강제할 수 있습니다.
가장 일반적인 트리거는 공격자가 제어하는 입력에 대해 JSON.parse()를 호출하는 모든 엔드포인트입니다. JSON 파싱은 짧은 문자열을 영향을 받는 해시 테이블에 자동으로 내부화하기 때문입니다.
이 저장소에는 취약점을 입증하는 개념 증명이 포함되어 있습니다:
# CVE-2026-21717의 영향을 받는 Node.js 버전 사용
nvm use
npm install
node poc.js
PoC는 다음을 포함하는 페이로드를 생성합니다:
JSON.parse() 작업에 대해 약 44초 이상의 CPU 시간 소요JSON.parse()를 호출합니다// 페이로드 크기 제한
app.use(express.json({ limit: '100kb' }));
// 파싱 타임아웃 추가
const parseWithTimeout = (str, timeout = 1000) => {
return Promise.race([
Promise.resolve(JSON.parse(str)),
new Promise((_, reject) =>
setTimeout(() => reject(new Error('Parse timeout')), timeout)
)
]);
};
이 저장소는 교육 및 연구 목적으로만 제공됩니다. 악의적인 목적으로 이 코드를 사용하거나 소유하지 않았거나 명시적 테스트 권한이 없는 시스템에 대해 사용하지 마십시오.