## Резюме `qs.stringify` бросает `TypeError` при вызове с `rrayFormat: 'comma'' и `encodeValuesTOnly: true` на массиве, содержащем `null` и…
## Резюме `qs.stringify` бросает `TypeError` при вызове с `rrayFormat: 'comma'' и `encodeValuesTOnly: true` на массиве, содержащем `null` или 'undefined`. Бросок является синхронным и не обрабатывается ни одним из нулевых вариантов qs (`skipNulls`, ``strictNullHandling`). ## Детали В запятой + `encodeValuesOnly' филиал `lib/stringify.js:145` отобрал массив через сырой кодировщик перед присоединением: ```s obj = utils.maybeMap (obj, encoder); `` "utils.encode`"(`lib/utils.js.195`) читает `utils.length` без nulle guard, поэтому ``null` или 'undefined`' элемент "TypeError`". `skipNulls` и ``strictNullHandling` оба проверяются в цикле на душу населения ниже этой линии и никогда не получают шанса запустить. Те же класс ошибок, что и фильтр-чиповый путь, зафиксированный в 0c180a4. Уязвимая форма ветви запятой + `encodeValuesOnly` была введена в 4c4b23d («кодовые значения запятой более последовательно», PR #463, 2023-01-19), впервые выпущенная в v6.11.1. ### # # PoC ```s const qs = потребуются('qs'); qs.stringify({ a: [null, 'b'] }, { arrayFormat: 'comma', encodeValuesТолько: true }); qs.stringify({ a: [неопределенный, 'b'] }, { arrayFormat: 'comma', encodeValuesTOnly: true }); qs.stringify({ a: [null] }, { arrayFormat: 'comma', encodeValuesТолько: true }); // TypeError: Невозможно прочитать свойства нуля (чтение 'длина') // при коде (lib/utils.js:195:13) // на Object.maybeMap (lib/utils.js:32:37) // в строке (lib/stringify.js:145:25) `` ### Фикс `lib/stringify.js:145`, применяется в 21f80b3 на `main` и выпущен в качестве v6.15.2: "Дифф" - obj = utils.maybeMap (obj, кодировщик); + obj = utils.maybeMap(obj, функция (v) { + возврат v == null ? v : кодировщик(v); + }); `` `null` и 'undefined`` теперь проходит через `ymbeMap` неизменный и достигать ``noll',')' шаг как-ист. Для `{ a: [null, 'b'] }` это производит `a=,b`, соответствие пути запятой non-`encodeValuesOnly` (который уже соединяется перед кодированием и производит `a=%2Cb` для того же входа). Одноэлементные `[null]` массивы по-прежнему разрушаются через существующий `obj.join(',') || null` и остаются предметом `skipNulls` / `_strictNullHandling` в основном цикле. ## # Затронутые версии `>>=6.11.1 <6.15.2` — закреплен в v6.15.2. Уязвимая форма кода была введена в 4c4b23d и впервые отгружена в v6.11.1. Более ранние версии — включая все 6.7x, 6.8.x, 6.9.x, 6.10.x и 6.11.0 — реализовали путь запятой + `encodeValuesOnly` по-разному (вступление перед кодированием) и не затрагиваются. Эмпирически проверено в выпущенных версиях. ## Impact Код приложения, который называет `qs.stringify` с как «rrarayFormat: 'comma'`» и `encodeValuesTOnly: true` (оба не по умолчанию) на входе, которые могут содержать `null` или 'undedefined` Элемент массива, будет бросать синхронно вместо того, чтобы создавать строку запроса. В типичном HTTP-кадрате Node.js (Express, Fastify, Koa, hapi) бросок синхронизации задерживается границей ошибки фреймворка, и затронутый запрос возвращает 500; рабочий процесс не выходит, и последующие запросы не затрагиваются. Обрамление «убивает рабочий процесс» применяется только к сайтам вызова за пределами границы ошибок запроса-обработника (фоновые рабочие места, пути запуска, потоковые трубопроводы) или к развертываниям с каркасной обработкой ошибок, явно отключенной. Уязвимый ввод - это нулевая или неопределенная запись внутри массива; это доступно от органов запроса JSON или от массивов кодов приложений, содержащих пользовательский ввод, но не из стандартных HTML-форм (которые производят строки или опущенные поля, а не буквальные `null`).
Продукт разыменовывает указатель, который предполагается допустимым, однако оказывается равным NULL.
https://cwe.mitre.org/data/definitions/476.html →Открыть в коллекции CWE →