Node.js projesi 21 Ekim 2026’da 22.23.4, 24.22.1 ve 26.12.1 sürümlerini yayımladı. Bu sürümler, dördü yüksek önem derecesiyle derecelendirilmiş on güvenlik açığını kapatıyor. En ciddisi olan CVE-2026-111497, Node’un Brotli kod çözücüsünde bir sınır dışı yazma (out-of-bounds write) açığıdır: bozuk biçimlendirilmiş sıkıştırılmış veri belleği bozabilir; barındırma şirketi Vercel de araştırmacıların bunu süreç belleğini okumak ve Node.js sürecinin yetkileriyle komut çalıştırmak için kullandığını bildiriyor. Diğer iki yüksek önem dereceli açık, bir TLS sertifikasının olmaması gerektiği halde ana bilgisayar adı (hostname) denetiminden geçmesine izin veriyor. Node.js 20 ve 25 ömrünü tamamladı ve bunlar için düzeltme yayımlanmayacak.
Hangi sürümler düzeltildi
| Sürüm dalı | Düzeltildiği sürüm | Durum |
|---|---|---|
| 26.x | 26.12.1 | güncel |
| 24.x (LTS) | 24.22.1 | destekleniyor |
| 22.x (LTS) | 22.23.4 | destekleniyor |
| 25.x | düzeltme yok | ömrünü tamamladı, 26 veya 24’e geçin |
| 20.x | düzeltme yok | 30 Nisan 2026’dan beri ömrünü tamamladı, 22 veya 24’e geçin |
On açık nedir
| CVE | Önem | Sorun | Dallar |
|---|---|---|---|
| CVE-2026-111497 | Yüksek | Brotli kod çözücüsünde sınır dışı yazma, kod çalıştırmaya yol açabilir | 26, 24, 22 |
| CVE-2026-105483 | Yüksek | IP adresi tam genişlikli rakamlarla yazıldığında TLS ana bilgisayar adı denetimi geçiyor | 26, 24 |
| CVE-2026-106069 | Yüksek | Ana bilgisayar adı gevşek biçimde bir IP adresine çözümlendiğinde TLS ana bilgisayar adı denetimi geçiyor | 26, 24, 22 |
| CVE-2026-105482 | Yüksek | dns.resolve adları NUL karakterinde kesiyor | 26, 24, 22 |
| CVE-2026-105481 | Orta | Keep-alive soketi, istek gönderilmeden önce yazılmış bir yanıtı kabul edebiliyor | 26, 24, 22 |
| CVE-2026-106072 | Orta | Kanonik olmayan IPv4 ana bilgisayarlarda sertifikadaki bir DNS adı, bir IP uç noktasının kimliğini doğrulayabiliyor | 26, 24, 22 |
| CVE-2026-106074 | Orta | randomUUID() ve randomInt(), başlangıç anlık görüntülerinde (startup snapshot) ve tek çalıştırılabilir dosyalı uygulamalarda (single executable app) aynı değerleri tekrar ediyor | 26, 24, 22 |
| CVE-2026-106073 | Düşük | fs.realpathSync ile Permission Model atlatması | 26, 24, 22 |
| CVE-2026-106070 | Düşük | ZipFile, başarısız bir başlık denetiminden sonra saldırganın denetimindeki baytları döndürüyor | 26 |
| CVE-2026-106071 | Düşük | Permission Model, joker karakterler (wildcard) üzerinden gereğinden fazla dosya erişimi veriyor | 26 |
Sürümler ayrıca paketle gelen bileşenleri de güncelliyor: c-ares, Undici, güvenilir CA listesi (ele geçirilmiş eMudhra ara CA’sı kaldırıldı), 24 ve 22 için OpenSSL ve 22 için SQLite.
Brotli açığından kimler etkileniyor
Node.js Brotli’yi kendi başına çözmez. Kodunuz ya da kullandığı bir kütüphane, başkasının denetimindeki Brotli verisini açıyorsa etkilenirsiniz. Bu, kulağa geldiğinden daha sık olur:
- Yerleşik
fetch(),Content-Encoding: briçeren yanıtları otomatik olarak çözer. Kullanıcıların seçtiği URL’leri, webhook’ları ya da üçüncü taraf API’leri çağıran bir servis kötü amaçlı bir yanıt alabilir. - axios, got ve node-fetch de sıkıştırılmış yanıtları varsayılan olarak çözer.
- Express 5 (body-parser 2) Brotli ile sıkıştırılmış istek gövdelerini varsayılan olarak çözer; yani bir API veriyi doğrudan bir saldırgandan alabilir.
- Yüklenen dosyalar ya da üçüncü taraf verileri üzerinde yapılan her
zlib.brotliDecompress,zlib.createBrotliDecompressveyaDecompressionStreamçağrısı.
Önce bunların internetle buluştuğu yerleri yamalayın: sıkıştırılmış gövde kabul eden herkese açık API’ler, kullanıcının verdiği URL’leri çağıran servisler ve yüklenen dosyaları açan her şey.
TLS açıkları esas olarak, bir saldırgan istemcinizin güvendiği bir CA’dan IP biçiminde bir DNS adı içeren sertifika alabildiğinde önem kazanır; DNS açığı ise kodunuz dışarıdan gelen girdiyi dns.resolve işlevine verdiğinde. Düzeltme commit’ine göre TLS sorunlarının istismarı kolay değildir, ancak aynı güncelleme bunları da kapatıyor.
Adım 1: her Node.js çalışma ortamını bulun
Linux’ta, sürümüyle birlikte her node ikili dosyasını listeleyin:
sudo find / -xdev -type f -name node -perm -u+x 2>/dev/null | while read -r n; do echo "$n: $("$n" --version 2>/dev/null)"; done
Çalışan süreçlerin hangi çalışma ortamını kullandığını kontrol edin:
for p in $(pgrep -x node); do echo "$p $(sudo readlink -f /proc/$p/exe)"; done
Docker’da çalışan her konteyneri kontrol edin:
for c in $(docker ps --format '{{.Names}}'); do echo "$c: $(docker exec "$c" node --version 2>/dev/null)"; done
Ayrıca sürüm yöneticilerini (nvm, fnm, Volta, asdf), CI runner’larını, derleme imajlarını, Electron uygulamalarını ve çalışma ortamı sürümünün proje yapılandırmasında belirlendiği serverless fonksiyonları da kontrol edin.
Adım 2: güncelleyin
NodeSource paketleriyle Ubuntu ve Debian:
sudo apt update && sudo apt install --only-upgrade nodejs && node --version
nvm ile:
nvm install 24.22.1 && nvm alias default 24.22.1
Konteynerler: temel imajı sabit bir sürüme çevirin, örneğin node:24.22.1-alpine ya da node:22.23.4-bookworm-slim; ardından yeniden derleyip yeniden dağıtın. Ana makineyi güncellemek, konteynerin içinde çalışanı değiştirmez.
Serverless ve barındırma platformları: Vercel’de 22.x ve 24.x üzerindeki projeleri Vercel yamalar ve Vercel gelen saldırıya karşı güvenlik duvarı kuralları ekledi; hâlâ 20.x üzerinde olan projelerin 22.x ya da 24.x’e geçip yeniden dağıtılması gerekir. Diğer platformlarda sağlayıcının duyurusunu kontrol edin ve yamalı çalışma ortamı sunulduğunda yeniden dağıtın.
Ubuntu’nun kendi nodejs paketi gibi dağıtım paketleri çoğu zaman geride kalır. node --version çıktısı 22.23.4, 24.22.1 ya da 26.12.1’i (veya bu CVE’leri adıyla anan bir dağıtım derlemesini) göstermiyorsa resmî sürümleri kullanın.
Adım 3: yeniden başlatın ve doğrulayın
Çalışan bir süreç, yeniden başlatılana kadar eski çalışma ortamını korur. Linux’ta bir paket güncellemesinden sonra bu komut, değiştirilmiş ikili dosyayı hâlâ çalıştıran node süreçlerini listeler:
sudo ls -l /proc/*/exe 2>/dev/null | grep -i 'node.*(deleted)'
Bu servisleri yeniden başlatın (örneğin systemctl restart, pm2 reload all ya da yeni bir dağıtımla) ve 1. adımdaki komutları yeniden çalıştırın.
Bugün güncelleyemiyorsanız
Bunların hiçbiri güncellemenin yerini tutmaz, ancak birkaç gün için riski azaltır:
- Brotli ile sıkıştırılmış istek gövdelerini uygulamaya ulaşmadan reddedin; örneğin NGINX’te
if ($http_content_encoding ~* br) { return 415; }ile ya da gövde ayrıştırıcılardan (body parser) önce çalışan bir middleware ile. - Güvenilmeyen sunuculara yapılan isteklerde otomatik açmayı kapatın: axios ve got’ta
decompress: false, node-fetch’tecompress: falseya da sıkıştırmayı açmayan undicirequest(). Yerleşikfetch()kapatılamaz. - Kullanıcının verdiği URL’lerin çağrılmasını, mümkün olan en az yetkiyle ayrı bir süreçte çalıştırın.
- Dışarıdan gelen girdiyi
dns.resolveişlevine vermeden önce NUL karakteri içeren adları reddedin.
Hangi servislerinizin güvenilmeyen verileri çözdüğünden emin değilseniz ya da üretim sistemini kesintisiz güncellemek için yardıma ihtiyacınız varsa güvenli yazılım ve yönetilen güvenlik ekiplerimiz size yardımcı olabilir.
