CVE-2026-110816
Açıklama
### Özet `qs.stringify` fonksiyonunda `arrayFormat: 'comma'` kullanıldığında, bir dizi öğesi dizeye dönüştürülemediğinde (örneğin çağrılabilir olmayan kendi `toString` metoduna sahip bir nesne `{ "toString": "x" }` veya null-prototipli bir nesne gibi) `TypeError: Cannot convert object to primitive value` hatası fırlatılır. Virgül formatı, dizi öğelerini `Array.prototype.join` ile birleştirir ve `encodeValuesOnly` etkin olduğunda önce her öğeyi `utils.encode` içindeki `String()` işleminden geçirir; ancak her iki yöntem de dize zorlamasının başarısız olduğu öğelere karşı koruma sağlamaz. ### Detaylar `lib/stringify.js` dosyasında virgül dalı, diziyi `obj.join(',')` ile daraltır. Kendi `toString` metodu çağrılabilir olmayan bir öğe için `ToPrimitive` işlemi bunu atlar, `Object.prototype.valueOf` aşamasına geçer (bu da nesnenin kendisini döndürür) ve hata fırlatır. `encodeValuesOnly: true` durumunda aynı öğe önce `lib/utils.js` içindeki `utils.encode` kısmında `String(str)` işlemine ulaşır ve orada hata fırlatır. İç içe geçmiş diziler (`{ "a": [[{ "toString": "x" }]] }`), `Array.prototype.toString` üzerinden aynı şekilde hata fırlatır. `indices`, `brackets` ve `repeat` formatları ise nesne öğelerini zorlamak yerine içlerine girdiği için bu durumdan etkilenmezler. Bu tür öğeler güvenilmeyen girdilerden gelebilir. `JSON.parse`, herhangi bir qs seçeneği olmaksızın `{ "a": [{ "toString": "x" }] }` üretir. `qs.parse("a[0][toString]=x", { allowPrototypes: true })` ifadesi `toString` anahtarını korur ve `qs.parse("a[][b]=c", { plainObjects: true })` ifadesi null-prototipli bir öğe üretir; varsayılan ayrıştırma seçenekleri `toString` değerini düşürür ve hata fırlatmayan sıradan nesneler üretir. Express 4'ün varsayılan `query parser`'ı, Express 5'in `extended` sorgu ayrıştırıcısı ve body-parser'ın `urlencoded({ extended: true })` yapılandırması, `qs.parse` fonksiyonunu `allowPrototypes: true` ile çağırır. #### PoC ```js var qs = require("qs"); qs.stringify(JSON.parse("{\"a\":[{\"toString\":\"x\"}]}"), { arrayFormat: "comma" }); qs.stringify(qs.parse("a[0][toString]=x", { allowPrototypes: true }), { arrayFormat: "comma" }); qs.stringify(qs.parse("a[][b]=c", { plainObjects: true }), { arrayFormat: "comma", encodeValuesOnly: true }); // TypeError: Cannot convert object to primitive value ``` #### Çözüm `main` dalındaki a952e75 sürümünde uygulandı ve v6.16.1 olarak yayınlandı: Dize zorlaması başarısız olacak bir öğe, varsa primitif `valueOf` değerine, aksi takdirde `Object.prototype.toString` değerine zorlanır; böylece virgül formatı altında diğer tüm nesne öğeleri gibi `[object Object]` şeklinde işlenir. İç içe geçmiş diziler, `join` işleminin yaptığı şekilde taranır. Daha önce hata fırlatmayan her girdi eskisiyle aynı şekilde serileştirilir ve kendisi hata fırlatan bir `toString` veya `valueOf` hala yayılmaya devam eder. ### Etkilenen sürümler `>=6.7.0 <6.16.1`, v6.16.1 sürümünde düzeltildi. `join` yolu, virgül formatıyla birlikte b84acba sürümünde tanıtılmış ve ilk kez v6.7.0 sürümünde sunulmuştur; v6.6.x ve önceki sürümler `arrayFormat: 'comma'` seçeneğini görmezden gelir ve etkilenmezler. `encodeValuesOnly` altındaki `String()` noktası 4c4b23d (v6.11.1) sürümünde tanıtılmıştır; bundan önce aynı girdi `join` sırasında hata fırlatırdı. v6.7.0'dan v6.16.0'a kadar olan tüm sürümler etkilenmektedir. ### Etki Kimliği doğrulanmamış bir istek, saldırgan tarafından etkilenen verileri `qs.stringify` ve `arrayFormat: 'comma'` kullanarak yeniden serileştiren herhangi bir kod yolunun (örneğin, bir yönlendirme veya üst akış isteği için `req.query` üzerinden bir sorgu dizesini yeniden oluşturmak veya ayrıştırılmış bir JSON gövdesini serileştirmek) senkron olarak hata fırlatmasına neden olabilir. Tipik bir Node.js HTTP çerçevesinde, fırlatılan hata çerçeve hata sınırı tarafından yakalanır ve etkilenen istek 500 yanıtı döner; süreç hayatta kalır ve diğer istekler etkilenmez. Çağrının, `async` bir Express 4 işleyicisi (hatanın yönetilmeyen bir promise reddine dönüştüğü yer) veya yalın bir `http` istek işleyicisi gibi bir hata sınırının dışında çalıştığı durumlarda süreç sonlanır; dolayısıyla bu durumda etki, qs kütüphanesinden ziyade uygulama hata yönetimine bağlıdır. Varsayılan `arrayFormat` (`indices`) etkilenmemektedir.
Nasıl düzeltilir
- qs6.16.1 ya da sonraki bir sürüm
Etkilenen ürünler
| Ürün | Etkilenen sürümler | Düzeltildiği sürüm |
|---|---|---|
| qsnpm | 6.7.0 ≤ v < 6.16.1, 6.7.0 ≤ v ≤ 6.16.0 | 6.16.1 |
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.