Son güncelleme: 26 Ekim 2026
Kısa cevap: Node.js 21 Ekim 2026'da 22, 24 ve 26 hatları için güvenlik sürümü çıkardı. CVE kaydında 9 eşiğini aşan madde CVE-2026-111497. Google Brotli kod çözücüsünde sınır aşımı. CVSS 4.0 puanı 9,2. Node.js projesi şiddeti yüksek diyor. Yamalı sürümler 22.23.4, 24.22.1 ve 26.12.1. Açık, her dinleyen porta kendiliğinden işlemez. Süreç, güvenilmeyen Brotli verisini açıyorsa etkilenir.
node -vkabukta yeni, işçi süreçte eski kalabilir.
Aynı gün JDK tarafında da CVSS 9,1 puanlı bir sertifika uyarısı vardı. O konu Java yazısında. PHP kayıtları ayrı yazıda. Puanların neden tek sıra olmadığı yama önceliklendirme notunda. Bu yazı yalnızca Node.js paketini anlatır. JDK'yı güncellemek bu kod çözücüyü değiştirmez.
21 Ekim paketi tek kayıttan ibaret değil
Node.js projesi 21 Ekimde 26.x, 24.x ve 22.x için sürüm yayımladı. Duyurudaki en yüksek şiddet etiketi "high". Paketin içinde bağımlılık güncellemeleri de var: c-ares, eMudhra ara sertifikaları için ca-cert, 24 ve 22 hatlarında OpenSSL, 22 hattında SQLite, üç hatta Undici. CVSS 9 eşiğini CVE kaydında aşan madde Brotli kod çözücüsü. Diğer kayıtlar yüksek, orta ya da düşük. Onlar da aynı ikiliye bağlıdır. Sürümü 22.23.4, 24.22.1 veya 26.12.1 yapmak hepsini birden kapatır. Tek tek yama seçmek bu pakette mümkün değildir.
Destek süresi bitmiş hatlar bu sürümü almaz. Proje, güvenlik paketi çıktığında destek dışı hatların etkilendiğini kabul etmenizi ister. 20, 18 ve daha eskiler "listede 22, 24, 26 yazıyor" diye güvende sayılmaz. Kalıcı yer desteklenen hattır.
CVE-2026-111497 nedir?
CVE-2026-111497, Google Brotli kod çözücüsünde, c/dec/decode.c içindeki bir sınır aşımı. Etkilenen kütüphane sürümleri 1.0.3 ile 1.2.0 arası. Düzeltilmiş kütüphane sürümleri 1.0.10, 1.1.1 ve 1.2.1. Node.js bu kütüphaneyi node:zlib için kendi içine gömer. Sistemdeki brotli paketini güncellemek, Node.js ikilisinin içindeki kopyayı değiştirmez. Nginx, tarayıcı ya da başka bir ürün aynı kütüphaneyi ayrıca taşıyabilir. Bu yazının sürüm tablosu yalnızca Node.js içindir. Başka bir ürünün yaması, o ürünün bülteninden okunur.
CVE kaydı puanı CVSS 4.0 ile 9,2 ve şiddeti kritik. Vektör CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N. Buradaki AT:P, saldırının ek bir koşula bağlı olduğunu söyler. Koşul, uygulamanın saldırganın verdiği sıkıştırılmış veriyi açmasıdır. Singapur Siber Güvenlik Ajansı aynı açık için CVSS 3.1 puanını 9,8 verdi. Red Hat'in bülteni 8,1 diyor ve saldırı karmaşıklığını yüksek tutuyor. Üç sayı da uydurma değildir. Ölçek ve "kötüye kullanım ne kadar hazır koşul istiyor" sorusu farklı cevaplanınca taban puan ayrılır. Node.js'in kendi etiketi yüksek. Karar, sürecin güvenilmeyen Brotli verisi açıp açmadığına bakılarak verilir. Puana bakıp "her Node.js sunucusu düştü" demek de, "proje high dedi, bekleriz" demek de aynı hatadır.
Node.js'in tarifi düzdür. Geçersiz bir blok geçişi, kalıcı biçim hatası yerine "biraz daha veri gerek" diye raporlanır. Akış çözen kod, gelen baytları sekiz baytlık iç tampona eklemeye devam eder ve tamponun sonundan taşar. Bellek bozulmasının sonucu çökme, süreç belleğinin sızması ya da uzaktan kod çalıştırma olabilir. Kimlik doğrulaması, veriyi sürecin açması şartına bağlıdır. Her Node.js portu bu yüzden kendiliğinden hedef değildir. Düzeltme, geçersiz geçişi kalıcı biçim hatası olarak geri vermek ve akışı kesmektir. Çalışma anında kapatılacak bir bayrak duyurulmadı. Yamalı sürüm tek tam kapatmadır.
Veri kod çözücüye nereden girer?
Üç yol var. Üçü de "uygulama Brotli açıyor mu" sorusunun cevabıdır.
Birincisi doğrudan çağrıdır. Kod, node:zlib üzerinden brotliDecompress ya da createBrotliDecompress kullanıyorsa ve girdi kullanıcıdan, kuyruktan ya da dış servisten geliyorsa süreç açıktır. Yedek arşivi, önbellek dosyası ya da mesaj gövdesi de girdi sayılır. Dosya diskte diye güvenli olmaz. Dosyayı kim yazdıysa o, kod çözücünün girdisini de yazmıştır.
İkincisi yerleşik fetch(). Bu API, Brotli ile sıkıştırılmış yanıtı kendisi açar. Uygulamanın çağırdığı sunucu kötü niyetliyse ya da ele geçirildiyse yanıt bu kod çözücüden geçer. Sabit bir adres de bu yola girer. O adresin sertifikası ve içeriği sizin denetiminizde değilse yanıt güvenilmeyen veridir. fetch kullanmayan eski http.request kodu, sıkıştırmayı kendisi açmıyorsa bu ikinci yola girmez. Kütüphane sizin yerinize açıyorsa girer.
Üçüncüsü, Akamai'nin 21 Ekim sonrasında yazdığı nottur. Express 5 ve body-parser 2, inflate seçeneği varsayılan olarak açıkken br kodlu istek gövdesini açar. İstemci, gövdeyi Brotli diye işaretleyebilir. Çerçeve varsayılan ayarı değiştirmemişse kod çözücü, kimliği doğrulanmamış isteği de görür. Express 4'ün aynı varsayılanı taşıyıp taşımadığını çerçevenin kendi sürüm notundan doğrulayın. Bu yazı, Akamai'nin adlandırdığı 5 ve body-parser 2 ile sınırlı durur.
Çıplak node:http sunucusu gelen gövdeyi kendiliğinden Brotli diye çözmez. Çözen katman uygulama ya da çerçevenin içindedir. "Sunucum Node.js" cümlesi yetmez. Açan satır, zlib çağrısı, fetch ya da çerçevenin gövde ayrıştırıcısıdır.
Brotli, HTTP'de Content-Encoding: br olarak da dolaşır. Ters vekil sıkıştırılmış yanıtı uygulamaya iletmeden açıyorsa Node.js süreci o gövdeyi sıkışık görmez. Ters vekil gövdeyi olduğu gibi geçiriyorsa açma işi uygulamada kalır. Bu ayrım, "önümde Nginx var, güvendeyim" cümlesini tek başına doğrulamaz. Vekil yapılandırmasına bakılır.
Hangi sürüm yamalı?
| Hat | Yamalı sürüm | Bu sürümden önceki aynı hat |
|---|---|---|
| 22 | 22.23.4 | Etkileniyor |
| 24 | 24.22.1 | Etkileniyor |
| 26 | 26.12.1 | Etkileniyor |
22.23.4'ten küçük her 22, 24.22.1'den küçük her 24 ve 26.12.1'den küçük her 26 bu kaydı taşır. Tek sayı hatlar ve 20 ile öncesi destek dışıdır. Onlara bu paket gelmez. "20.x bültende yok" ifadesi, 20'nin etkilenmediği anlamına gelmez. Projenin kuralı, destek bitince yamanın da bittiğidir.
Sürüm okumak için:
node -v
Bu komut, o kabuğun gördüğü ilk node dosyasını yazar. Üretim çoğu zaman başka dosyayı çalıştırır.
nvm,fnmve Volta kabukta başka, serviste başka sürüm gösterebilir. Servis etkileşimli bir giriş betiği yüklemez.systemdbirimininExecStartsatırı ile terminaldekinodeaynı dosya olmayabilir. Birim dosyasındaki tam yol esas alınır.- pm2, süreç listesinde eski ikiliyi açık tutar.
pm2 restartyeni sürümü ancak PATH değiştikten ve daemon yenilendikten sonra görür. - Plesk ve benzeri paneller site başına Node.js sürümü tutar. Paneldeki seçim, sizin SSH oturumunuzdaki
node -vile aynı olmak zorunda değildir. - Docker'da
node:22etiketi zamanla ilerler. Çalışan konteynerin içindeki sürüm, imaj yeniden kurulmadan değişmez. Etiket aynı kalsa bile sindirim (digest) değişmiş olabilir. Çalışan konteynerdenode -vbakılır. package.jsoniçindekienginesalanı bir temennidir. Üretimde çalışan sürümü kanıtlamaz.npm installbu alanı çoğu kurulumda zorlamaz.
Güncellemeden sonra süreç yeniden başlatılır. İşçi süreçlerin komut satırından açıldığı dosyaya bakın. Linux'ta ps çıktısındaki tam yol, node -v ile aynı dosyaysa iş tamamdır. Yol farklıysa kabuk güncellenmiş, hizmet güncellenmemiştir.
Aynı 22.23.4, 24.22.1 ve 26.12.1 paketleri ca-cert güncellemesini de taşır. Node.js'in gömülü CA deposu bu sürümle eMudhra ara sertifikalarına karşı yenilenir. JDK deposu ayrı dosyadır. İki güncellemeyi aynı bakım penceresine koymak işi kısaltır. Birini diğerinin yerine saymak envanteri eksik bırakır. Java tarafının derleme numarası bu yazının tablosunda yoktur.
Aynı paketteki diğer kayıtlar
Brotli, puanı en yüksek kayıttır. Aynı ikili şunları da kapatır. Ayrıntı, istismar adımı değildir. Etkinin adıdır.
| Kayıt | Şiddet | Ne işe yarar |
|---|---|---|
| CVE-2026-105482 | Yüksek | dns.resolve ailesi, içine gömülü boş bayt taşıyan adı sessizce kısaltabilir. Daha önceki düzeltme yalnızca dns.lookup ve net tarafını kapatmıştı. |
| CVE-2026-105483 | Yüksek | ASCII olmayan rakamlarla yazılmış bir adres, TLS doğrulamasında IP sanılmayıp isim gibi eşleştirilebilir. 26 ve 24 hatları. |
| CVE-2026-106069 | Yüksek | Başında sıfır olan IPv4 yazımı, bağlanılan adres ile sertifikada aranan adresi ayırabilir. |
| CVE-2026-105481 | Orta | Yeniden kullanılan HTTP soketi, istek gitmeden önce yazılmış bir yanıtı yeni isteğin yanıtı sanabilir. |
| CVE-2026-106072 | Orta | Alışılmış biçimi dışında yazılmış bir IPv4, yalnızca DNS adı taşıyan bir sertifikayla eşleşebilir. |
| CVE-2026-106074 | Orta | Anlık görüntü ve tek dosyalık uygulamada randomUUID ile randomInt önbelleği kopyalanırsa süreçler aynı değerleri tekrarlar. |
| CVE-2026-106070 | Düşük | Bozuk ZIP başlığından sonra ZipFile istenen girdinin yerine dosyanın başındaki baytları döndürebilir. 26 hattı. |
| CVE-2026-106071 | Düşük | İzin modelinde joker kural, kısa bir yolu da açık sayabilir. 26 hattı. |
| CVE-2026-106073 | Düşük | fs.realpathSync okuma iznini atlayabilir. |
Bu tabloyu tek tek yama listesi sanmayın. Hepsi aynı üç sürümün içindedir. Brotli sizi ilgilendirmiyorsa bile DNS ve TLS satırları, dışarı isim çözen bir istemciyi ilgilendirir. Anlık görüntü satırı, --build-snapshot ya da tek dosyalık paket kullanmayan uygulamayı ilgilendirmez. Yine de sürüm ortaktır.
Panelde birden fazla site varsa
Paylaşılan bir Node.js kurulumunda her sitenin sürümü ayrı olabilir. Panel, siteye 18, komşu siteye 22 vermiş olabilir. SSH'de gördüğünüz tek node -v bu listenin tamamını kapatmaz. Her sitenin açılış komutunu ayrı okuyun. Alt alan adı ayrı bir uygulama süreciyle duruyorsa o sürecin yolu da satıra yazılır.
Konteyner tarafında etiket yetmez. node:22 bugün 22.23.4 olabilir, dün 22.20 olabilir. Çalışan imajın sindirimi, kayıt defterindeki güncel sindirimle karşılaştırılır. Aynı etiketle yeniden çekmek, çalışan konteyneri kendiliğinden değiştirmez. Yeni imaj ancak yeni bir çalıştırmada devreye girer. Eski konteyner ayakta kaldığı sürece eski kod çözücü ayaktadır.
Yeniden başlatmanın doğrulaması da sürecin kendisindedir. Linux'ta çalışan komutun tam yolu, kurduğunuz ikilinin yoluyla aynı olmalıdır. Windows hizmetinde hizmetin "Yürütülebilir dosyanın yolu" alanı aynı işi görür. Yol tutuyorsa ve sürüm yamalı üç numaradan biriyse Brotli kopyası da o ikilinin içindedir. Sistemde ayrıca kurulu bir brotli paketinin sürümü bu sonucu değiştirmez.
Kayıt da sürüm numarasıyla birlikte durmalıdır. Site adı, açılış yolu, güncellemeden önceki sürüm ve sonraki sürüm aynı satırda yazılır. Bir hafta sonra "hangi site kaldı" sorusu bu satırdan cevaplanır. Panel ekran görüntüsü yolun yerini tutmaz. Ekran, seçili şablonu gösterir. Çalışan süreç, dosyayı gösterir. İkisi ayrıysa dosya esas alınır. Aynı tabloda JDK satırı da durabilir. O satırın kapanışı bu yazının sürüm numarasıyla değil, Java yazısındaki derleme numarasıyla olur.
Bu hafta sıra
- Her hizmet için çalışan
nodedosyasının tam yolu venode -vçıktısı yazılır. Kabuktaki sürüm ayrı sütundur. - 22 kullanılıyorsa 22.23.4, 24 kullanılıyorsa 24.22.1, 26 kullanılıyorsa 26.12.1 kurulur. Daha eski hatlar bu üçünden birine alınır.
- pm2, systemd ya da paneldeki işçi süreç yeni ikiliyle açılır. Açılış yolu yeniden okunur.
fetchile dışarı çıkan ve istek gövdesini açan uygulamalar, sürüm doğrulanana kadar işaretlenir.- İmaj yeniden kurulmadan konteyner güncellenmiş sayılmaz. Derleme aşaması ile çalışma aşaması ayrı kontrol edilir.
- Çökme kaydı, Brotli açığının tek kanıtı sayılmaz. Güncelleme yine de kurulur. Şüpheli bir çökme varsa bellek dökümü ve erişim kaydı silinmeden saklanır.
JDK envanteri bu listenin parçasıdır ama ayrı bir iştir. Onu Java yazısındaki derleme numarasıyla kapatın.
Sık sorulan sorular
Her Node.js sunucusu uzaktan ele geçirilir mi?
Hayır. Kod çözücü, uygulamanın açtığı veriye bakar. Çıplak HTTP sunucusu gelen gövdeyi kendiliğinden Brotli diye çözmez. fetch, node:zlib ya da gövdeyi açan bir çerçeve varsa konu açılır.
node -v 22.23.4 diyorsa iş bitti mi?
Kabuk için evet. Hizmet, aynı dosyayı çalıştırıyorsa evet. pm2 ya da systemd eski yolu tutuyorsa hayır. Çalışan sürecin tam yoluna bakın.
Node.js 20 kullanıyorum. Liste yalnızca 22, 24 ve 26 diyor.
Destek süresi bitmiş hat bu güvenlik sürümünü almaz. Proje, böyle sürümlerde destek dışı hatların etkilendiğini kabul etmenizi istiyor. Kalıcı çözüm 22.23.4, 24.22.1 veya 26.12.1 hattına geçmektir.
WAF bu açığı keser mi?
Gövde, uygulamanın kendi kod çözücüsüne girdikten sonra işlenir. WAF bilinen bir istek kalıbını tutabilir ve zaman kazandırır. Sürümün yerini tutmaz. Duyuru, kalıcı bir imza da vermez.
Aynı günkü Java yaması bunu da kapatır mı?
Hayır. Java yaması JDK güven deposunu değiştirir. Node.js'in Brotli kopyası kendi ikilisinin içindedir. Aynı paketteki ca-cert satırı Node.js deposunu yeniler, JDK dosyasını değil.
Express kullanmıyorum. Yine de yükseltmeli miyim?
Evet. fetch ve node:zlib Express'ten bağımsızdır. Aynı paketteki DNS ve TLS kayıtları da Express şartı taşımaz. Desteklenen hattaysanız üç sürümden size düşenini kurun.