CVE-2026-82562
Açıklama
### Özet `qs.parse` fonksiyonu `comma: true` ve `throwOnLimitExceeded: true` seçenekleriyle çağrıldığında, köşeli parantezli bir anahtar altındaki virgülle ayrılmış değer (`a[]=1,2,3,4`), `arrayLimit` ile karşılaştırılmadan bir diziye bölünür; oysa aynı değer düz bir anahtar (`a=1,2,3,4`), indeksli bir anahtar (`a[0]=`), iç içe geçmiş bir anahtar (`a[b]=`) veya noktalı bir anahtar (`allowDots` ile `a.b=`) altında olduğunda dokümantasyonda belirtilen `RangeError` hatasını fırlatır. Bu nedenle, çağıran taraf katı limiti etkinleştirmiş olsa bile, `a[]=1,2,2,...` gibi tek bir parametre rastgele uzunlukta bir iç dizi oluşturur. Bu durum, CVE-2026-2391 (qs 6.14.2) düzeltmesinin kapsamadığı `[]=` anahtar biçimidir. ### Detaylar `lib/parse.js` dosyasında, `[]=` anahtarı altındaki virgülle ayrılmış bir değer bölünür ve ardından tek bir iç içe öğe olarak sarmalanır (`val = [val]`, böylece her `a[]=x,y` grubu dış dizinin bir öğesi olarak sayılır). 6.14.2 sürümüyle virgül değerleri için eklenen `arrayLimit` kontrolü bu sarmalamadan sonra çalıştığından, `[]=` kısımları için yalnızca uzunluğu 1 olan sarmalayıcıyı görür. 6.15.3 sürümü, aşırı boyutlu bir değer tahsis edilmeden önce hata fırlatması için bölme öncesi virgül sayımı eklemiştir; ancak bunu, `parseValues` tarafından `[]=` içeren herhangi bir kısım için `false` olarak ayarlanan bir `isFlatArrayValue` bayrağına bağlamış ve nesne değerli girdiler için bunu iletmemiştir, bu nedenle boşluk devam etmiştir. #### PoC ```js var qs = require('qs'); var options = { comma: true, arrayLimit: 3, throwOnLimitExceeded: true }; qs.parse('a=1,2,3,4', options); // RangeError: Array limit exceeded. Only 3 elements allowed in an array. qs.parse('a[]=1,2,3,4', options); // { a: [ [ '1', '2', '3', '4' ] ] } (hata fırlatmaz) qs.parse('a[]=' + '1,'.repeat(1000000) + '1', { comma: true, arrayLimit: 20, throwOnLimitExceeded: true }); // hata fırlatmaz; 1.000.001 öğeli bir iç dizi tahsis edilir ``` #### Düzeltme `main` dalında 8859c37 ile uygulanan ve v6.16.0 olarak yayınlanan `lib/parse.js`: `isFlatArrayValue` denetimi kaldırılmıştır, böylece her virgülle ayrılan değer, anahtar biçimine bakılmaksızın bölünmeden önce `arrayLimit` üzerinden sayılır. `a[]=` altındaki limit içi bir grup hala dış dizinin bir öğesi olarak sayılır ve varsayılan (`throwOnLimitExceeded: false`) yol değişmeden kalmıştır. ### Etkilenen sürümler `>=6.14.2 <6.16.0`, v6.16.0 sürümünde düzeltildi. v6.14.2, virgül değerleri için `arrayLimit` zorunluluğunu getirmiştir (CVE-2026-2391 düzeltmesi), ancak bu yalnızca `[]=` anahtarı altında olmayan değerler için geçerlidir ve v6.14.2'den v6.15.3'e kadar olan tüm sürümler aynı boşluğa sahiptir. `throwOnLimitExceeded` seçeneğinin mevcut olduğu ancak hiçbir virgül biçimine uygulanmadığı v6.14.0 ve v6.14.1 sürümleri, bu kayıt yerine CVE-2026-2391 kapsamındadır. Daha eski serilerde (6.7.x ile 6.13.x arası) `comma` vardır ancak `throwOnLimitExceeded` yoktur, dolayısıyla atlatılacak herhangi bir katı virgül yolu sınırı bulunmamaktadır; 6.7.0 öncesi sürümlerde ise `comma` seçeneği yoktur. ### Etki Güvenilmeyen sorgu dizilerini (query strings) veya urlencoded gövdeleri hem `comma: true` hem de `throwOnLimitExceeded: true` (her ikisi de varsayılan değildir) şeklinde ayrıştıran bir uygulamaya erişebilen kimliği doğrulanmamış bir saldırgan, tek bir `a[]=` parametresi ile yapılandırılmış limiti atlayabilir ve ayrıştırıcıyı istek boyutuyla orantılı bir dizi tahsis etmeye zorlayabilir. Maliyet, saldırgan tarafından sağlanan baytlarda kesinlikle lineerdir (girdi baytı başına yaklaşık 0,1 mikrosaniye ve 6 ila 7 tutulan bayt; dokümante edilen varsayılan `throwOnLimitExceeded: false` yoluyla aynı bellek yetersizliği eşiğidir), bu nedenle taşıma katmanı isteği veya gövde boyutu sınırı bunu tamamen sınırlandırır (ve Node'un varsayılan maksimum 16 KB HTTP başlık boyutu zaten istek satırını sınırlandırdığından, çok megabaytlık yükler için bir gövde ayrıştırıcısı gerekir). Etki, küçük bir girdiden sınırsız tahsis yapılması değil, isteğe bağlı bir katı limitin belirli bir anahtar yazımı üzerinde başarısız olmasıdır.
Nasıl düzeltilir
- qs6.16.0 ya da sonraki bir sürüm
Etkilenen ürünler
| Ürün | Etkilenen sürümler | Düzeltildiği sürüm |
|---|---|---|
| qsnpm | 6.14.2 ≤ v < 6.16.0 | 6.16.0 |
Sürümünüzü kontrol edin
Ürünü seçin ve kullandığınız sürümü yazın; sürümün etkilenen aralıkta olup olmadığını görün.
Attack Surface Management
Alan adlarınıza bağlı varlıkları, bu varlıklarda çalışan teknolojileri ve bilinen zafiyetleri tek listede görün.