Hızlı cevap: CVE-2026-111497, Node.js runtime içindeki Brotli kod çözücüde bulunan yüksek önem dereceli bir sınır dışı yazma (out of bounds write) açığıdır ve uzaktan kod çalıştırmaya (RCE) yol açabilir. Hazırlanmış bir Brotli sıkıştırılmış girdi, çözücünün ayırdığı tamponun dışına bayt yazmasına neden olabilir, bellek bozulması da koşullara bağlı olarak kod çalıştırmaya dönüşebilir. Açık çalışma zamanının kendisinde olduğu için yapılandırma ile kapatılamaz, tek kalıcı çözüm yamalı sürüme yükseltmektir: v22.23.4, v24.22.1 veya v26.12.1. Sürüm sonu (EOL) hatlar da etkilenir ama yama almaz.

Node.js ekibi 21 Ekim 2026 tarihli güvenlik sürümünde Brotli kod çözücüsündeki bu açığı yüksek öncelikli olarak işaretledi. Aynı sürümde toplam on düzeltme yer aldı, ancak CVE-2026-111497 saldırı yüzeyi geniş olduğu için ayrı bir ilgiyi hak ediyor. Sebebi basit: Brotli sıkıştırması modern web yığınında her yerde, çoğu zaman geliştiricinin farkında bile olmadığı yollardan devreye giriyor. Bu yazıda açığın ne olduğunu, bellek bozulmasının neden RCE anlamına gelebileceğini, güvenilmeyen Brotli verisinin bir uygulamaya hangi kapılardan ulaştığını ve ne yapmanız gerektiğini anlatıyoruz.

Sınır dışı yazma nedir ve neden bu kadar tehlikeli

Sınır dışı yazma, bir programın ayırdığı bellek bloğunun sınırlarının dışına veri yazmasıdır. Bir kod çözücü, gelen sıkıştırılmış veriyi açarken çıktının ne kadar yer tutacağını hesaplar ve buna göre bir tampon ayırır. Eğer hesaplama saldırgan kontrolündeki bir girdiyle şaşırtılabiliyorsa, çözücü ayırdığı alandan daha fazlasını yazmaya çalışır ve komşu bellek bölgelerinin üzerine geçer. MITRE bu zayıflığı CWE-787 (out of bounds write) olarak sınıflandırır ve bellek güvenliği hatalarının en tehlikeli ailesinden biri sayar.

Tehlike, yazılan baytların nereye düştüğüyle ilgili. Komşu bellekte bir işlev işaretçisi, bir uzunluk alanı ya da yığın üzerinde bir dönüş adresi varsa, saldırgan bunların üzerine kontrollü değerler yazarak programın akışını kendi lehine değiştirmeye çalışabilir. İşte bu noktada bir bellek bozulması hatası, uzaktan kod çalıştırma potansiyeline evrilir. Benzer sınıftaki bellek güvenliği sorunlarıyla komut düzeyindeki enjeksiyonların nasıl ayrıştığını komut enjeksiyonu nedir ve korunma yolları yazımızda ele almıştık.

Dürüst olmak gerekir: advisory bu açık için kesin bir istismar zinciri ya da kamuya açık bir kanıt (PoC) yayımlamadı. RCE burada bir potansiyeldir, kesinlik değil. Gerçek dünyada kod çalıştırmaya ulaşmak derleyici korumalarına, bellek düzenine ve girdinin tetiklediği tam yola bağlıdır. Yine de yüksek önem derecesi ve geniş saldırı yüzeyi, bu açığı tahmin oyununa bırakılmayacak kadar ciddi kılar.

Brotli Node uygulamalarında nerede devreye girer

Brotli, HTTP için tasarlanmış modern bir sıkıştırma algoritmasıdır ve Node.js içinde zlib modülü üzerinden yerleşik olarak gelir. Çoğu geliştirici onu doğrudan çağırdığını düşünmez, oysa birçok dolaylı yol çözücüyü otomatik tetikler. Önemli olan şu: bu açığı sömürmek için saldırganın yapması gereken tek şey, uygulamanın bir noktada açacağı hazırlanmış bir Brotli akışı ulaştırmaktır.

Aşağıdaki tablo, güvenilmeyen Brotli girdisinin tipik bir Node uygulamasıyla nerede karşılaştığını özetliyor.

Saldırı yüzeyi Brotli nasıl devreye girer Girdiyi kim kontrol eder
Giden fetch ve undici istekleri Uzak sunucu yanıt başlığında br kodlaması belirtir, Node yanıtı otomatik açar Bağlanılan uzak sunucu veya araya giren saldırgan
İstemciden gelen sıkıştırılmış istek gövdesi Uygulama istek gövdesini içerik kodlamasına göre açıyorsa İstek gönderen her istemci
Dosya veya belge yükleme Yüklenen içerik Brotli ile paketlenip sunucuda açılıyorsa Yükleme yapan kullanıcı
Proxy, ara katman veya mikroservis trafiği İç serviste gelen sıkıştırılmış yanıt açılıyorsa Zincirdeki güvenilmeyen herhangi bir uç

En sık gözden kaçan senaryo giden isteklerdir. Uygulamanız bir dış API ile konuşurken fetch veya undici kullanıyor ve karşı taraf yanıtı br ile sıkıştırıyorsa, Node o yanıtı siz hiçbir şey yapmadan açar. Karşı taraf ele geçirilmiş ya da kötü niyetliyse, hazırlanmış yanıt doğrudan savunmasız çözücüye akar. Aynı durum araya girme (man in the middle) konumundaki bir saldırgan için de geçerlidir. Yani risk yalnızca dışarıya açık servislerle sınırlı değil, dışarıya istek yapan her Node süreci de hedeftir.

Saldırgan güvenilmeyen Brotli girdisini nasıl ulaştırır

Saldırının mantığı doğrudan: savunmasız kod çözücüye kendi hazırladığı baytları geçirmek. Dışarıya açık bir uç nokta sıkıştırılmış istek gövdesi kabul ediyorsa, saldırgan gövdeyi kendisi hazırlar ve içerik kodlamasını br olarak bildirir. Uygulamanız dış kaynaklardan içerik çekiyorsa, saldırgan ele geçirdiği bir sunucudan ya da ağ konumundan yanıtı manipüle eder. Yükleme kabul eden bir akışta, dosya Brotli ile paketlenmiş gelir ve sunucu tarafında açılırken açık tetiklenir.

Bu çeşitlilik, açığı yalnızca bir yapılandırma anahtarıyla savuşturmayı imkansız kılar. Tetikleyici veri uygulamanın normal çalışma yolundan geçer, egzotik bir eklenti ya da nadir bir modül gerektirmez. Bir güvenlik testinin bu tür yolları spekülasyonla değil, gerçek bir kanıtla göstermesi gerektiğini yanlış pozitifsiz doğrulanmış zafiyet testi yazımızda tartışmıştık, çünkü sürüm eşleşmesi tek başına her zaman sömürülebilirlik anlamına gelmez.

Etki ve ne yapmalı

Etkilenen hatlar ve yamalı sürümler aşağıdaki tabloda. Bu açık 26.x, 24.x ve 22.x dallarının yanı sıra artık desteklenmeyen eski hatları da ilgilendirir.

Node.js hattı Durum Yamalı sürüm
26.x (Current) Etkilenir v26.12.1
24.x (LTS Krypton) Etkilenir v24.22.1
22.x (LTS Jod) Etkilenir v22.23.4
20.x, 18.x ve öncesi (EOL) Etkilenir Yama yok, göç şart

Yapılması gereken net: sürümünüzü kontrol edin ve yükseltin. node -v komutunu çalıştırın, çıkan sürüm yamalı sürümden eskiyse hemen güncelleyin. Konteyner kullanıyorsanız güncel temel imajla yeniden derleyin, çünkü bir takım güncellemesi çalışan üretim imajını değiştirmez. Açık çalışma zamanında yaşadığı için bir ortam değişkeni ya da ayar ile kapatılamaz, Brotli kullanımını tamamen devre dışı bıraksanız bile giden isteklerdeki otomatik açma davranışını kontrol etmek güvenilir bir savunma değildir.

Hâlâ sürüm sonu bir Node.js hattındaysanız durum daha ağırdır: açıktan etkilenirsiniz ama resmi yama hiç gelmez. Bu durum neden EOL runtime kullanmanın başlı başına bir risk olduğunu gösterir, konuyu EOL runtime riski ve sürüm sonu göçü yazımızda derinlemesine ele aldık. Bu sürümdeki diğer dokuz düzeltmenin tam listesi ve öncelik sırası için Node.js Ekim 2026 güvenlik güncellemesi yama rehberine göz atabilirsiniz. Aynı gün yayımlanan ve PHP çekirdeğini vuran kardeş kritik RCE için PHP2Shell CVE-2026-109618 ve 109619 analizimiz bulunuyor. Bu tür sürümleri sistematik ele almak isteyen ekipler için yama yönetimi ve güncelleme rehberimiz bir çerçeve sunar.

KAOS ve DSET yaklaşımı

DSET bu tür açıkları tararken, önce varlık envanterindeki her Node.js sürecinin çalışma zamanı sürümünü tespit eder. DSET'in yerel yapay zekâ motoru KAOS, tespit edilen sürümü bilinen CVE veri tabanıyla eşler, ardından CISA KEV gibi istismar edilen açık listeleriyle çakıştırarak önceliklendirir. CVE-2026-111497 gibi bir bulguda KAOS, yalnızca sürüm numarasının eşleştiğini söylemez, aynı zamanda uygulamanın gerçekten Brotli açma yoluna girip girmediğine, yani giden fetch kullanımına, sıkıştırılmış istek kabulüne veya yükleme akışlarına bakarak saldırı yüzeyini daraltır.

Burada dürüstlük bizim için pazarlamadan önce gelir. Bir sürüm eşleşmesi hipotezdir, kesin teyit değildir. Backport yapılmış olabilir, mitigasyon devrede olabilir ya da tetikleyici yol uygulamada hiç bulunmuyor olabilir. KAOS'un over claim freni, kanıtla gösterilemeyen bir sömürüyü "doğrulandı" diye raporlamaz, bunun yerine bulguyu "etkilenebilir, aktif doğrulama gerekir" seviyesinde tutar. Kesin teyit, kontrollü ve yetkili bir ortamda yapılan aktif doğrulamayı gerektirir. Bu yaklaşım, yanlış pozitiflerle ekibinizin vaktini çalmadan gerçek riske odaklanmanızı sağlar.

Sık sorulan sorular

Brotli kullanmadığımı düşünüyorum, yine de etkilenir miyim? Büyük olasılıkla fark etmeden kullanıyorsunuz. Node.js ile gönderilen fetch ve undici istemcileri, uzak sunucular br kodlamasıyla yanıt verdiğinde içeriği otomatik açar. Bir dış API ile konuşan, web kazıyan ya da webhook alan herhangi bir süreç potansiyel olarak savunmasız çözücüden geçer. Bu yüzden Brotli'yi aktif olarak çağırmıyor olmanız sizi güvende tutmaz, belirleyici olan uygulamanızın güvenilmeyen bir Brotli akışıyla hiç karşılaşıp karşılaşmadığıdır.

Yama yerine bir yapılandırma ile açığı kapatabilir miyim? Hayır, güvenilir bir şekilde kapatamazsınız. Açık, runtime içindeki kod çözücünün kendisinde yaşar, bir uygulama ayarı veya ortam değişkeni değildir. Brotli kullanımını kodunuzda azaltmak saldırı yüzeyini daraltabilir ama giden isteklerdeki otomatik açma gibi dolaylı yolları tam kapatmaz. Tek kalıcı ve güvenilir çözüm, yamalı Node.js sürümüne yükseltmektir.

Advisory kesin bir sömürü gösterdi mi, bu açık aktif olarak istismar ediliyor mu? Advisory açığı yüksek önem dereceli bir sınır dışı yazma olarak tanımladı ve RCE potansiyelini belirtti, ancak kesin istismar koşullarını veya kamuya açık bir kanıtı paylaşmadı. Yayın anında yaygın aktif sömürüye dair resmi bir teyit sınırlıdır. Buna rağmen yüksek önem derecesi, geniş saldırı yüzeyi ve bellek bozulması açıklarının zaman içinde silahlandırılma eğilimi, acil yamayı haklı kılar. Riski bir saldırganın PoC yayımlamasını beklemeden kapatmak en doğrusudur.

Kaynaklar

Node.js altyapınızdaki bu açığı doğrulamak, önceliklendirmek ve güvenli bir yükseltme planı çıkarmak için DSET ile iletişime geçin. Ekibimiz Ankara Hacettepe Teknokent'te konumlanıyor ve kurumsal ekiplere kanıt temelli zafiyet doğrulama ve yama yönetimi desteği sunuyor.