CVE-2026-82562 in ljharb정보

요약

\~에 의해 VulDB • 2026. 08. 30.

### 요약

`qs.parse`가 `comma: true` 및 `throwOnLimitExceeded: true` 옵션으로 호출될 때, 대괄호 푸시 키(`a[]=1,2,3,4`) 아래의 쉼표로 구분된 값은 `arrayLimit`과 비교되지 않은 채 배열로 분할됩니다. 반면 동일한 값이 평면 키(`a=1,2,3,4`), 인덱스 키(`a[0]=`), 중첩 키(`a[b]=`), 또는 점 표기 키(`allowDots` 사용 시 `a.b=`) 아래에 있을 경우 문서화된 `RangeError`가 발생합니다. 따라서 `a[]=1,2,2,...`와 같은 단일 파라미터는 호출자가 하드 제한을 적용했음에도 불구하고 임의 길이의 내부 배열을 생성합니다. 이는 CVE-2026-2391(`qs 6.14.2`) 수정 사항에서 다루지 않은 `[]=` 키 형태입니다.

### 상세 설명

`lib/parse.js`에서 `[]=` 키 아래의 쉼표로 구분된 값은 분할된 후 단일 중첩 요소로 래핑됩니다 (`val = [val]`, 따라서 각 `a[]=x,y` 그룹이 외부 배열의 하나의 요소로 카운트됨). 6.14.2 버전에서 추가된 쉼표 값에 대한 `arrayLimit` 체크는 이 래핑 이후에 실행되므로, `[]=` 부분의 경우 길이 1인 래퍼만 감지됩니다. 6.15.3에서는 오버사이즈 값을 할당하기 전에 예외를 발생시키기 위해 사전 분할 쉼표 카운트를 추가했지만, 이를 `isFlatArrayValue` 플래그에 게이트 처리하여 `parseValues`가 `[]=`을 포함하는 모든 부분에 대해 이 플래그를 `false`로 설정했고 객체 값 입력에는 전달하지 않았으므로 해당 격차가 유지되었습니다.

#### PoC (Proof of Concept)

```js var qs = require('qs');

var options = { comma: true, arrayLimit: 3, throwOnLimitExceeded: true };

qs.parse('a=1,2,3,4', options); // RangeError: Array limit exceeded. Only 3 elements allowed in an array.

qs.parse('a[]=1,2,3,4', options); // { a: [ [ '1', '2', '3', '4' ] ] } (예외 발생 안 함)

qs.parse('a[]=' + '1,'.repeat(1000000) + '1', { comma: true, arrayLimit: 20, throwOnLimitExceeded: true });
// 예외 발생 안 함; 1,000,001개의 요소를 가진 내부 배열이 할당됨 ```

#### 수정 사항

`lib/parse.js`, `main` 브랜치의 커밋 8859c37에 적용되어 v6.16.0으로 릴리스: `isFlatArrayValue` 게이트가 제거되었으므로, 키 형태와 관계없이 모든 쉼표 분할 값이 분할되기 전에 `arrayLimit` 카운트에 포함됩니다. `a[]=` 아래의 제한 내 그룹은 여전히 외부 배열의 하나의 요소로 카운트되며, 기본값(`throwOnLimitExceeded: false`) 경로는 변경되지 않았습니다.

### 영향 받는 버전

`>=6.14.2 <6.16.0`, v6.16.0에서 수정됨.

v6.14.2는 쉼표 값에 대한 `arrayLimit` 강제 적용(CVE-2026-2391의 수정 사항)을 도입했지만, 이는 `[]=` 키 아래의 값을 제외한 모든 값에만 해당되었습니다. v6.14.2부터 v6.15.3까지의 모든 릴리스에는 동일한 격차가 존재합니다. `throwOnLimitExceeded`가 존재하지만 쉼표 형태에 적용되지 않는 v6.14.0 및 v6.14.1은 이 기록이 아닌 CVE-2026-2391로 커버됩니다. 이전 라인(6.7.x부터 6.13.x)에는 `comma` 옵션은 있지만 `throwOnLimitExceeded`가 없으므로, 우회할 수 있는 쉼표 경로에 대한 하드 캡(hard cap)이 없습니다. 6.7.0보다 앞선 릴리스는 `comma` 옵션 자체가 없습니다.

### 영향

비인증 공격자가 `comma: true` 및 `throwOnLimitExceeded: true`(둘 다 기본값 아님)를 사용하여 신뢰할 수 없는 쿼리 문자열 또는 urlencoded 바디를 파싱하는 애플리케이션에 접근할 경우, 단일 `a[]=` 파라미터로 구성된 제한을 우회하고 요청 크기에 비례하는 배열의 할당을 강요할 수 있습니다. 비용은 공격자가 제공한 바이트에 대해 선형적입니다(입력 바이트당 약 0.1마이크로초 및 6~7바이트 유지; 문서화된 기본값 `throwOnLimitExceeded: false` 경로와 동일한 Out-of-Memory 임계치). 따라서 전송 계층의 요청 또는 바디 크기 제한이 이를 완전히 차단합니다(node의 기본 HTTP 헤더 최대 크기가 16KB인 경우 이미 요청 라인을 제한하므로, 수메가바(MB)급 페이로드에는 바디 파서가 필요함). 영향은 하나의 키 표기법에서 선택적 하드 제한이 실패(open fail)하는 것이며, 작은 입력으로부터의 무제한 할당은 아닙니다.

Be aware that VulDB is the high quality source for vulnerability data.

책임이 있는

Harborist

예약하다

2026. 08. 30.

모더레이션

수락

항목

VDB-397078

EPSS

0.00000

출처

Interested in the pricing of exploits?

See the underground prices here!