CVE-2026-8723: qs has a remotely triggerable DoS Qs.stringify Crashes With TypeError On Vulnerability
MODERATECVE-2026-8723 is a MODERATE (CVSS 5.3) qs.stringify crashes with typeerror on vulnerability (CWE-476: NULL Pointer Dereference) affecting qs has a remotely triggerable DoS libraries in the npm ecosystem. The issue involves qs.stringify crashes with typeerror on null/undefined entries in comma-format arrays when encodevaluesonly is set. Remediation is available by upgrading affected packages to version 6.15.2.
CVE-2026-8723 at a Glance
Security Impact
CVSS: 5.3
The security impact metrics below are parsed directly from the CVSS v3.1 vector string (CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L).
How to Fix CVE-2026-8723
To remediate this vulnerability, upgrade all affected qs has a remotely triggerable DoS dependencies to a patched release. Both direct and transitive dependencies should be checked, as frameworks or security libraries may pull in vulnerable versions transitively.
npm install qs@6.15.2
Run the following command in your project directory to verify that all resolved dependencies use the patched release:
npm ls qs
How to Check if You Are Affected
To determine whether your Node.js application is affected by CVE-2026-8723, inspect your project dependencies using npm:
npm ls qs
Analyze the terminal output to locate any version of qs has a remotely triggerable DoS in your dependency tree. If any resolved version matches the vulnerable ranges listed in the table below (for example, versions earlier than 6.15.2), your application is affected.
Note: The npm ls qs command inspects dependencies declared in your package.json and lockfile; it does not perform automated runtime dynamic scanning.
Technical Details
Vulnerability Mechanism & Technical Analysis
This vulnerability is classified under CWE-476: NULL Pointer Dereference, where the product dereferences a pointer that it expects to be valid but is null. In qs has a remotely triggerable DoS, software state validation or input boundaries are circumvented during processing. Review the official source advisory statement below for specific affected components, classes, and reproduction details.
Source Advisory Statement
CVE-2026-8723 Affected qs has a remotely triggerable DoS Versions
1 component(s)| Product / Package | Ecosystem | Affected Versions | Fixed Version |
|---|---|---|---|
|
qs
|
npm |
≥ 6.11.1
< 6.15.2
|
6.15.2
|
References
Frequently Asked Questions
What is CVE-2026-8723?
Which qs has a remotely triggerable DoS versions are affected?
What version fixes CVE-2026-8723?
Is qs affected?
What is the CVSS score of CVE-2026-8723?
What CWE is associated with CVE-2026-8723?
How can I check npm dependencies for CVE-2026-8723?
Machine-readable OSV JSON
OSV v1.5 Schema
{
"schema_version" : "1.4.0",
"id" : "GHSA-q8mj-m7cp-5q26",
"modified" : "2026-05-22T17:27:19Z",
"published" : "2026-05-22T17:27:19Z",
"aliases" : [ "CVE-2026-8723" ],
"summary" : "qs has a remotely triggerable DoS: qs.stringify crashes with TypeError on null/undefined entries in comma-format arrays when encodeValuesOnly is set",
"details" : "### Summary\n\n`qs.stringify` throws `TypeError` when called with `arrayFormat: 'comma'` and `encodeValuesOnly: true` on an array containing `null` or `undefined`. The throw is synchronous and not handled by any of qs's null-related options (`skipNulls`, `strictNullHandling`).\n\n### Details\n\nIn the comma + `encodeValuesOnly` branch, `lib/stringify.js:145` mapped the array through the raw encoder before joining:\n\n```js\nobj = utils.maybeMap(obj, encoder);\n```\n\n`utils.encode` (`lib/utils.js:195`) reads `str.length` with no null guard, so a `null` or `undefined` element throws `TypeError`. `skipNulls` and `strictNullHandling` are both checked in the per-element loop below this line and never get a chance to run.\n\nSame class of bug as the filter-array path fixed in 0c180a4. The vulnerable shape of the comma + `encodeValuesOnly` branch was introduced in 4c4b23d (\"encode comma values more consistently\", PR #463, 2023-01-19), first released in v6.11.1.\n\n#### PoC\n\n```js\nconst qs = require('qs');\n\nqs.stringify({ a: [null, 'b'] }, { arrayFormat: 'comma', encodeValuesOnly: true });\nqs.stringify({ a: [undefined, 'b'] }, { arrayFormat: 'comma', encodeValuesOnly: true });\nqs.stringify({ a: [null] }, { arrayFormat: 'comma', encodeValuesOnly: true });\n// TypeError: Cannot read properties of null (reading 'length')\n// at encode (lib/utils.js:195:13)\n// at Object.maybeMap (lib/utils.js:322:37)\n// at stringify (lib/stringify.js:145:25)\n```\n\n#### Fix\n\n`lib/stringify.js:145`, applied in 21f80b3 on `main`:\n\n```diff\n- obj = utils.maybeMap(obj, encoder);\n+ obj = utils.maybeMap(obj, function (v) {\n+ return v == null ? v : encoder(v);\n+ });\n```\n\n`null` and `undefined` now pass through `maybeMap` unchanged and reach the `join(',')` step as-is. For `{ a: [null, 'b'] }` this produces `a=,b`, matching the non-`encodeValuesOnly` comma path (which already joins before encoding and produces `a=%2Cb` for the same input). Single-element `[null]` arrays still collapse via the existing `obj.join(',') || null` and remain subject to `skipNulls` / `strictNullHandling` in the main loop.\n\n### Affected versions\n\n`>=6.11.1 <=6.15.1`\n\nThe vulnerable code shape was introduced in 4c4b23d and first shipped in v6.11.1. Earlier versions — including all of 6.7.x, 6.8.x, 6.9.x, 6.10.x, and 6.11.0 — implemented the comma + `encodeValuesOnly` path differently (joining before encoding) and are not affected. Empirically verified across released versions.\n\n### Impact\n\nApplication code that calls `qs.stringify` with both `arrayFormat: 'comma'` and `encodeValuesOnly: true` (both non-default) on input that may contain a `null` or `undefined` array element will throw synchronously instead of producing a query string. In a typical Node.js HTTP framework (Express, Fastify, Koa, hapi) the sync throw is caught by the framework's error boundary and the affected request returns a 500; the worker process does not exit and subsequent requests are unaffected. The \"kills the worker process\" framing applies only to call sites outside a request-handler error boundary (background jobs, startup paths, stream pipelines) or to deployments with framework error handling explicitly disabled.\n\nThe vulnerable input is a `null` or `undefined` entry inside an array; this is reachable from JSON request bodies or from application code constructing arrays from user input, but not from standard HTML form submissions (which produce strings or omitted fields, not literal `null`).",
"severity" : [ {
"type" : "CVSS_V3",
"score" : "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L"
}, {
"type" : "CVSS_V4",
"score" : "CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:N/VA:L/SC:N/SI:N/SA:N"
} ],
"affected" : [ {
"package" : {
"ecosystem" : "npm",
"name" : "qs"
},
"ranges" : [ {
"type" : "ECOSYSTEM",
"events" : [ {
"introduced" : "6.11.1"
}, {
"fixed" : "6.15.2"
} ]
} ],
"database_specific" : {
"last_known_affected_version_range" : "<= 6.15.1"
}
} ],
"references" : [ {
"type" : "WEB",
"url" : "https://github.com/ljharb/qs/security/advisories/GHSA-q8mj-m7cp-5q26"
}, {
"type" : "ADVISORY",
"url" : "https://nvd.nist.gov/vuln/detail/CVE-2026-8723"
}, {
"type" : "WEB",
"url" : "https://github.com/ljharb/qs/commit/21f80b33e5c8b3f7eba1034fff0da4a4a37a1d41"
}, {
"type" : "PACKAGE",
"url" : "https://github.com/ljharb/qs"
} ],
"database_specific" : {
"cwe_ids" : [ "CWE-476" ],
"severity" : "MODERATE",
"github_reviewed" : true,
"github_reviewed_at" : "2026-05-22T17:27:19Z",
"nvd_published_at" : "2026-05-17T00:16:21Z"
}
}