cbcvebase.
CVE-2026-82417
published 2026-08-30

CVE-2026-82417: ### Summary `qs.stringify` throws a `TypeError` when it serializes an object whose own `constructor` property has a truthy, non-callable `isBuffer` member…

PriorityP429medium5.3CVSS 3.1
AVNACLPRNUINSUCNINAL
EPSS
0.26%
17.8th percentile
### Summary


`qs.stringify` throws a `TypeError` when it serializes an object whose own `constructor` property has a truthy, non-callable `isBuffer` member. `utils.isBuffer` duck-types buffers by calling `obj.constructor.isBuffer(obj)` after checking only that the property is truthy, so a value such as `{ constructor: { isBuffer: "x" } }` makes the call throw `TypeError: obj.constructor.isBuffer is not a function`.


### Details


`lib/stringify.js:127` calls `utils.isBuffer` on every non-primitive value it serializes. `utils.isBuffer` (`lib/utils.js:332`) reads `obj.constructor.isBuffer` and invokes it without verifying that it is a function. `constructor` and `isBuffer` are ordinary property names, so any object carrying them as own properties reaches the unchecked call.


Such an object can be built from untrusted input. `qs.parse("x[constructor][isBuffer]=y", { plainObjects: true })` or `{ allowPrototypes: true }` keeps the `constructor` key as an own property (the default parse options drop it), and `JSON.parse("{\"a\":{\"constructor\":{\"isBuffer\":\"x\"}}}")` produces the same shape with no qs option involved. Express 4 with its default `query parser` setting and body-parser with `extended: true` both call `qs.parse` with `allowPrototypes: true`, so on those stacks `req.query` and `req.body` can carry the shape directly.


#### PoC


```js


var qs = require("qs");


qs.stringify(qs.parse("x[constructor][isBuffer]=y", { plainObjects: true }));


qs.stringify(JSON.parse("{\"a\":{\"constructor\":{\"isBuffer\":\"x\"}}}"));


// TypeError: obj.constructor.isBuffer is not a function


// at Object.isBuffer (lib/utils.js:332:78)


// at stringify (lib/stringify.js:127:45)


```


#### Fix


`lib/utils.js`, applied in e83d321 on `main` and released as v6.16.0:


```diff


- return !!(obj.constructor && obj.constructor.isBuffer && obj.constructor.isBuffer(obj));


+ return !!(obj.constructor && typeof obj.constructor.isBuffer === "function" && obj.constructor.isBuff

Affected

95 ranges· showing 25
VendorProductVersion rangeFixed in
3scale-amp2system-rhel8
advanced-cluster-securityrhacs-main-rhel8
advanced-cluster-securityrhacs-main-rhel9
ansible-automation-platform-24lightspeed-rhel8
ansible-automation-platform-25lightspeed-rhel8
ansible-automation-platform-26lightspeed-rhel9
ansible-automation-platform-27mcp-server-rhel9
ansible-automation-platform-tech-previewmcp-server-rhel9
ansible-automation-platformautomation-portal
ansible-automation-platformbootc-automation-portal-rhel9
clusterlabspcs
costmanagementcostmanagement-ui-rhel10
cryostatcryostat-openshift-console-plugin-rhel9
debianceph
devspacescode-rhel9
devspacesdashboard-rhel9
devspacesjetbrains-ide-rhel9
devspacesopenvsx-rhel9
devspacespluginregistry-rhel9
discoverydiscovery-ui-rhel9
external-secrets-managementconsole-plugin-rhel9
grafanagrafana
ljharbqs>= 2.2.5 < 6.16.06.16.0
mtamta-solution-server-rhel9
mtamta-ui-rhel9

CVSS provenance

nvdv3.15.3MEDIUMCVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L
nvdv4.06.3MEDIUMCVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:N/VA:L/SC:N/SI:N/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X
vendor_redhat5.3MEDIUM
Stop checking back — get the weekly exploitation signal.

Every Monday: what got weaponized or added to CISA KEV in the last seven days — each CVE cross-linked to its PoC, Nuclei template, and detection rule. Free, one email a week, unsubscribe in one click.