CVE-2026-8723
ŚrednieCVSS 5.3Prawdopodobieństwo exploitacji (EPSS)
Niskie ryzykoPercentyl 35 - wyżej niż 35% wszystkich znanych CVE
Streszczenie
Biblioteka qs w wersjach od 6.11.1 do 6.15.2 zawiera błąd, który powoduje synchroniczny wyjątek TypeError podczas wywołania qs.stringify z opcjami arrayFormat: 'comma' i encodeValuesOnly: true, gdy tablica zawiera element null lub undefined. Opcje skipNulls i strictNullHandling nie są wtedy respektowane, ponieważ błąd występuje przed ich sprawdzeniem. Podatność została naprawiona w wersji 6.15.2.
Ocena ryzyka
Aplikacje Node.js używające qs.stringify z tymi dwiema nie domyślnymi opcjami mogą zwracać błąd HTTP 500 dla żądań zawierających null lub undefined w tablicy, co może prowadzić do odmowy usługi lub nieoczekiwanych błędów. W kontekstach poza obsługą żądań (np. zadania w tle) może to nawet zakończyć proces roboczy.
Rekomendacja
Zaktualizuj bibliotekę qs do wersji 6.15.2 lub nowszej. Jeśli aktualizacja nie jest możliwa, unikaj jednoczesnego stosowania arrayFormat: 'comma' i encodeValuesOnly: true lub filtruj wartości null/undefined przed wywołaniem qs.stringify.
Inne podatności w qs
Zobacz wszystkie- CVE-2026-110910Niskie
Podatność w bibliotece qs polega na tym, że przy opcji allowEmptyArrays: true klucz pustej tablicy jest zapisywany bez kodowania, mimo że domyślnie klucze są kodowane. Klucz zawierający znaki &, = lub # może wtedy wstrzyknąć dodatkowe parametry do serializowanego query stringa lub przedwcześnie go zakończyć. Problem dotyczy wersji od 6.12.0 do 6.12.5, od 6.13.0 do 6.13.3, od 6.14.0 do 6.14.2, od 6.15.0 do 6.15.3 oraz od 6.16.0 do 6.16.1.
- CVE-2026-110816Średnie
Podatność w bibliotece qs dotyczy funkcji qs.stringify z opcją arrayFormat: 'comma', która zgłasza wyjątek TypeError, gdy element tablicy nie może zostać przekonwertowany na string (np. obiekt z własnym niecallowalnym toString lub obiekt z prototypem null). Problem występuje w wersjach od 6.7.0 do 6.16.0 i został naprawiony w wersji 6.16.1. Wejście może pochodzić z niezaufanych źródeł, m.in. przez JSON.parse lub qs.parse z allowPrototypes: true.
- CVE-2026-82562Niskie
Podatność w bibliotece qs pozwala ominąć limit rozmiaru tablicy (arrayLimit) dla wartości rozdzielanych przecinkami, gdy używane są opcje comma: true i throwOnLimitExceeded: true. Dotyczy to kluczy w formie a[]=, gdzie wartość jest dzielona na tablicę bez sprawdzania limitu, co umożliwia alokację dowolnie dużej tablicy. Problem występuje w wersjach od 6.14.2 do 6.15.3 i został naprawiony w wersji 6.16.0.
- CVE-2026-82417Średnie
Funkcja `qs.stringify` w bibliotece qs rzuca wyjątek `TypeError`, gdy serializuje obiekt, którego własna właściwość `constructor` ma prawdziwą, ale niebędącą funkcją właściwość `isBuffer`. Sprawdzenie typu w `utils.isBuffer` wywołuje `obj.constructor.isBuffer(obj)` bez weryfikacji, czy jest to funkcja, co prowadzi do błędu. Podatność dotyczy wersji od 2.2.5 do 6.15.3, naprawiona w 6.16.0.
- CVE-2025-15284Niskie
Podatność w bibliotece qs (moduł parse) polega na nieprawidłowej walidacji danych wejściowych — opcja arrayLimit nie była egzekwowana dla notacji nawiasowej (a[]=1&a[]=2), a jedynie dla notacji indeksowanej (a[0]=1). Pozwala to na tworzenie tablic większych niż zdefiniowany limit. Domyślna wartość parameterLimit (1000) w praktyce ogranicza skalę problemu.
Oryginalny opis (angielski, źródło NVD)
### Summary `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`). ### Details In the comma + `encodeValuesOnly` branch, `lib/stringify.js:145` mapped the array through the raw encoder before joining: ```js obj = utils.maybeMap(obj, encoder); ``` `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. Same 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. #### PoC ```js const qs = require('qs'); qs.stringify({ a: [null, 'b'] }, { arrayFormat: 'comma', encodeValuesOnly: true }); qs.stringify({ a: [undefined, 'b'] }, { arrayFormat: 'comma', encodeValuesOnly: true }); qs.stringify({ a: [null] }, { arrayFormat: 'comma', encodeValuesOnly: true }); // TypeError: Cannot read properties of null (reading 'length') // at encode (lib/utils.js:195:13) // at Object.maybeMap (lib/utils.js:322:37) // at stringify (lib/stringify.js:145:25) ``` #### Fix `lib/stringify.js:145`, applied in 21f80b3 on `main` and released as v6.15.2: ```diff - obj = utils.maybeMap(obj, encoder); + obj = utils.maybeMap(obj, function (v) { + return v == null ? v : encoder(v); + }); ``` `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. ### Affected versions `>=6.11.1 <6.15.2` — fixed in v6.15.2. The 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. ### Impact Application 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. The 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`).
Dane podatności pochodzą z NVD (NIST) · CISA KEV · EPSS

