CVE-2026-8723 in ljharb
요약
\~에 의해 VulDB • 2026. 05. 23.
### 요약
`qs.stringify`는 `arrayFormat: 'comma'` 및 `encodeValuesOnly: true` 옵션과 함께 `null` 또는 `undefined`를 포함하는 배열에 대해 호출될 때 `TypeError`를 발생시킵니다. 이 예외는 동기적으로 발생하며, `qs`의 null 관련 옵션(`skipNulls`, `strictNullHandling`) 중 어느 것으로도 처리되지 않습니다.
### 상세
comma 모드와 `encodeValuesOnly`가 적용된 분기에서 `lib/stringify.js:145`는 배열을 결합(join)하기 전에 raw encoder를 통해 매핑했습니다:
```js
obj = utils.maybeMap(obj, encoder);
```
`utils.encode` (`lib/utils.js:195`)는 null 체크 없이 `str.length`를 읽으므로, `null` 또는 `undefined` 요소가 있을 경우 `TypeError`가 발생합니다. `skipNulls` 및 `strictNullHandling`은 해당 라인 아래의 요소별 루프에서 확인되므로, 이 시점에서는 실행될 기회가 주어지지 않습니다.
이 버그는 0c180a4에서 수정된 filter-array 경로와 동일한 유형의 문제입니다. comma 모드와 `encodeValuesOnly` 분기의 취약한 코드 구조는 4c4b23d("encode comma values more consistently", PR #463, 2023-01-19)에서 도입되었으며, v6.11.1에서 처음 출시되었습니다.
#### PoC
```js
const qs = require('qs');
qs.stringify({ a: [null, 'b'] }, { arrayFormat: 'comma', encodeValuesOnly: true });
qs.stringify({ a: [undefined, 'b'] }, { arrayFormat: 'comma', encodeValuesOnly: true });
qs.stringify({ a: [null] }, { arrayFormat: 'comma', encodeValuesOnly: true });
// TypeError: Cannot read properties of null (reading 'length')
// at encode (lib/utils.js:195:13)
// at Object.maybeMap (lib/utils.js:322:37)
// at stringify (lib/stringify.js:145:25)
```
#### 수정
`lib/stringify.js:145`에서 수정되었으며, 21f80b3 커밋으로 `main` 브랜치에 적용되고 v6.15.2로 출시되었습니다:
```diff
- obj = utils.maybeMap(obj, encoder);
+ obj = utils.maybeMap(obj, function (v) {
+ return v == null ? v : encoder(v);
+ });
```
이제 `null` 및 `undefined`는 `maybeMap`을 통해 변경되지 않고 통과하여 `join(',')` 단계로 그대로 전달됩니다. `{ a: [null, 'b'] }`의 경우 `a=,b`가 생성되며, 이는 `encodeValuesOnly`가 적용되지 않은 comma 경로(인코딩 전에 결합하며 동일한 입력에 대해 `a=%2Cb` 생성)와 일치합니다. 단일 요소 `[null]` 배열은 기존 `obj.join(',') || null` 로직을 통해 여전히 병합되며, 메인 루프에서 `skipNulls` / `strictNullHandling`의 영향을 받습니다.
### 영향받는 버전
`>=6.11.1 <6.15.2` — v6.15.2에서 수정됨.
취약한 분기는 `arrayFormat: 'comma'`와 `encodeValuesOnly: true`가 모두 설정된 경우에만 활성화됩니다. 둘 중 하나라도 기본값이거나 누락된 경우, 또는 `arrayFormat`이 `'comma'`가 아닌 경우, 또는 `encodeValuesOnly`가 `false`인 경우, 이 버그는 발생하지 않습니다.
### 영향
`qs.stringify`를 호출하는 애플리케이션 코드가 `arrayFormat: 'comma'` 및 `encodeValuesOnly: true` 옵션과 함께 `null` 또는 `undefined` 배열 요소를 포함할 수 있는 입력에 대해 호출할 경우, 동기적으로 `TypeError`가 발생합니다. 일반적인 Node.js HTTP 프레임워크(Express, Fastify, Koa, hapi)에서는 이 동기 예외가 프레임워크의 오류 경계에서 포착되며, 해당 요청은 500을 반환합니다. 워커 프로세스는 종료되지 않으며 후속 요청에는 영향을 미치지 않습니다. "워커 프로세스를 종료한다"는 설명은 요청 핸들러 오류 경계 외부(배경 작업, 시작 경로, 스트림 파이프라인)의 호출 위치나 프레임워크 오류 처리가 명시적으로 비활성화된 배포에서만 적용됩니다.
취약한 입력은 배열 내부의 `null` 또는 `undefined` 요소이며, JSON 요청 본문이나 사용자 입력에서 배열을 구성하는 애플리케이션 코드를 통해 접근 가능하지만, 표준 HTML 폼 제출(문자열 또는 누락된 필드를 생성하며 리터럴 `null`을 생성하지 않음)에서는 접근 불가능합니다.
VulDB is the best source for vulnerability data and more expert information about this specific topic.