Imperva'daki güvenlik araştırmacıları, kötü niyetli Brotli verisinin resmi bir Node.js derlemesindeki bir uygulamanın saldırgan tarafından sağlanan kodu çalıştırabileceğini gösterdi.
Node2Shell adlı kanıt kavramı, hata ayıklayıcı veya özel derleme olmadan Linux arm64 için resmi Node.js 24.22.0 görüntüsünde, paketlenmiş Brotli kod çözücüsüne CVE-2026-111497 hazırlanmış veri besleyerek kod çalıştırdı. Node.js açığı 21 Ekim'de açıkladı ve düzeltmeleri yayınladı; güvenilmeyen Brotli verisini kod çözen uygulamaların güncellenmesi gerekiyor.
Imperva'nın testi her denemede başarılı olmadı ve Linux arm64 kurulumunda kod çalıştırma birkaç denemede gerçekleşti. Sonuç yalnızca test edilen tek derleme ve uygulama kurulumunu kapsıyor; diğer mimariler ve 22.x ile 26.x sürümleri test edilmedi. Düzeltilmiş sürüm 24.22.1'de aynı veri reddedildi ve hiçbir kod çalışmadı.
Gösterim, kod çalıştırmanın yalnızca kasıtlı olarak zayıflatılmış bir test derlemesinde sağlandığı ilk kamuya açık kanıt kavramının ötesine geçiyor. Standart bir derlemede, söz konusu kanıt kavramının yazarı çökme ve işlem belleğinin sınırlı okunması bildirdi, kod çalıştırma bildirmedi ve normal bir derlemede çalışan bir saldırının gerçekleştirilmediğini söyledi.
22 Ekim itibarıyla açığın gerçek dünyada istismar edildiğine dair bir bildirim yok.
Hangi Uygulamalar Etkileniyor
Açık, Node.js'in paketlediği Brotli kod çözücüsünde bulunuyor; bu nedenle yalnızca Imperva'nın test ettiği derleme değil, 22.x, 24.x ve 26.x sürümlerindeki uygulamaları etkiliyor. Bir servis bu kod çözücüye HTTP alışverişinin her iki tarafından da ulaşır: Node.js'in yerleşik fetch() aracılığıyla Brotli ile sıkıştırılmış bir yanıt okuduğunda ya da ara yazılım Brotli ile sıkıştırılmış bir istek gövdesini kod çözdüğünde.
Express 5'in gövde ayrıştırıcıları, express.json(), express.urlencoded(), express.text() ve express.raw() gibi, bir yola uygulandığında gzip ve deflate'in yanı sıra Brotli istek gövdelerini de kod çözer. Düz bir Node.js HTTP sunucusu, bir Brotli istek gövdesi aldığında onu otomatik olarak kod çözmez; kod çözme için bu ara yazılımın ya da açık bir çağrının bulunması gerekir.
Imperva, istek gövdesi ve yanıt yollarının her ikisi üzerinden de kod çalıştırma yeniden üretti; Express 5.0.0'dan 5.3.0'a ve body-parser 2.0.0'dan 2.3.0'a kadar sabit sürümleri test etti, aradaki her sürümü test etmedi.
Açık Nasıl Çalışıyor
Imperva nedeni, kod çözücünün Brotli akışındaki imkansız bir noktayı nasıl ele aldığına bağladı: akış, kod çözme ilerlerken kullanacağı blok türlerini duyurur ve test girdisi, akışın kendi yapısının dışladığı bir blok değişimine ulaştı. Açıklı kod çözücü bunu daha fazla girdi talebi olarak okudu ve geçersiz bir durumda ilerlemeye devam etti.

Bellek sanitizörüyle yapılan ayrı bir testte, o durumdan devam etmek amaçlanan tamponun dışına yazdı; bu, açığın arkasındaki sınır dışı yazma.
Node.js, açığı, kod çözücünün o noktada devam etmek yerine biçim hatasıyla durmasını sağlayan yukarı akıştaki bir Brotli yamasını içe aktararak düzeltti.
Ne Yapılmalı
Düzeltme, yamalı bir sürüme geçmekten geçiyor. Güncelleme, paket envanterinin kaçırabileceği Node ikili dosyasını paketleyen konteyner görüntüleri ve diğer eserlere ulaşmalı. Yaşam döngüsü sona ermiş 20.x ve önceki sürümler düzeltme almıyor ve desteklenen bir sürüme taşınmalı.
Uyarı, Node.js içinde bir geçici çözüm listelemiyor; bu nedenle bir kerede güncelleyemeyen bir uygulama çalışma zamanında bir yedek bulamıyor. Imperva, mümkün olduğunda etkilenen yollardaki güvenilmeyen Brotli trafiğini sınırlamayı önerdi ve yalnızca güncellemenin açığı kaldırdığını söyledi. Şirket ayrıca kendi web uygulama güvenlik duvarına kurallar ekledi ve bunları yeniden ürettiği saldırılar karşısında test etti.
Müşterileri için Node.js çalıştıran Vercel, 21 Ekim'de gelen isteklerde saldırıyı engelleyen kurallar eklediğini söyledi. Kurallar, bir uygulamanın diğer sunuculardan aldığı Brotli yanıtlarını kapsamıyor ve güncellemenin yerini tutmuyor.