Özet
- OpenSSH'de güvenlik açığı keşfi: OpenSSH sunucusunda (
sshd) sinyal işleyici yarış durumu nedeniyle uzaktan kod çalıştırma (RCE) açığı bulundu. Bu açık, varsayılan yapılandırmada sshd'yi etkiliyor.
- Açığın kökeni: Bu açık, 2006'da bildirilen CVE-2006-5051'in yeniden ortaya çıkmış bir hali olup, Ekim 2020'de OpenSSH 8.5p1'de yapılan bir kod değişikliği nedeniyle oluştu.
- Açığın etkisi: glibc tabanlı Linux sistemlerinde uzaktan istismar edilebilir ve
sshd'nin ayrıcalıklı kodunu etkileyerek root yetkileriyle uzaktan kod çalıştırmaya yol açabilir.
- Açığın istismar yöntemi: Bu açığı istismar etmek için belirli kod yollarının bulunması ve bunların doğru anda kesintiye uğratılması gerekiyor. Bunun için eski OpenSSH sürümlerinden başlanıp en yeni sürümlere kadar genişletildi.
- Yama ve hafifletme: Açığı gidermek için yama ve hafifletme yöntemleri sunuluyor.
SSH-2.0-OpenSSH_3.4p1 Debian 1:3.4p1-1.woody.3 (Debian 3.0r6, 2005)
Teori
- SIGALRM işleyicisi: Bu sürümün SIGALRM işleyicisi
packet_close() çağırıyor; bu da buffer_free(), ardından xfree() ve free() çağrılarına yol açıyor. free() asenkron sinyal açısından güvenli değil.
- malloc kod analizi: malloc kodunda,
free() çağrısının SIGALRM ile kesilip SIGALRM işleyicisi içinde yeniden çağrılması durumunda açığın istismar edilebileceği bir yol bulundu.
Uygulama
- Saldırı yöntemi: DSA açık anahtarını ayrıştıran koddaki
free() çağrısı kesintiye uğratılıyor ve bu durum SIGALRM işleyicisi içinde istismar edilerek uzaktan kod çalıştırma elde ediliyor.
- Yarış durumunu kazanma: Bu yarış durumunu kazanmak için yaklaşık 10.000 deneme gerekiyor ve ortalama olarak yaklaşık 1 hafta sürüyor.
Zamanlama
- Zamanlama stratejisi: Ağ gecikmesini en aza indirmek için son bayt son anda gönderiliyor ve round-trip time izlenerek zamanlama ayarlanıyor. Bu sayede yarış durumunu kazanma olasılığı artırılıyor.
SSH-2.0-OpenSSH_4.2p1 Debian-7ubuntu3 (Ubuntu 6.06.1, 2006)
1. teori
- SIGALRM işleyicisi: Bu sürümün SIGALRM işleyicisi
packet_close() çağırmıyor ve malloc işlevi her zaman kilit aldığı için başka bir çözüm gerekiyor.
- PAM kullanımı: PAM'in
pam_end() işlevinin asenkron sinyal açısından güvenli olmadığı tespit edildi ve bunun istismar edilebileceği yollar araştırıldı.
2. teori
pam_start() analizi: pam_start() kesintiye uğrarsa PAM yapısı tutarsız bir durumda kalabiliyor ve bu durum SIGALRM işleyicisi içinde istismar edilebiliyor.
- House of Mind tekniği: Saldırı için House of Mind tekniği kullanılarak bellek tahsisi manipüle ediliyor ve root yetkileriyle uzaktan kod çalıştırma elde ediliyor.
Uygulama
- Saldırı yöntemi: Uzun kullanıcı adları kullanılarak bellek tahsisi manipüle ediliyor ve birden fazla
pam_start() çağrısı üzerinden yarış durumunu kazanma olasılığı artırılıyor.
Zamanlama
- Zamanlama stratejisi: Önceki Debian sürümünde kullanılan zamanlama stratejisi yeniden kullanılarak yarış durumunu kazanma olasılığı artırılıyor. Ortalama olarak 1-2 gün sürüyor.
SSH-2.0-OpenSSH_9.2p1 Debian-2+deb12u2 (Debian 12.5.0, 2024)
Teori
- SIGALRM işleyicisi: Bu sürümün SIGALRM işleyicisi
syslog() çağırıyor; bu da asenkron sinyal açısından güvenli olmayan işlevleri tetikliyor.
- glibc analizi: glibc'nin
syslog() işlevi malloc çağırıyor ve bu da asenkron sinyal açısından güvenli değil. Ayrıca glibc'nin malloc işlevi tek iş parçacıklı durumda kilit kullanmıyor.
Yama ve hafifletme
- Yama: Açık OpenSSH geliştiricilerine bildirildi ve bunu gidermek için bir yama sağlandı.
GN⁺ görüşü
- Güvenliğin önemi: OpenSSH son derece kritik bir güvenlik yazılımı ve bu açık çok nadir görülen bir örnek.
- Açığın istismar zorluğu: Bu açığın istismarı çok hassas zamanlama ve çok sayıda deneme gerektiriyor.
- Alternatif çözümler: OpenSSH dışında da çeşitli güvenlik çözümleri bulunuyor ve bunları birlikte kullanmak faydalı olabilir.
- Teknik zorluk: Bu araştırma çok yüksek düzeyde teknik zorluk içeriyor ve güvenlik araştırmacılarına büyük ilham verebilir.
- Açığın hafifletilmesi: En güncel güvenlik yamalarının uygulanması ve güvenlik ayarlarının güçlendirilmesi önemli.
1 yorum
Hacker News yorumları
RCE düzeltmesi neredeyse bir ay önce kamuya açık şekilde "gizlice" yapıldı
Hatayı ortaya çıkaran diff içinde fonksiyon şu şekilde yeniden düzenlenmiş
sigdie(const char *fmt,...)sshsigdie(const char *file, const char *func, int line, const char *fmt, ...)OpenSSH sürüm notlarında ilginç bir yorum
OpenBSD, SIGALRM işleyicisinin syslog_r() çağırması nedeniyle bu güvenlik açığından etkilenmiyor
musl'un syslog(3) uygulamasını inceleyince, glibc'nin aksine kolayca exploit edilemediği görülüyor
FreeBSD için bir yama çıktı ve glibc kullanmadığı için büyük olasılıkla etkilenmiyor
sshd_config dosyasında 'LoginGraceTime 0' ayarlanması sorunu hafifletebilir
Debian 12 için yama çıktı, Debian 11 etkilenmiyor
OpenSSH sürüm notları ve minimal yama bağlantısı paylaşıldı
Bağımsız bir bakış açısından, tek bir güvenlik açığını bulmanın tek başına yeterli olması gerektiği düşünülüyor