js-toml은 TOML 1.0.0 사양을 완벽하게 준수하는 JavaScript용 TOML 파서입니다. 1.1.0까지의 버전에서는 'BigInt' 누산기에 입력 숫자당 한 번씩 기수를 곱하는 손으로 작성한 'parseBigInt' 루프를 통해 16진수/8진수/2진수 리터럴을 구문 분석합니다. 각 반복은 이미 소비된 자릿수에 따라 선형적으로 증가하는 누산기에서 'BigInt * BigInt' 작업을 수행하므로 전체 루프의 리터럴 길이는 O(n²)입니다. 어휘분석기 정규식은 상위 항목을 배치하지 않습니다.
js-toml은 TOML 1.0.0 사양을 완벽하게 준수하는 JavaScript용 TOML 파서입니다. 1.1.0까지의 버전에서는 'BigInt' 누산기에 입력 숫자당 한 번씩 기수를 곱하는 손으로 작성한 'parseBigInt' 루프를 통해 16진수/8진수/2진수 리터럴을 구문 분석합니다. 각 반복은 이미 소비된 자릿수에 따라 선형적으로 증가하는 누산기에서 'BigInt * BigInt' 작업을 수행하므로 전체 루프의 리터럴 길이는 O(n²)입니다. 어휘분석기 정규식은 리터럴 길이에 상한을 두지 않으므로 ~500kB 16진수 리터럴 하나를 포함하는 단일 TOML 문서는 최신 노트북(Apple M 시리즈, Node v22)에서 최대 40초 동안 하나의 CPU 코어를 고정합니다. 메모리 증폭은 제한되어 있지만 CPU 증폭은 심각하고 2차적으로 증가합니다. 즉, 리터럴 길이를 두 배로 늘리면 작업이 4배로 늘어납니다. 공격자가 제어하는 TOML(구성 업로드 엔드포인트, 타사 *.toml을 수집하는 CI/CD 시스템, IDE 플러그인, 빌드 도구)에서 load()를 호출하는 호출자는 단일 요청 CPU 소모 DoS에 노출됩니다. 버전 1.1.1에서는 문제가 해결되었습니다.
왜 이 VPI인가 (설명가능 · 실험적)
VPI 산정 기준
| 영향도 | 75.00 |
| 악용 신호(PoC 존재) | ×1.20 |
| VPI | 90.00 |
VPI 공식 vpi-v1 기준
| 소스 | CVSS 버전 | 기본 점수 | 심각도 | 벡터 문자열 | 평가일 |
|---|---|---|---|---|---|
| OSV3rd | 3.1 | 7.5 | HIGH | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H | 2026. 06. 27. |
| NVDNIST | 3.1 | 7.5 |
| CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H |
| 2026. 06. 20. |