CVE-2026-2391
Təsvir
### Xülasə qs kitabxanasındakı `arrayLimit` seçimi, `comma: true` aktiv olduqda vergüllə ayrılmış dəyərlər üçün limitləri tətbiq etmir və bu, hücumçulara yaddaşın tükənməsi vasitəsilə xidmətdən imtina (DoS) yaratmağa imkan verir. Bu, GHSA-6rw7-vpxm-498p (CVE-2025-15284) ilə həll edilmiş mötərizə notasiyası yan keçməsinə bənzər şəkildə massiv limiti tətbiqinin yan keçməsidir. ### Təfərrüatlar `comma` seçimi `true` olaraq təyin edildikdə (defolt deyil, lakin tətbiqlərdə konfiqurasiya edilə bilər), qs vergüllə ayrılmış sətirlərin massiv kimi parse edilməsinə icazə verir (məsələn, `?param=a,b,c` $\rightarrow$ `['a', 'b', 'c']`). Lakin, `arrayLimit` (defolt: 20) üçün limit yoxlaması və opsional `throwOnLimitExceeded` funksiyası `parseArrayValue`-da vergül emalı məntiqindən sonra baş verir ki, bu da yan keçməyə şərait yaradır. Bu, tək bir parametr vasitəsilə istənilən ölçüdə böyük massivlərin yaradılmasına və nəticədə həddindən artıq yaddaş ayrılmasına səbəb olur. **Zəiflik olan kod** (lib/parse.js: sətirlər ~40-50): ```js if (val && typeof val === 'string' && options.comma && val.indexOf(',') > -1) { return val.split(','); } if (options.throwOnLimitExceeded && currentArrayLength >= options.arrayLimit) { throw new RangeError('Array limit exceeded. Only ' + options.arrayLimit + ' element' + (options.arrayLimit === 1 ? '' : 's') + ' allowed in an array.'); } return val; ``` `split(',')` funksiyası massivi dərhal qaytarır və növbəti limit yoxlamasını ötürür. `utils.combine` vasitəsilə aşağı axında birləşdirmə prosesi, seyrək massivlər üçün daşmaları qeyd etsə belə, yaddaş ayrılmasının qarşısını almır. Bu uyğunsuzluq hücumçuların milyonlarla vergülü olan tək bir parametr göndərməsinə (məsələn, `?param=,,,,,,,,...`) və limitləri tetiklemədən yaddaşda nəhəng massivlərin ayrılmasına imkan verir. Bu, indeksli (`a[0]=`) və mötərizə (`a[]=`) notasiyaları üçün düzgün tətbiq edilən (sonuncu v6.14.1 versiyasında GHSA-6rw7-vpxm-498p əsasında düzəldilib) `arrayLimit` məqsədini yan keçir. ### PoC **Test 1 - Əsas yan keçmə:** ``` npm install qs ``` ```js const qs = require('qs'); const payload = 'a=' + ','.repeat(25); // split-dən sonra 26 element (arrayLimit: 5 yan keçilir) const options = { comma: true, arrayLimit: 5, throwOnLimitExceeded: true }; try { const result = qs.parse(payload, options); console.log(result.a.length); // Çıxış: 26 (yan keçmə uğurludur) } catch (e) { console.log('Limit enforced:', e.message); // Atılmır } ``` **Konfiqurasiya:** - `comma: true` - `arrayLimit: 5` - `throwOnLimitExceeded: true` Gözlənilən: "Array limit exceeded" xətası atılır. Faktiki: Uğurla parse edilir və uzunluğu 26 olan massiv yaradılır. ### Təsir Yaddaşın tükənməsi vasitəsilə Xidmətdən İmtina (DoS).
Necə düzəltmək olar
- qs_project qs6.14.2 və ya daha yeni versiya
- qs6.14.2 və ya daha yeni versiya
Təsirlənən məhsullar
| Məhsul | Təsirlənən versiyalar | Düzəldildiyi versiya |
|---|---|---|
| qs_project qs | 6.7.0 ≤ v < 6.14.2 | 6.14.2 |
| qsnpm | 6.7.0 ≤ v < 6.14.2 | 6.14.2 |
Versiyanızı yoxlayın
Məhsulu seçin və istifadə etdiyiniz versiyanı yazın; versiyanın təsirlənən aralıqda olub-olmadığını görün.
Attack Surface Management
Domenlərinizə bağlı aktivləri, onlarda işləyən texnologiyaları və məlum zəiflikləri bir siyahıda görün.