CVE-2026-82562
Gravedad CVSS v4.0:
MEDIA
Tipo:
No Disponible / Otro tipo
Fecha de publicación:
30/08/2026
Última modificación:
30/08/2026
Descripción
*** Pendiente de traducción *** ### Summary<br />
<br />
<br />
<br />
When `qs.parse` is called with `comma: true` and `throwOnLimitExceeded: true`, a comma-separated value under a bracket-push key (`a[]=1,2,3,4`) is split into an array without being compared against `arrayLimit`, while the same value under a flat key (`a=1,2,3,4`), an indexed key (`a[0]=`), a nested key (`a[b]=`), or a dotted key (`a.b=` with `allowDots`) throws the documented `RangeError`. A single parameter such as `a[]=1,2,2,...` therefore produces an inner array of arbitrary length even though the caller opted into the hard limit. This is the `[]=` key form that the fix for CVE-2026-2391 (qs 6.14.2) did not cover.<br />
<br />
<br />
<br />
### Details<br />
<br />
<br />
<br />
In `lib/parse.js`, a comma-separated value under a `[]=` key is split and then wrapped as a single nested element (`val = [val]`, so that each `a[]=x,y` group counts as one element of the outer array). The `arrayLimit` check that 6.14.2 added for comma values runs after that wrap, so for `[]=` parts it only ever saw the wrapper of length 1. 6.15.3 added a pre-split comma count so that an oversized value throws before it is allocated, but gated it on an `isFlatArrayValue` flag that `parseValues` set to `false` for any part containing `[]=`, and did not pass it for object-valued input, so the gap remained.<br />
<br />
<br />
<br />
#### PoC<br />
<br />
<br />
<br />
```js<br />
<br />
<br />
<br />
var qs = require(&#39;qs&#39;);<br />
<br />
<br />
<br />
var options = { comma: true, arrayLimit: 3, throwOnLimitExceeded: true };<br />
<br />
<br />
<br />
qs.parse(&#39;a=1,2,3,4&#39;, options); // RangeError: Array limit exceeded. Only 3 elements allowed in an array.<br />
<br />
<br />
<br />
qs.parse(&#39;a[]=1,2,3,4&#39;, options); // { a: [ [ &#39;1&#39;, &#39;2&#39;, &#39;3&#39;, &#39;4&#39; ] ] } (no throw)<br />
<br />
<br />
<br />
qs.parse(&#39;a[]=&#39; + &#39;1,&#39;.repeat(1000000) + &#39;1&#39;, { comma: true, arrayLimit: 20, throwOnLimitExceeded: true });<br />
<br />
<br />
<br />
// no throw; a 1,000,001-element inner array is allocated<br />
<br />
<br />
<br />
```<br />
<br />
<br />
<br />
#### Fix<br />
<br />
<br />
<br />
`lib/parse.js`, applied in 8859c37 on `main` and released as v6.16.0: the `isFlatArrayValue` gate is removed, so every comma-split value is counted against `arrayLimit` before splitting regardless of key form. An in-limit group under `a[]=` still counts as one element of the outer array, and the default (`throwOnLimitExceeded: false`) path is unchanged.<br />
<br />
<br />
<br />
### Affected versions<br />
<br />
<br />
<br />
`>=6.14.2
Impacto
Puntuación base 4.0
6.30
Gravedad 4.0
MEDIA
Puntuación base 3.x
3.70
Gravedad 3.x
BAJA



