6.3 MEDIUM
- CVSS version (CVSS): 4.0
- Attack Vector (AV): Network (N)
- Attack Complexity (AC): Low (L)
- Attack Requirement (AT): Present (P)
- Privileges Required (PR): None (N)
- User Interaction (UI): None (N)
- Vulnerable System Impact Confidentiality (VC): None (N)
- Vulnerable System Impact Integrity (VI): None (N)
- Vulnerable System Impact Availability (VA): Low (L)
- Subsequent System Impact Confidentiality (SC): None (N)
- Subsequent System Impact Integrity (SI): None (N)
- Subsequent System Impact Availability (SA): None (N)
- Modified Attack Vector (MAV): Network (N)
- Modified Attack Complexity (MAC): Low (L)
- Modified Attack Requirement (MAT): Present (P)
- Modified Privileges Required (MPR): None (N)
- Modified User Interaction (MUI): None (N)
- Modified Vulnerable System Impact Confidentiality (MVC): None (N)
- Modified Vulnerable System Impact Integrity (MVI): None (N)
- Modified Vulnerable System Impact Availability (MVA): Low (L)
- Modified Subsequent System Impact Confidentiality (MSC): Negligible (N)
- Modified Subsequent System Impact Integrity (MSI): Negligible (N)
- Modified Subsequent System Impact Availability (MSA): Negligible (N)
- Safety (S): Not Defined (X)
- Automatable (AU): Not Defined (X)
- Recovery (R): Not Defined (X)
- Value Density (V): Not Defined (X)
- Vulnerability Response Effort (RE): Not Defined (X)
- Provider Urgency (U): Not Defined (X)
- Confidentiality Req. (CR): Not Defined (X)
- Integrity Req. (IR): Not Defined (X)
- Availability Req. (AR): Not Defined (X)
- Exploit Maturity (E): Not Defined (X)
Activity log
- Created suggestion
qs.stringify throws TypeError on objects with a non-callable constructor.isBuffer property
### 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.isBuffer(obj)); ``` Real `Buffer`, `safer-buffer`, and browserify `buffer` polyfill instances serialize exactly as before; only the throw is removed. ### Affected versions `>=2.2.5 <6.16.0`, fixed in v6.16.0. The unguarded duck-type was introduced in 3768a75 and first shipped in v2.2.5 (September 2014). v2.2.4 and earlier used `Buffer.isBuffer` and are not affected. Every release from v2.2.5 through v6.15.3 contains the unguarded call. ### Impact An unauthenticated request can make any code path that re-serializes attacker-influenced data with `qs.stringify` (for example, rebuilding a query string from `req.query` for a redirect or an upstream request, or serializing a parsed JSON body) throw synchronously. In a typical Node.js HTTP framework the throw is caught by the framework error boundary and the affected request returns a 500; the process survives and other requests are unaffected. Where the call runs outside an error boundary, such as an `async` Express 4 handler (where the throw becomes an unhandled promise rejection) or a background job, the process exits, so the impact in that case depends on the application error handling rather than on qs.
References
Affected products
- <6.16.0
Matching in nixpkgs
pkgs.qsv
CSVs sliced, diced & analyzed
pkgs.sqsh
Command line tool for querying Sybase/MSSQL databases
pkgs.tqsl
Software for using the ARRL Logbook of the World
pkgs.qsstv
Qt-based slow-scan TV and fax
pkgs.qsudo
Graphical sudo utility from Project Trident
-
nixos-unstable 2020.03.27
- nixpkgs-unstable 2020.03.27
- nixos-unstable-small 2020.03.27
-
nixos-26.05 2020.03.27
- nixos-26.05-small 2020.03.27
- nixpkgs-26.05-darwin 2020.03.27
pkgs.liboqs
C library for prototyping and experimenting with quantum-resistant cryptography
pkgs.qsynth
Fluidsynth GUI
pkgs.mmseqs2
Ultra fast and sensitive sequence search and clustering suite
pkgs.pdqsort
Novel sorting algorithm that combines the fast average case of randomized quicksort with the fast worst case of heapsort
-
nixos-unstable 0-unstable-2021-03-14
- nixpkgs-unstable 0-unstable-2021-03-14
- nixos-unstable-small 0-unstable-2021-03-14
-
nixos-26.05 0-unstable-2021-03-14
- nixos-26.05-small 0-unstable-2021-03-14
- nixpkgs-26.05-darwin 0-unstable-2021-03-14
pkgs.pipreqs
Generate requirements.txt file for any project based on imports
pkgs.qsvlite
CSVs sliced, diced & analyzed
pkgs.qsampler
LinuxSampler GUI front-end application
pkgs.qspeakers
Loudspeaker enclosure designer
pkgs.qsreplace
Accept URLs on stdin, replace all query string values with a user-supplied value
pkgs.trustedqsl
Software for using the ARRL Logbook of the World
pkgs.noctalia-qs
Flexible QtQuick based desktop shell toolkit
pkgs.qscreenshot
Simple creation and editing of screenshots
-
nixos-unstable 2021-10-18
- nixpkgs-unstable 2021-10-18
- nixos-unstable-small 2021-10-18
-
nixos-26.05 2021-10-18
- nixos-26.05-small 2021-10-18
- nixpkgs-26.05-darwin 2021-10-18
pkgs.qstopmotion
Create stopmotion animation with a (web)camera
pkgs.oqs-provider
Open Quantum Safe provider for OpenSSL (3.x)
pkgs.libsForQt5.qscintilla
Qt port of the Scintilla text editing library
pkgs.indi-3rdparty.indi-qsi
Third party drivers for the INDI astronomical software suite
-
nixos-unstable 3rdparty-indi-qsi-2.2.0
- nixpkgs-unstable 3rdparty-indi-qsi-2.2.0
- nixos-unstable-small 3rdparty-indi-qsi-2.2.4
-
nixos-26.05 3rdparty-indi-qsi-2.2.0
- nixos-26.05-small 3rdparty-indi-qsi-2.2.0
- nixpkgs-26.05-darwin 3rdparty-indi-qsi-2.2.0
pkgs.kdePackages.qscintilla
Qt port of the Scintilla text editing library
pkgs.qt6Packages.qscintilla
Qt port of the Scintilla text editing library
pkgs.python313Packages.aioqsw
Library to fetch data from QNAP QSW switches
pkgs.python314Packages.aioqsw
Library to fetch data from QNAP QSW switches
pkgs.python313Packages.bqscales
Grammar of Graphics scales for bqplot and other Jupyter widgets libraries
pkgs.python314Packages.bqscales
Grammar of Graphics scales for bqplot and other Jupyter widgets libraries
pkgs.python313Packages.qstylizer
Qt stylesheet generation utility for PyQt/PySide
pkgs.python314Packages.qstylizer
Qt stylesheet generation utility for PyQt/PySide
pkgs.gnomeExtensions.tailscale-qs
Add Tailscale to GNOME quick settings. Fork of joaophi/tailscale-gnome-qs with continued maintenance and improvements.
pkgs.haskellPackages.amazonka-sqs
Amazon Simple Queue Service SDK
-
nixos-unstable 2.0-unstable-2025-04-16
- nixpkgs-unstable 2.0-unstable-2025-04-16
- nixos-unstable-small 2.0-unstable-2025-04-16
-
nixos-26.05 2.0-unstable-2025-04-16
- nixos-26.05-small 2.0-unstable-2025-04-16
- nixpkgs-26.05-darwin 2.0-unstable-2025-04-16
pkgs.haskellPackages.bounded-qsem
Bounded quantity semaphores
pkgs.python313Packages.qscintilla
Python binding to QScintilla, Qt based text editing control
pkgs.python314Packages.qscintilla
Python binding to QScintilla, Qt based text editing control
pkgs.gnomeExtensions.tailscale-qs-2
Add Tailscale to GNOME quick settings
pkgs.haskellPackages.linearEqSolver
Use SMT solvers to solve linear systems over integers and rationals
pkgs.perlPackages.PerlPrereqScanner
Tool to scan your Perl code for its prerequisites
pkgs.perl5Packages.PerlPrereqScanner
Tool to scan your Perl code for its prerequisites
pkgs.python313Packages.mypy-boto3-sqs
Type annotations for boto3 sqs
pkgs.python313Packages.qscintilla-qt5
None
pkgs.python313Packages.qscintilla-qt6
None
pkgs.python314Packages.mypy-boto3-sqs
Type annotations for boto3 sqs
pkgs.python314Packages.qscintilla-qt5
None
pkgs.python314Packages.qscintilla-qt6
None
pkgs.python313Packages.pyqt6-qscintilla
Python binding to QScintilla, Qt based text editing control
-
nixos-unstable -
- nixos-unstable-small 2.14.1
pkgs.python314Packages.pyqt6-qscintilla
Python binding to QScintilla, Qt based text editing control
-
nixos-unstable -
- nixos-unstable-small 2.14.1
pkgs.python313Packages.aliyun-python-sdk-iqs
Module of Aliyun Python SDK (iqs)
pkgs.python313Packages.types-aiobotocore-sqs
Type annotations for aiobotocore sqs
pkgs.python314Packages.aliyun-python-sdk-iqs
Module of Aliyun Python SDK (iqs)
pkgs.python314Packages.types-aiobotocore-sqs
Type annotations for aiobotocore sqs
-
nixos-unstable -
- nixos-unstable-small 3.9.0
pkgs.perlPackages.PerlPrereqScannerNotQuiteLite
Tool to scan your Perl code for its prerequisites
Package maintainers
-
@honnip Jung seungwoo <me@honnip.page>
-
@returntoreality Linus Karl <linus@lotz.li>
-
@sheepforce Phillip Seeber <phillip.seeber@googlemail.com>
-
@peterhoeg Peter Hoeg <peter@hoeg.com>
-
@Sigmanificient Yohann Boniface <sigmanificient@gmail.com>
-
@natsukium Tomoya Otabi <nixpkgs@natsukium.com>
-
@iynaix Xianyi Lin <iynaix@gmail.com>
-
@Rixxc Aaron Kaiser <a_kaiser+nixpkgs@posteo.de>
-
@jherland Johan Herland <johan@herland.net>
-
@PsyanticY Psyanticy <iuns@outlook.fr>
-
@fabaff Fabian Affolter <mail@fabian-affolter.ch>
-
@bcdarwin Ben Darwin <bcdarwin@gmail.com>
-
@bjornfor Bjørn Forsman <bjorn.forsman@gmail.com>
-
@TomaSajt TomaSajt
-
@averagebit averagebit <averagebit@pm.me>
-
@hax404 Georg Haas <hax404foogit@hax404.de>
-
@romildo José Romildo Malaquias <malaquias@gmail.com>
-
@detroyejr Jonathan De Troye <detroyejr@outlook.com>
-
@misuzu misuzu <bakalolka@gmail.com>