· kaynak dev.to (home feed)
CVE-2026-109869: uzak sunucular, yetim kalan undici stream üzerinden Node.js fetch'i çökertebiliyor
Node.js'un varsayılan fetch istemcisi undici'deki CVSS 7.5 özellikli bir açık, bağlantı kurulan herhangi bir sunucunun beşten fazla Content-Encoding başlığı ve erken bağlantı kesme ile süreci çökertmesine izin veriyor; 6.29.1, 7.30.1 ve 8.12.2 sürümlerinde düzeltildi.

undici'nin fetch'inde yüksek şiddetli DoS açığı
dev.to'da yayınlanan bir CVE raporuna göre, CVE-2026-109869 (GHSA-xjj6-f33q-929c) olarak takip edilen bir hizmet dışı bırakma (DoS) açığı, bir Node.js uygulamasının bağlandığı herhangi bir HTTP sunucusunun tüm süreci sonlandırmasına olanak tanıyor. Açık, Node.js'un varsayılan fetch() işlevini oluşturan HTTP/1.1 istemcisi ve Fetch uygulaması olan undici'de bulunuyor. Rapor, açığa CVSS v3.1 puanı olarak 7.5 (Yüksek) veriyor; saldırı vektörü ağ üzerinden, ayrıcalık veya kullanıcı etkileşimi gerektirmiyor ve etkisi yalnızca erişilebilirlikle sınırlı. Temel zayıflık CWE-248 (yakalanmayan istisna) ve CWE-459 (eksik temizlik) kapsamında sınıflandırılıyor. Bir kavram kanıtı mevcut, ancak rapor EPSS puanının yüzde 0,343 gibi düşük olduğunu ve açığın CISA'nın Bilinen İstismar Edilen Açıklar kataloğunda listelenmediğini belirtiyor.
Çökme nasıl gerçekleşiyor
Tetikleyici, beşten fazla Content-Encoding direktifi içeren ve gövdeyi iletmeden önce bağlantıyı kapatan bir sunucunun gönderdiği yanıttır. Etkilenen sürümlerde undici, içerik kodlaması sayısını doğrulamadan önce yanıt gövdesi için dahili Readable stream'i oluşturuyor. Sonraki aşamada kontrol başarısız olduğunda undici fetch promise'ını reddediyor, ancak önceden ayrılmış olan stream yetim kalıyor; ne bir hata dinleyicisi ne de bir abort sinyali bağlı. Soket tam o anda kapanırsa, ortaya çıkan hata uygulamanın hiçbir zaman referansı olmadığı bir stream üzerinde yayınlanıyor. Dinleyen olmadığından Node.js bunu yakalanmayan bir istisna olarak değerlendirip çıkıyor.
Rapor, bunun normal hata işlemeyi atlatığını vurguluyor: fetch çağrısını try/catch içine almak ya da promise'a bir catch işleyicisi zincirlemek reddetme yolunu kapsar ama yetim kalan stream'i kapsamaz. Beş kodlama sınırının kendisi, diğer HTTP yığınlarındaki önceki sertleştirmeleri yansıtıyor; düzeltme, urllib3 (GHSA-gm62-xv2j-4w53) ve curl'deki (CVE-2022-32206) benzer limitlerle karşılaştırılıyor.
Düzeltme ve etkilenen sürümler
v8.x/main dalındaki yama (commit b5084c7) iki değişiklik yapıyor: Readable stream artık content-encoding limiti uygulanana kadar oluşturulmuyor ve hata yolu düz bir reject() yerine controller.abort() çağırıyor; böylece istek, canlı bir stream sızdırmak yerine düzgün şekilde kapatılıyor. Yedeklemeler v7 dalına (commit 07ded49) ve v6 dalına (commit 1325a87) uygulandı.
dev.to raporuna göre etkilenen aralıklar ve düzeltmeleri şöyle:
- undici 6.23.0'dan 6.29.1'in altındaki sürümlere kadar, 6.29.1'de düzeltildi
- undici 7.18.0'dan 7.30.1'in altındaki sürümlere kadar, 7.30.1'de düzeltildi
- undici 8.0.0'dan 8.12.2'nin altındaki sürümlere kadar, 8.12.2'de düzeltildi
Kontrol edilmesi ve yapılması gerekenler
Rapor, tüm doğrudan ve geçindirilmiş (transitive) kopyaları ortaya çıkarmak için npm ls undici ya da yarn/pnpm eşdeğerini çalıştırmayı, ardından paket manifestolarını ve lockfile'ları eşleşen ana sürümdeki yamalı bir yayına güncellemeyi öneriyor. İncelik runtime'da: Node.js, global fetch()'i çalıştırmak için kendi undici sürümünü paketliyor, dolayısıyla temiz bir bağımlılık ağacı yerleşik istemcinin yamalı olduğunu garanti etmiyor. Operatörler, runtime'ın taşıdığı sürümü görmek için process.versions.undici'yi kontrol edebilir, ardından Node.js'u güncelleyebilir ya da global fetch'i açıkça yamalanmış bir undici paketiyle geçersiz kılabilir.
Hemen yükseltme yapamayan ortamlar için ara hafifletmeler olarak rapor, çıkış (egress) kontrolleriyle giden HTTP isteklerini izin verilen alan adlarıyla sınırlamayı ve aşırı sayıda Content-Encoding başlığı taşıyan yanıtları engelleyen bir forward proxy üzerinden yanıtları normalize etmeyi öneriyor. Yama sonrasında, regresyon testleri beşten fazla kodlamalı yanıtların erken soket kapanışında çökeltmek yerine düzgün şekilde reddedildiğini doğrulamalı.
Neden önemli
Bu hata, her giden fetch çağrısını potansiyel bir çökme vektörüne dönüştürüyor. Bağlantı önizlemeleri, webhook tüketicileri, scraper'lar ve üçüncü taraf API entegrasyonları gibi başkaları tarafından seçilen veya etkilenen URL'leri isteyen hizmetler, tek bir düşmanca veya ele geçirilmiş upstream tarafından devre dışı bırakılabilir ve sürecin tamamen çıkması, o anda devam eden tüm eşzamanlı istekleri de beraberinde götürür. Ayrıca, istisnanın geliştiricinin kontrolündeki promise sınırını hiçbir zaman aşmaması nedeniyle sıradan savunmacı kodlamanın erişemeyeceği bir hata sınıfını gösteriyor. Ve Node'un yerleşik fetch'i bağımlılık ağacından bağımsız olarak etkilendiğinden, iyileştirme package.json'un ötesine bakıp runtime'ın kendisini incelemek anlamına geliyor. Düzeltme küçük ve üç yayım hattında mevcut, dolayısıyla pratik yol basit: undici'yi her yerde, Node'un içinde dahil, envanterleyin ve yükseltin.
- #node-js
- #security
- #undici
- #fetch
- #denial-of-service
- #vulnerability
İlgili yazılar
- Yeni açıklanan CVE-2026-109461, MSAL Node loopback kurulumlarında token sızıntısına dikkat çekiyor
- MLflow'un webhook endpoint'indeki kimlik doğrulaması eksik SSRF, model registry'lerin arkasındaki iç ağları açığa çıkarıyor
- OpenAI'nin Codex'i Node.js'te Brotli RCE buldu; Imperva resmi build üzerinde gösterdi