Update dependency qs to v6.14.1 [SECURITY] #11641
Open
+1
−11
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
This PR contains the following updates:
6.5.3→6.14.1GitHub Vulnerability Alerts
CVE-2025-15284
Summary
The
arrayLimitoption in qs does not enforce limits for bracket notation (a[]=1&a[]=2), allowing attackers to cause denial-of-service via memory exhaustion. Applications usingarrayLimitfor DoS protection are vulnerable.Details
The
arrayLimitoption 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):Working code (
lib/parse.js:175):The bracket notation handler at line 159 uses
utils.combine([], leaf)without validating againstoptions.arrayLimit, while indexed notation at line 175 checksindex <= options.arrayLimitbefore creating arrays.PoC
Test 1 - Basic bypass:
Test 2 - DoS demonstration:
Configuration:
arrayLimit: 5(test 1) orarrayLimit: 100(test 2)a[]=value(not indexeda[0]=value)Impact
Denial of Service via memory exhaustion. Affects applications using
qs.parse()with user-controlled input andarrayLimitfor protection.Attack scenario:
GET /api/search?filters[]=x&filters[]=x&...&filters[]=x(100,000+ times)qs.parse(query, { arrayLimit: 100 })Real-world impact:
Suggested Fix
Add
arrayLimitvalidation to the bracket notation handler. The code already calculatescurrentArrayLengthat line 147-151, but it's not used in the bracket notation handler at line 159.Current code (
lib/parse.js:159-162):Fixed code:
This makes bracket notation behaviour consistent with indexed notation, enforcing
arrayLimitand converting to object when limit is exceeded (per README documentation).Release Notes
ljharb/qs (qs)
v6.14.1Compare Source
[]notation as wellparse: when a custom decoder returnsnullfor a key, ignore that keyparse: extract key segment splitting helperstringify: increase coverageeslint,@ljharb/eslint-config,npmignore,es-value-fixtures,for-each,object-inspectv6.14.0Compare Source
parse: addthrowOnParameterLimitExceededoption (#517)parse: useutils.combinemoreparse: add explicitthrowOnLimitExceededdefaultside-channeles-value-fixtures,has-bigints,has-proto,has-symbolsv6.13.1Compare Source
stringify: avoid a crash when afilterkey isnullutils.merge: functions should not be stringified into keysparse: avoid a crash with interpretNumericEntities: true, comma: true, and iso charsetstringify: ensure a non-stringfilterdoes not crash__proto__syntax instead ofObject.createfor null objectsutils.merge: add some coveragees-value-fixtures,mock-property,object-inspect,tapev6.13.0Compare Source
parse: addstrictDepthoption (#511)npm auditinstead ofaudv6.12.3Compare Source
parse: properly account forstrictNullHandlingwhenallowEmptyArraysv6.12.2Compare Source
parse: parse encoded square brackets (#506)v6.12.1Compare Source
parse: DisabledecodeDotInKeysby default to restore previous behavior (#501)utils: Optimize performance under large data volumes, reduce memory usage, and speed up processing (#502)utils: use+=v6.12.0Compare Source
parse/stringify: adddecodeDotInKeys/encodeDotKeysoptions (#488)parse: addduplicatesoptionparse/stringify: addallowEmptyArraysoption to allow [] in object values (#487)parse/stringify: move allowDots config logic to its own variablestringify: move option-handling code intonormalizeStringifyOptionsstringify: clarify defaultarrayFormatbehaviorside-channelsideEffectsflagparse: remove useless tests; add coveragestringify: increase coveragemock-propertystringify: improve coverage@ljharb/eslint-config,aud,has-override-mistake,has-property-descriptors,mock-property,npmignore,object-inspect,tapeglob, since v10.3.8+ requires a brokenjackspeakjackspeaksince 2.1.2+ depends on npm aliases, which kill the install process in npm < 6v6.11.2Compare Source
parse: Fix parsing when the global Object prototype is frozen (#473)v6.11.1Compare Source
stringify: encode comma values more consistently (#463)filteroption for injecting custom serialization, i.e. of custom types (#447)@ljharb/eslint-config,aud,object-inspect,tapev6.11.0Compare Source
stringify: revert0e903c0; addcommaRoundTripoption (#442)v6.10.5Compare Source
stringify: witharrayFormat: comma, properly include an explicit[]on a single-item array (#434)v6.10.4Compare Source
stringify: witharrayFormat: comma, include an explicit[]on a single-item array (#441)npmignoreto autogenerate an npmignore fileeslint,@ljharb/eslint-config,aud,has-symbol,object-inspect,tapev6.10.3Compare Source
parse: ignore__proto__keys (#428)stringify: avoid relying on a globalundefined(#427)eslint,@ljharb/eslint-config,object-inspect,tapev6.10.2Compare Source
stringify: actually fix cyclic references (#426)stringify: avoid encoding arrayformat comma whenencodeValuesOnly = true(#424)eslint,@ljharb/eslint-config,aud,object-inspect,safe-publish-latest,tapev6.10.1Compare Source
stringify: avoid exception on repeated object values (#402)v6.10.0Compare Source
stringify: throw on cycles, instead of an infinite loop (#395, #394, #393)parse: addallowSparseoption for collapsing arrays with missing indices (#312)npm run distin publish, not installeslint,@ljharb/eslint-config,aud,has-symbols,tapeljharb/actions/node/installinstead ofljharb/actions/node/runv6.9.7Compare Source
parse: ignore__proto__keys (#428)stringify: avoid encoding arrayformat comma whenencodeValuesOnly = true(#424)stringify: avoid relying on a globalundefined(#427)v6.9.6Compare Source
distdir; mistakenly removed ind4f6c32v6.9.5Compare Source
stringify: do not encode parens for RFC1738stringify: fix arrayFormat comma with empty array/objects (#350)format: removeutil.assigncallpull_request_targeteventstringify: add tests for #378nycon all tests; usetaperunnereslint,@ljharb/eslint-config,browserify,mkdirp,object-inspect,tape; addaudv6.9.4Compare Source
stringify: whenarrayFormatiscomma, respectserializeDate(#364)stringify: reduce branching (part of #350)maybeMaptoutilsbrowserify,tapev6.9.3Compare Source
v6.9.2Compare Source
parse: Fix parsing array from object withcommatrue (#359)parse: throw a TypeError instead of an Error for bad charset (#349)eslint,@ljharb/eslint-config,object-inspect,has-symbols,tape,mkdirp,iconv-litev6.9.1Compare Source
parse: with comma true, handle field that holds an array of arrays (#335)parse: with comma true, do not split non-string values (#334)fundingfieldeslint,@ljharb/eslint-configv6.9.0Compare Source
parse/stringify: Pass extra key/value argument todecoder(#333)eslint,@ljharb/eslint-config,evalmdparse: add passingarrayFormattestsposttestusingnpx audto runnpm auditwithout a lockfilenodev12.10,v11.15,v10.16,v8.16Buffer.fromin node v5.0-v5.9 and v4.0-v4.4 requires a TypedArrayv6.8.3Compare Source
parse: ignore__proto__keys (#428)stringify: avoid relying on a globalundefined(#427)stringify: avoid encoding arrayformat comma whenencodeValuesOnly = true(#424)stringify: reduce branchingv6.8.2Compare Source
v6.8.1Compare Source
parse: Fix parsing array from object withcommatrue (#359)parse: throw a TypeError instead of an Error for bad charset (#349)parse: with comma true, handle field that holds an array of arrays (#335)parse: with comma true, do not split non-string values (#334)fundingfieldeslint,@ljharb/eslint-config,tape,safe-publish-latest,evalmd,has-symbols,iconv-lite,mkdirp,object-inspectparse: add passingarrayFormattestsBuffer.fromin node v5.0-v5.9 and v4.0-v4.4 requires a TypedArrayv6.8.0Compare Source
depth=falseto preserve the original key; [Fix]depth=0should preserve the original key (#326)formats: tiny bit of cleanup.eslint,@ljharb/eslint-config,browserify,safe-publish-latest,iconv-lite,tapedepth=0anddepth=falsebehavior, both current and intuitive/intended (#326)eclintinstead ofeditorconfig-toolsv6.7.3Compare Source
parse: ignore__proto__keys (#428)stringify: avoid encoding arrayformat comma whenencodeValuesOnly = true(#424)stringify: avoid relying on a globalundefined(#427)nycfor coveragev6.7.2Compare Source
v6.7.1Compare Source
parse: Fix parsing array from object withcommatrue (#359)parse: with comma true, handle field that holds an array of arrays (#335)parse: with comma true, do not split non-string values (#334)parse: throw a TypeError instead of an Error for bad charset (#349)formats: tiny bit of cleanup.fundingfieldeslint,@ljharb/eslint-config,tape,safe-publish-latest,evalmd,iconv-lite,mkdirp,object-inspect,browserifyparse: add passingarrayFormattestsBuffer.fromin node v5.0-v5.9 and v4.0-v4.4 requires a TypedArraydepth=0anddepth=falsebehavior, both current and intuitive/intendedeclintinstead ofeditorconfig-toolsv6.7.0Compare Source
stringify/parse: addcommaas anarrayFormatoption (#276, #219)utils.merge: avoid a crash with a null target and a truthy non-array source, also with an array sourcestringify: cacheObject.prototype.hasOwnPropertyutils:isBuffer: small tweak; add testsArray.isArrayparse/stringify: make a function to normalize the optionsutils: reduce observable [[Get]]sstringify/utils: cacheArray.isArrayString(x)overx.toString()v6.6.1Compare Source
parse: ignore__proto__keys (#428)utils.merge: avoid a crash with a null target and an array sourceutils.merge: avoid a crash with a null target and a truthy non-array sourcestringify: avoid relying on a globalundefined(#427)stringify: cacheObject.prototype.hasOwnPropertyformats: tiny bit of cleanup.utils:isBuffer: small tweak; add testsstringify/utils: cacheArray.isArrayutils: reduce observable [[Get]]sArray.isArrayparse/stringify: make a function to normalize the optionsString(x)overx.toString()v6.6.0Compare Source
utilsfunction (#189)stringify: fix a crash withstrictNullHandlingand a customfilter/serializeDate(#279)parseArraysis false, properly handle keys ending in[](#260)stringify: do not crash in an obscure combo ofinterpretNumericEntities, a bad customdecoder, &iso-8859-1utils:merge: fix crash whensourceis a truthy primitive & no options are providedstringify: Avoid arr = arr.concat(...), push to the existing instance (#269)parse: only need to reassign the var onceparse/stringify: clean upcharsetoptions checking; fix defaultsparse: one lessconcatcallutils:compactQueue: make it explicitly side-effectingbrowserify,eslint,@ljharb/eslint-config,iconv-lite,safe-publish-latest,tapenodev10.10,v9.11,v8.12,v6.14,v4.9; pin included builds to LTSConfiguration
📅 Schedule: Branch creation - "" (UTC), Automerge - At any time (no schedule defined).
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
🔕 Ignore: Close this PR and you won't be reminded about this update again.
This PR was generated by Mend Renovate. View the repository job log.