Source: node-qs
Version: 6.13.0+ds+~6.9.16-1
Severity: important
Tags: security upstream
X-Debbugs-Cc: [email protected], Debian Security Team <[email protected]>

Hi,

The following vulnerability was published for node-qs.

CVE-2025-15284[0]:
| Improper Input Validation vulnerability in qs (parse modules) allows
| HTTP DoS.This issue affects qs: < 6.14.1.   SummaryThe
| arrayLimit option in qs does not enforce limits for bracket notation
| (a[]=1&a[]=2), allowing attackers to cause denial-of-service via
| memory exhaustion. Applications using arrayLimit for DoS protection
| are vulnerable.  DetailsThe arrayLimit option only checks limits for
| indexed notation (a[0]=1&a[1]=2) but completely bypasses it for
| bracket notation (a[]=1&a[]=2).  Vulnerable
| code (lib/parse.js:159-162):  if (root === '[]' &&
| options.parseArrays) {     obj = utils.combine([], leaf);  // No
| arrayLimit check }      Working code (lib/parse.js:175):  else if
| (index <= options.arrayLimit) {  // Limit checked here     obj = [];
| obj[index] = leaf; }      The bracket notation handler at line 159
| uses utils.combine([], leaf) without validating against
| options.arrayLimit, while indexed notation at line 175 checks index
| <= options.arrayLimit before creating arrays.  PoCTest 1 - Basic
| bypass:  npm install qs      const qs = require('qs'); const result
| = qs.parse('a[]=1&a[]=2&a[]=3&a[]=4&a[]=5&a[]=6', { arrayLimit: 5
| }); console.log(result.a.length);  // Output: 6 (should be max 5)
| Test 2 - DoS demonstration:  const qs = require('qs'); const attack
| = 'a[]=' + Array(10000).fill('x').join('&a[]='); const result =
| qs.parse(attack, { arrayLimit: 100 }); console.log(result.a.length);
| // Output: 10000 (should be max 100)      Configuration:    *
| arrayLimit: 5 (test 1) or arrayLimit: 100 (test 2)   *  Use bracket
| notation: a[]=value (not indexed a[0]=value)   ImpactDenial of
| Service via memory exhaustion. Affects applications using
| qs.parse() with user-controlled input and arrayLimit for protection.
| Attack scenario:    *  Attacker sends HTTP request: GET
| /api/search?filters[]=x&filters[]=x&...&filters[]=x (100,000+ times)
| *  Application parses with qs.parse(query, { arrayLimit: 100 })   *
| qs ignores limit, parses all 100,000 elements into array   *  Server
| memory exhausted → application crashes or becomes unresponsive   *
| Service unavailable for all users Real-world impact:    *  Single
| malicious request can crash server   *  No authentication required
| *  Easy to automate and scale   *  Affects any endpoint parsing
| query strings with bracket notation


If you fix the vulnerability please also make sure to include the
CVE (Common Vulnerabilities & Exposures) id in your changelog entry.

For further information see:

[0] https://security-tracker.debian.org/tracker/CVE-2025-15284
    https://www.cve.org/CVERecord?id=CVE-2025-15284
[1] https://github.com/ljharb/qs/security/advisories/GHSA-6rw7-vpxm-498p
[2] https://github.com/ljharb/qs/commit/3086902ecf7f088d0d1803887643ac6c03d415b9

Please adjust the affected versions in the BTS as needed.

Regards,
Salvatore
-- 
Pkg-javascript-devel mailing list
[email protected]
https://alioth-lists.debian.net/cgi-bin/mailman/listinfo/pkg-javascript-devel

Reply via email to