← Radar

Konu: Güvenlik3 dk okuma

Citrix NetScaler'da iki sıfırıncı gün: Log satırından root komutu, DTLS'ten bellek taşması

Bu neden önemli?

Ağın sınırındaki cihazlar internetten gelen her şeyi ilk karşılayan yer. İki hata da yıllardır bilinen, ders kitabı türünden hatalar: kullanıcı verisini kabuğa vermek ve uzunluk alanını kontrol etmemek. Kendi kodunda da aynı tuzaklara düşmemek için iyi bir örnek.

“Cihazları hemen kapatın”

Eylül’ün son haftasında bazı sistem yöneticileri tuhaf bir telefon aldı. Tedarikçileri, ayrıntı vermeden “NetScaler’larınızı hemen kapatın” dedi. Uyarının kaynağı, Hollanda’nın siber güvenlik merkezine (NCSC-NL) dayanan bir ön bildirimdi. Birkaç gün sonra Citrix, 27 Eylül’de CTX697096 bültenini yayımladı. Bültende sekiz açık vardı. İkisi kritikti ve yama çıkmadan önce saldırılarda kullanılmıştı. Bunlara zero-day, yani sıfırıncı gün açığı deniyor.

NetScaler (ADC ve Gateway), şirket ağı ile internet arasında duran bir cihaz. Uzaktan erişim (VPN), kimlik doğrulama ve yük dağıtımı gibi işleri yapıyor. Yani internetten gelen herkesin ilk konuştuğu kapı. Kapıda bir açık varsa, kapı bir delik oluyor.

Birinci açık: Log satırından root komutuna (CVE-2026-88771)

watchTowr’ın analizine göre sorun, çöken bir işlemin dökümünü (core dump) bulmaya çalışan bir Perl betiğinde. Betik log dosyalarında “NSPPE işlemi beklenmedik şekilde öldü” türünden satırları arıyor. Satırdaki “NSPPE”den sonraki metni grep, sed ve awk ile kesip bir dosya adı çıkarıyor. Sonra bu adı ters tırnak (backtick) içindeki bir find komutuna yapıştırıyor.

Ters tırnak, içindekini kabukta (shell) çalıştır demek. Saldırgan, kimlik doğrulama formunun kullanıcı adı alanına bu log satırını taklit eden bir metin yazıyor. Metin AAA loglarına düşüyor. Betik çalıştığında saldırganın eklediği komut da root yetkisiyle çalışıyor. Giriş yapmaya gerek yok. Varsayılan ayarlar yetiyor.

Yamada betik kabuğu tamamen bırakıyor: Logu Perl’ün kendi dosya okumasıyla, sıkı bir regex ile ayrıştırıyor ve find’ı argüman listesiyle, kabuk olmadan çağırıyor.

İkinci açık: DTLS ve iki farklı uzunluk (CVE-2026-88772)

DTLS, TLS’in UDP üzerinde çalışan hâli. NetScaler’da VPN sunucuları için varsayılan olarak açık. DTLS el sıkışması mesajlarında iki uzunluk alanı var: mesajın toplam uzunluğu ve parçanın (fragment) uzunluğu. watchTowr’a göre cihaz bu ikisine tutarsız güveniyor. Saldırgan 120 baytlık bir mesaj ilan edip 1 baytlık parçalar yolluyor. Birleştirilen veri sonunda yaklaşık 170 KB’a çıkıyor ve 35.840 baytlık bir tampona boyut kontrolü olmadan kopyalanıyor.

Tampon yığında (stack) değil, programın global değişkenlerinin durduğu BSS bölümünde. Saldırgan taşmayla yakındaki bir nesnenin fonksiyon tablosunu (vtable) değiştiriyor. Sonra ROP denen teknikle bir bellek sayfasını çalıştırılabilir yapıp kendi kodunu koşturuyor.

Bunu kolaylaştıran ayrıntı şu: 41 MB’lık nsppe programı PIE olmadan derlenmiş. PIE, programın her açılışta bellekte farklı bir adrese yüklenmesini sağlıyor (ASLR’nin program koduna uygulanması). PIE yoksa adresler her cihazda aynı. Saldırganın tahmin etmesi gereken bir şey kalmıyor. Videoya göre modern derleyiciler PIE’yi zaten varsayılan açıyor. Eski derleme düzenine dokunmak istememek pahalıya patlamış.

Ne yapmalı?

  • Citrix’in düzeltilmiş sürümlerine geç (ör. 14.1-73.37, 13.1-64.23 ve sonrası).
  • Yama öncesinde açıkta kalan cihazı ele geçirilmiş say: Logları ve yapılandırmayı incele, şifreleri ve anahtarları değiştir. watchTowr, kullanıcı adı alanında ;, | ya da ters tırnak geçen giriş denemelerine bakmayı öneriyor.

Neden önemli?

İki hatanın da çözümü yıllardır biliniyor. Kullanıcıdan gelen veriyi kabuğa verme, komutları argüman listesiyle çağır. Ağdan gelen her uzunluk alanını tamponun kalan yeriyle karşılaştır. Derleyicinin güvenlik bayraklarını (PIE, stack canary, RELRO) kapalı bırakma. Ağın kapısında duran cihazlarda bu temel kurallardan biri unutulunca, sonuç bütün şirket ağı olabiliyor.

Düşün

  • Senin kodunda kullanıcı girdisi bir log dosyasından geçip sonra başka bir programa veriliyor mu?
  • Kullandığın derleme ayarları en son ne zaman gözden geçirildi?

Videoyu izle

Tıklayınca video YouTube'dan yüklenir; o ana kadar bu sayfa YouTube'a hiçbir istek göndermez.
Kaynaklar (7, İngilizce)

Kendi cümlelerimizle yazılmış bir özettir, çeviri değildir. Tüm kaynaklar yukarıda.