CVE-2026-110910
>_ Opis
Tłumaczenie automatyczne – może zawierać nieścisłości.
### Podsumowanie
`qs.stringify` z `allowEmptyArrays: true` zapisuje klucz pustej tablicy bez jego kodowania, mimo że klucze są domyślnie zakodowane. Klucz zawierający `&` (lub skonfigurowany `separator`), `=` lub `#` ∴ staje się składnią ciągu zapytania zamiast danych, więc nazwa klucza dostarczona przez wywołującego może dodać parametry do serializowanego ciągu zapytania lub go skrócić.
### Szczegóły
W `lib/stringify.js` gałąź `allowEmptyArrays` zwraca `justedPrefix + '[]'' wcześniej, przed kodem przepuszczającym każdy inny klucz przez `encoder` i `formatter`. Zatem `{ "x&k=v": ["1"] }` serializuje jako `x%26k%3Dv%5B0%5D=1`, ale `{ "x&k=v": [] }` serializuje jako `x&k=v[]`. Wczesny powrót ma zastosowanie na dowolnej głębokości (`{ "a": { "b&k=v": [] } }` daje `a[b&k=v][]`), w każdym `arrayFormat`, z `allowDots` i z niestandardowym `koderem`, który nigdy nie jest wywoływany dla tego klucza. W przypadku opcji `encode: false` lub `encodeValuesOnly: true` klucze na każdej ścieżce celowo pozostają niezakodowane; nie ma to wpływu na te konfiguracje.
#### PoC
```j
var qs = wymagaj("qs");
var zapytanie = qs.stringify({ q: "cześć", "x&apiKey=evil&y": [] }, {allowEmptyArrays: true });
// "q=cześć&x&apiKey=zło&y[]"
qs.parse(zapytanie);
// { q: "cześć", x: "", apiKey: "zło", y: [""] }
qs.stringify({ "x#": [], z: "1" }, { zezwolenieEmptyArrays: true });
// "x#[]&z=1": w adresie URL wszystko po "#" staje się fragmentem
```
#### Napraw
Zastosowane w 234d505 na `main` i wydane jako v6.17.0: klucz pustej tablicy przechodzi przez `encoder` i `formatter` dokładnie tak samo, jak klucz dowolnej innej wartości, więc `{ "x&apiKey=evil&y": [] }` jest teraz serializowany jako `x%26apiKey%3Devil%26y[]`. Klucze, które nie wymagają kodowania, są serializowane jak poprzednio, z dwoma wyjątkami pasującymi do każdej innej ścieżki: nawiasy zagnieżdżonego klucza są teraz kodowane („a[b][]” staje się „a%5Bb%5D[]”, które `qs.parse` czyta identycznie), a w przypadku `encodeDotInKeys` kropka w kluczu staje się `%252E` zamiast `%2E` (co „decodeDotInKeys” wcześniej błędnie odczytane jako zagnieżdżenie).
### Wersje, których dotyczy problem
`>=6.12.0 <6.17.0`, naprawiono w wersji 6.17.0.
Opcja `allowEmptyArrays` została wprowadzona w f22b2bc i po raz pierwszy wysłana w wersji 6.12.0, z tym wczesnym powrotem. Dotyczy to każdej wersji od 6.12.0 do 6.16.1. Wcześniejsze wersje nie mają opcji „allowEmptyArrays” i nie ma to na nią wpływu.
### Wpływ
Aplikacja, która przekazuje obiekt, którego nazwy kluczy pochodzą z niezaufanych danych wejściowych do `qs.stringify` za pomocą `allowEmptyArrays: true` (na przykład w celu przesłania przeanalizowanej treści JSON lub pól wybranych przez użytkownika do usługi nadrzędnej) może mieć wstrzyknięte parametry do wynikowego ciągu zapytania. Wstrzyknięte parametry nie są kluczami obiektu, więc usunięcie lub nadpisanie klucza na obiekcie (np. ustawienie zaufanego `apiKey` po skopiowaniu pól użytkownika) nie powoduje ich usunięcia; to, czy wartość atakującego, czy wygrana aplikacji, zależy od tego, jak strona odbierająca obsługuje zduplikowany parametr. `#` w takim kluczu kończy ciąg zapytania wcześniej, gdy wynik jest umieszczany w adresie URL. Opcja „allowEmptyArrays” jest domyślnie wyłączona i dotyczy to tylko kluczy, których wartość (po dowolnym „filtrze”) jest pustą tablicą.
>_ 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