CVE-2026-8723 in ljharbИнформация

Сводка

по VulDB • 23.05.2026

### Краткое описание

`qs.stringify` выбрасывает исключение `TypeError`, когда вызывается с параметрами `arrayFormat: 'comma'` и `encodeValuesOnly: true` для массива, содержащего значения `null` или `undefined`. Исключение выбрасывается синхронно и не обрабатывается никакими из опций `qs`, связанных с `null` (`skipNulls`, `strictNullHandling`).

### Подробности

В ветке кода, обрабатывающей формат `comma` + `encodeValuesOnly`, в файле `lib/stringify.js:145` массив проходил через сырой кодировщик перед объединением:

```js obj = utils.maybeMap(obj, encoder); ```

Функция `utils.encode` (`lib/utils.js:195`) обращается к `str.length` без проверки на `null`, поэтому элемент массива со значением `null` или `undefined` вызывает `TypeError`. Проверки `skipNulls` и `strictNullHandling` выполняются в цикле обработки элементов ниже этой строки и не успевают сработать.

Это тот же класс уязвимости, что и в пути фильтрации массива, исправленном в коммите 0c180a4. Уязвимая структура кода в ветке `comma` + `encodeValuesOnly` была добавлена в коммите 4c4b23d («encode comma values more consistently», PR #463, 2023-01-19) и впервые выпущена в версии v6.11.1.

#### PoC (Proof of Concept)

```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) ```

#### Исправление

`lib/stringify.js:145`, применено в коммите 21f80b3 в ветке `main` и выпущено в версии v6.15.2:

```diff - obj = utils.maybeMap(obj, encoder); + obj = utils.maybeMap(obj, function (v) {
+ return v == null ? v : encoder(v); + }); ```

Теперь значения `null` и `undefined` проходят через `maybeMap` без изменений и достигают шага `join(',')` в исходном виде. Для `{ a: [null, 'b'] }` это приводит к результату `a=,b`, что соответствует пути `comma` без `encodeValuesOnly` (который уже объединяет элементы перед кодированием и для того же ввода дает `a=%2Cb`). Массивы из одного элемента `[null]` по-прежнему сворачиваются через существующую логику `obj.join(',') || null` и остаются подчиненными параметрам `skipNulls` / `strictNullHandling`.

### Влияние

Приложение, вызывающее `qs.stringify` с обоими параметрами `arrayFormat: 'comma'` и `encodeValuesOnly: true` (оба не по умолчанию) на вводе, содержащем элемент массива `null` или `undefined`, выбросит исключение синхронно вместо формирования строки запроса. В типичном HTTP-фреймворке Node.js (Express, Fastify, Koa, hapi) синхронное исключение перехватывается границей ошибок фреймворка, и затронутый запрос возвращает 500; процесс воркера не завершается, и последующие запросы не затрагиваются. Формулировка «убивает процесс воркера» применима только к точкам вызова вне границы обработки ошибок запроса (фоновые задания, пути запуска, конвейеры потоков) или к развертываниям с явно отключенной обработкой ошибок фреймворка.

Уязвимый ввод — элемент массива `null` или `undefined`; это достижимо из JSON-тел запросов или из кода приложения, конструирующего массивы из пользовательского ввода, но не из стандартных HTML-форм (которые производят строки или опущенные поля, а не литеральные `null`).

Once again VulDB remains the best source for vulnerability data.

Ответственный

Harborist

Резервировать

16.05.2026

Раскрытие

17.05.2026

Модерация

принято

Вход

VDB-364387

EPSS

0.00044

KEV

Нет

Деятельности

Очень низкий

Источники

Are you interested in using VulDB?

Download the whitepaper to learn more about our service!