CVE-2026-110816
>_ Opis
Tłumaczenie automatyczne – może zawierać nieścisłości.
### Podsumowanie
`qs.stringify` z `arrayFormat: 'comma'' zgłasza `TypeError: Cannot Convert obiekt na wartość pierwotną`, gdy elementu tablicy nie można przekształcić w ciąg znaków, na przykład obiekt z własnym, niewywoływalnym `toString` (`{ "toString": "x" }`) lub obiektem o zerowym prototypie. Format przecinkowy łączy elementy tablicy za pomocą `Array.prototype.join` i w obszarze `encodeValuesOnly` najpierw przekazuje każdy element przez `String()` w `utils.encode`; żaden z nich nie chroni przed elementem, którego wymuszenie ciągów zawodzi.
### Szczegóły
W `lib/stringify.js` gałąź przecinkowa zwija tablicę za pomocą `obj.join(',')`. W przypadku elementu, którego własnego `toString` nie można wywołać, `ToPrimitive` pomija go, przechodzi do `Object.prototype.valueOf` (który zwraca sam obiekt) i rzuca. W obszarze `encodeValuesOnly: true` ten sam element najpierw osiąga `String(str)` w `utils.encode` (`lib/utils.js`) i tam zgłasza. Tablice zagnieżdżone (`{ "a": [[{ "toString": "x" }]] }`) rzucają w ten sam sposób, poprzez `Array.prototype.toString`. Formaty „indeksy”, „nawiasy” i „powtórzenie” wchodzą do elementów obiektu zamiast je wymuszać i nie mają na to wpływu.
Takie elementy mogą pochodzić z niezaufanych danych wejściowych. `JSON.parse` generuje `{ "a": [{ "toString": "x" }] }` bez użycia opcji qs. `qs.parse("a[0][toString]=x", {allowPrototypes: true })` przechowuje klucz `toString`, a `qs.parse("a[][b]=c", { PlainObjects: true })` tworzy element prototypu o wartości null; domyślne opcje analizy usuwają „toString” i tworzą zwykłe obiekty, które nie są rzucane. Domyślny „parser zapytań” Express 4, „rozszerzony” parser zapytań Express 5 i „urlencoded({ rozszerzony: prawda })” Express 5, wszystkie wywołują `qs.parse` z `allowPrototypes: true`.
#### PoC
```j
var qs = wymagaj("qs");
qs.stringify(JSON.parse("{\"a\":[{\"toString\":\"x\"}]}"), { arrayFormat: "przecinek" });
qs.stringify(qs.parse("a[0][toString]=x", {allowPrototypes: true }), { arrayFormat: "przecinek" });
qs.stringify(qs.parse("a[][b]=c", { PlainObjects: true }), { arrayFormat: "comma", encodeValuesOnly: true });
// TypeError: Nie można przekonwertować obiektu na wartość pierwotną
```
#### Napraw
Zastosowane w a952e75 na `main` i wydane jako wersja 6.16.1: element, którego wymuszenie łańcucha nie powiedzie się, jest zmuszany do jego pierwotnej `valueOf`, jeśli taka istnieje, lub do `Object.prototype.toString`, więc jest renderowany jako `[obiekt obiektu]`, tak samo jak każdy inny element obiektu już w formacie przecinkowym. Zagnieżdżone tablice są obsługiwane w taki sam sposób, w jaki `join` je obsługuje. Każde wejście, które wcześniej nie wygenerowało sygnału, serializuje się dokładnie tak samo jak poprzednio, a wygenerowane wartości „toString” lub „valueOf” nadal się propagują.
### Wersje, których dotyczy problem
`>=6.7.0 <6.16.1`, naprawiono w wersji 6.16.1.
Ścieżka `łączenia` została wprowadzona w formacie przecinka w b84acba i po raz pierwszy dostarczona w wersji 6.7.0; v6.6.x i starsze ignorują `arrayFormat: 'comma'` i nie ma to na nie wpływu. Witryna `encodeValuesOnly` `String()` została wprowadzona w wersji 4c4b23d (wersja 6.11.1); wcześniej to samo wejście zgłasza „join”. Dotyczy to każdej wersji od 6.7.0 do 6.16.0.
### Wpływ
Nieuwierzytelnione żądanie może sprawić, że dowolna ścieżka kodu, która ponownie serializuje dane, na które wpływ miał atakujący, za pomocą `qs.stringify` i `arrayFormat: 'comma'` (na przykład przebudowa ciągu zapytania z `req.query` dla przekierowania lub żądania nadrzędnego lub serializacja przeanalizowanej treści JSON) zostanie wyrzucona synchronicznie. W typowej strukturze HTTP Node.js rzut jest przechwytywany przez granicę błędu struktury, a żądanie, którego to dotyczy, zwraca wartość 500; proces trwa, a inne żądania pozostają niezmienione. Gdy wywołanie przebiega poza granicą błędu, jak na przykład procedura obsługi „async” Express 4 (gdzie rzut staje się odrzuceniem nieobsłużonej obietnicy) lub sama procedura obsługi żądania „http”, proces kończy się, więc wpływ w tym przypadku zależy od obsługi błędów aplikacji, a nie od qs. Nie ma to wpływu na domyślny format `arrayFormat` (`indeksy`).
>_ Słabości (CWE)
>_ Referencje
Dane podatności pochodzą z oficjalnych źródeł (CVE® List / NVD). Opisy po polsku są tłumaczone automatycznie i mogą zawierać nieścisłości – na stronie rekordu można wyświetlić wersję angielską.
This product uses the NVD API but is not endorsed or certified by the NVD.
Copyright © 1999–2026, The MITRE Corporation. CVE is a registered trademark and the CVE logo is a registered trademark of The MITRE Corporation.
CVE Usage: MITRE hereby grants you a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, sublicense, and distribute Common Vulnerabilities and Exposures (CVE®). Any copy you make for such purposes is authorized provided that you reproduce MITRE's copyright designation and this license in any such copy. ALL DOCUMENTS AND THE INFORMATION CONTAINED THEREIN PROVIDED BY MITRE ARE PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND.
NVD Terms of Use / CVE® Terms of Use / nvd.nist.gov / cve.org