Xzbot: xz arka kapısı için notlar, honeypot ve exploit demosu
(github.com/amlweems)- xzbot, xz arka kapısını (CVE-2024-3094) incelemek için bir depo olup honeypot, ED448 açık anahtar yaması, arka kapı payload biçimi ve uzaktan kod yürütme demosunu birlikte sunar
- Honeypot, OpenSSH’ye basit bir yama uygulayarak arka kapı biçimiyle eşleşen açık anahtar N değeriyle gelen bağlantı denemelerini sshd günlüklerine kaydeder
- ED448 yaması, arka kapının imza doğrulama ve payload şifre çözmede kullandığı sabit kodlanmış açık anahtarı kullanıcının oluşturduğu anahtarla değiştirerek arka kapının tetiklenmesini sağlar
- Arka kapı payload’u, SSH sertifikasının CA imza anahtarı N değerine yerleştirilir;
a * b + cile istek tipi oluşturulur ve Type 2, null ile sonlandırılmış komutusystem()ile çalıştırır - Demo CLI, savunmasız SSH sunucusuna bağlanıp komut çalıştırma akışını gösterir; başarılı bir istismar INFO ve üzeri günlük üretmez
xzbot’un kapsamı ve bileşenleri
- xzbot, xz arka kapısı CVE-2024-3094’ü incelemek için bir projedir
- Dört bileşen içerir
- honeypot: exploit denemelerini tespit etmek için sahte savunmasız sunucu
- ed448 patch:
liblzma.so’yu kendi ED448 açık anahtarını kullanacak şekilde yamalar - backdoor format: arka kapı payload biçiminin özeti
- backdoor demo: ED448 özel anahtarının bilindiği varsayımıyla RCE’yi tetikleyen CLI
Honeypot: OpenSSH yamasıyla denemeleri tespit etme
- openssh.patch, arka kapı biçimiyle eşleşen açık anahtar N değeriyle gelen bağlantı denemelerini kaydetmek için OpenSSH’ye uygulanan basit bir yamadır
- Akış,
openssh-portabledeposunu klonladıktan sonra yamayı uygulayıpautoreconf,configure,makeçalıştırma şeklindedir - Bağlantı denemeleri
sshdgünlüklerindexzbot: magic 1 [preauth]ve payload bayt dizisi biçiminde görünür
ED448 açık anahtar yaması
- Arka kapı, imza doğrulama ve payload şifre çözme için sabit kodlanmış ED448 açık anahtarı kullanır
- Bu açık anahtar kullanıcının sahip olduğu bir anahtarla değiştirilirse arka kapı tetiklenebilir
- Depo, saldırganın ED448 açık anahtarını ve
seed=0ile oluşturulmuş yedek açık anahtar değerini birlikte sunar - Başlangıç adımı, arka kapıyı içeren
liblzma.so.5.6.1paylaşımlı nesnesini hazırlamaktır- Örnek kaynak olarak
xz-utils 5.6.1-1Debian snapshot’ı verilir pwntoolskurulduktan sonrapatch.py liblzma.so.5.6.1çalıştırılırsaliblzma.so.5.6.1.patcholuşturulur- Ardından değiştirilmiş
liblzma.so.5.6.1.patchpaylaşımlı nesnesi kullanılaraksshdçalıştırılır
- Örnek kaynak olarak
- assets içinde örnekler bulunur
Arka kapı payload biçimi
- Arka kapı, SSH sertifikasıyla bağlanırken payload’un CA imza anahtarı N değeri içine yerleştirilmesiyle tetiklenebilir
- Bu payload’un saldırganın ED448 anahtarıyla şifrelenmiş ve imzalanmış olması gerekir
- Dış yapı şu alanlardan oluşur
a: 32 bitb: 32 bitc: 64 bitciphertext: 240 bayt
- İstek tipi
a * b + cile türetilir- Değer 3’ten büyükse arka kapı işlemeyi atlar
- Type 1: amacı bilinmiyor ve 0 bayt bekliyor
- Type 2: null ile sonlandırılmış payload’u
system()ile çalıştırır - Type 3: amacı bilinmiyor ve 48 bayt imza verisi bekliyor
ciphertext, ED448 açık anahtarının ilk 32 baytı simetrik anahtar olarak kullanılarak chacha20 ile şifrelenir- Bu nedenle exploit denemeleri, verilen 32 baytlık anahtarla çözülebilir
- Şifresi çözülmüş
ciphertextiçinde 114 baytlık imza,xveyadlı 1 bitlik alanlar, uzunluk, komut dizesi vb. bulunurxveyayayarlanırsa biraz farklı bir kod yoluna gidilir
- İmza, RFC-8032 ED448 imzasıdır
- Girdi; 32 bit magic değeri, komuttan önceki 5 baytlık alan, isteğe bağlı olarak komutun
lengthbaytı ve sunucu hostkey’inin SHA-256 özetinin ilk 32 baytını içerir
- Girdi; 32 bit magic değeri, komuttan önceki 5 baytlık alan, isteğe bağlı olarak komutun
Exploit demo CLI
- CLI Go ile kurulur
go install github.com/amlweems/xzbot@latest
xzbot -hüç ana seçeneği gösterir-addr: SSH sunucu adresi, varsayılan127.0.0.1:2222-seed: xz arka kapı anahtarıyla eşleşmesi gereken ED448 seed’i, varsayılan0-cmd:system()ile çalıştırılacak komut, varsayılanid > /tmp/.xz
- Örnek,
127.0.0.1:2222adresindeki savunmasız SSH sunucusuna bağlanıpid > /tmp/.xzkomutunu çalıştırır - Savunmasız sunucuda
system()çağrı konumuna watchpoint ayarlanırsasshdsürecininid > /tmp/.xzçalıştırdığı görülebilir - Çalıştırmadan sonra
/tmp/.xziçindeuid=0(root) gid=0(root) groups=0(root)çıktısının kaldığı bir örnek sunulur
Süreç ağacı ve günlük özellikleri
- Normal SSH bağlantısının süreç ağacı,
sshdkullanıcı oturumu ve shell ile devam eder - Arka kapı çalıştırma örneği,
xzbot -cmd 'sleep 60'sonrasındasshd: root [priv],sshd: root [net],sh -c sleep 60,sleep 60öğelerinin göründüğü bir biçimdedir - Başarılı bir istismar INFO ve üzeri günlük girdisi oluşturmaz
1 yorum
Hacker News yorumları
Herkesin kötüye kullanabileceği bir uzaktan kod çalıştırma açığı olmak yerine saldırganın özel anahtarını gerektirecek şekilde tasarlanmış olması oldukça ilginç
İronik biçimde, güvenlik bilinci çok yüksek bir zafiyet gibi görünüyor
Herkesin girebileceği kocaman bir delik açsalardı hızla keşfedilip kapatılırdı; performans düşüşü olmasaydı da geniş çapta kötüye kullanılamadığı için sessizce uzun süre hayatta kalmış olabilirdi
xz’ye yapılan katkıların tamamı sonunda bu arka kapıyı koymaya yönelik çalışma gibi görünüyor; örneğin kötü amaçlı yükü saklayabilecek bir test framework’ü bile oluşturmuşlar
xz üzerinde çalışmadan önce BSD’nin libarchive’ine de katkıda bulunmuştu ve orada da bir zafiyet ortaya çıktı
Tasarım ve uygulama inanılmaz derecede rafineydi; performans sorununun keşfe yol açması neredeyse tamamen şans gibi hissettiriyor
Öyleyse sunuculara gelişigüzel gönderilemez ve tek bir host’a göndermek bile hesaplama açısından oldukça maliyetli bir yapı demektir
Bu olay tüm hafta sonu aklımdan çıkmadı
Mekanizma ilginç ve iyi bir obfuscation derlemesi; sosyal mühendislik kısmı ise açık kaynak bakımcılarına utanç verici derecede tanıdık bir hikâye
En ilginç olan, saldırı vektörü olarak kötü test verisini seçmeleri: iyi bir arşiv hazırlayıp yapısal olarak manipüle ettikten sonra fuzz test için kötü veri olarak kullanınca geri kalan adımlar inanılmaz kolaylaşıyor
İlerisi için söylemek gerekirse, bu tür manipülasyonların ikili desen grafiklerinde görünmesi gerekir gibi geliyor
Yöntemlerin geri kalanı, yük belirlendikten sonra büyük ölçüde sıradan obfuscation’a yakındı; ama aynı desenle başka test dosyalarına fark ettirmeden “yama” ya da tamamen yeni bir arka kapı eklenebilecek olması en parlak hamleydi
GitHub’ın depoyu gizleyip kaldırması hiç yardımcı olmadı; bu olayı analiz etmeyi zorlaştırdı
O bağımlılığın özellikle xz’yi tercih ettiğini ve kurulu değilse, kolaylık özelliğiymiş gibi host makineye xz’yi de kurduğunu fark ettim
Diğer bağımlılıklarda böyle davranmaması biraz tuhaf
Bu tür uzun oyunlar ürkütücü; “kötülük” fiilen çalıştırılana kadar neyin kötü niyetli, neyin sadece garip olduğunu bilemiyorsunuz
Özellikle bir test hatasını kanıtlamak için kullanılan “ikili çöp” dosyasıysa, kötü amaçlı içeriği saklamak için fazlasıyla iyi bir yer
Topluluğun, özellikle de amlweems’in bu kadar hızlı kavram kanıtı kodu uygulayıp belgelemesi çok etkileyici
Kripto işlevinde veya yük yükleme işlevinde ek zafiyetler yoksa, anahtar kırılana kadar diğer saldırganların tamamına bir güvenlik açığı açmamış bile olabilir
Sonraki adım zafiyetli dağıtımları tespit etmenin yolunu bulmak; bu kolay görünmüyor. Ayrıca hardcoded anahtarla birilerinin SSH sunucularını aktif biçimde tarayıp taramadığını izleme yöntemini upstream’e eklemek de mümkün olabilir
Orijinal sürüm için kavram kanıtı, yayımlanmamış saldırgan özel anahtarını gerektiriyor
Yapılabilecek en iyi şey daha ince benchmark’lar olur; ama rastgele bir internet host’unun yavaş olmasının nedeni zafiyetli olması mı, uzakta olması mı, yoksa bilgisayarın kendisinin yavaş olması mı bilemezsiniz
Geçmişte o host’a bağlantı denemelerinin ne kadar sürdüğüne erişiminiz de yok; yönlendirme değişiklikleri de var
Bu kavram kanıtını anormal süreç davranışı tespit araçlarıyla deneyen var mı merak ediyorum
Carbon Black, AWS GuardDuty, Sysdig gibi ürünler buna giriyor; bu ürün ailesi, bunun gerçekten dağıtılmış olması hâlinde birinin nispeten hızlı fark edip etmeyeceğini test etmek için tam uygun bir örnek gibi görünüyor
GuardDuty, CrowdStrike veya Carbon Black gibi EDR’ler gibi süreçlerin içine bakmadığı için yakalaması zor olur; Sysdig ise konteynerlere ve bulut altyapısına baktığından exploit’in kendisini yakalaması zor görünüyor
Ancak ayrıcalık yükseltmeden sonra tehdit aktörünün sonraki eylemlerinde anormallik yakalama ihtimali var
Sonuçta exploit’in kendisini yakalama olasılığı en yüksek olanlar, endpoint süreçlerini izleyen EDR’ler veya upstream özgür/açık kaynak yazılımlardaki güvenlik sorunlarını izleyen yazılım tedarik zinciri değerlendirmesi gibi görünüyor
İlginç biçimde bu daha büyük bir güvenlik konusuna bağlanıyor
Geliştirme ekipleri performans düşüşü ve izolasyon önlemleri sırasında kullanıcı deneyimi sorunları nedeniyle sunuculara EDR kurmaktan hoşlanmayabilir; özgür/açık kaynak yazılım kullanımını sınırlayan politikalardan da hoşlanmayabilir
Bu exploit, kurumsal düzeydeki “zafiyetin” tam ortasına saplanıyor; konuma göre maruziyeti sürdürmek için de düzeltmek için de gerekçe doğuyor
“Çalışma zamanı tespitinin bir yolu, SSHD’nin kötü amaçlı kütüphaneyi yükleyip yüklemediğini izlemektir. Bu tür paylaşımlı kütüphaneler dosya adında sık sık sürüm bilgisini içerir” dedi
Başka güvenlik şirketlerinde görmediğim gerçek tespit kuralı içeriği de blogda var
https://sysdig.com/blog/cve-2024-3094-detecting-the-sshd-bac...
Aşağıdaki bağlantıyı yanlış okumuştum; özgün içeriği kayıt amacıyla bırakıyorum
Aynı e-posta dizisinin aşağısına bakınca, arka kapıyı commit eden kişinin yakın zamanda çekirdeğe katkı da yapmış gibi göründüğü söylenmişti; ama asıl analiz gerçekten çok iyi, bu tür yazıları okumak faydalı
https://www.openwall.com/lists/oss-security/2024/03/29/10
Lasse de bunun hiç acil olmadığını ve bu merge window'a girmeyeceğini söylemişti; aklı başında kimse Lasse'yi kötü niyetli bir aktör olmakla suçlamıyor
Bu olayın birkaç yıl önceki Audacity olayıyla saçma derecede çok benzer yanı var
Cookie guy, bıçaklandığını ve federal polisin olaya dahil olduğunu iddia etmişti; bu da olayın 4chan'den çok daha büyük bir aktörle bağlantılı olma ihtimaline işaret ediyor
O dönemde birçok kişi yalnızca Muse Group'un ilgili olduğunu sanıyordu ama belki de bir Rus devlet aktörüydü
Bundan önce Audacity'de çok sayıda telemetri ve arka kapı olduğunu, fork ettikten sonra bunları ilk commit'te kaldırdığını iddia etmişti
Belki Audacity'de de gerçekten bir arka kapı vardır; kaynak kodunu kontrol etmek gerekecek
Son zamanlarda operasyonlarını APT29 ile birleştiriyorlar; ben olsam cozy bear'ı uyandırmazdım
Derleme zamanındaki honeypot
openssh.patchhttps://github.com/amlweems/xzbot/blob/main/openssh.patch olmadan, gerçek exploit'in çalışma zamanında bunu nasıl yaptığını merak ediyorumZincir
opensshd -> systemd bildirimi -> geçici bağımlılık olarak dahil edilen xzidi;liblzma.so.5.6.1belleğe yüklendikten sonra nasıl geriye doğruopenssh_RSA_verify'a ulaşıp hook ya da patch uyguladığını bilmek istiyorumlibcrypto'dan önce yüklenmişse bir sembol denetim işleyicisi kaydediyor; muhtemelen glibc'ye özgü bir özellik gibi görünüyor ve libcrypto'nun sembolü çözümlendiğinde bildirim alıp GOT patch'ini erteleyebiliyor
Bu exploit'in yalnızca SSH bağlantısı geldiğinde mi çalıştığını bilen var mı merak ediyorum
GitHub'daki string listesinde
DISPLAYveWAYLAND_DISPLAYyer alıyorhttps://gist.github.com/q3k/af3d93b6a1f399de28fe194add452d01
Bunların SSH ile açık bir ilgisi yok; dolayısıyla bağlantı yokken de bir şey yapmış olma ihtimali var
Kodu çalıştırmış ama SSH sunucusunu internete açmadığı için güvende olduğunu varsayan kişiler için önemli olabilir
Yani birinin tespit, yeniden üretme veya debug etmeye çalıştığı durumlardan kaçınmak için konmuş bir düzenek
Güvenilmeyen bir makineye bağlanırken kapatılmazsa bağlanan taraf açısından yaygın bir güvenlik açığına dönüşür
“Başarılı istismar log girdisi oluşturmaz” ifadesi, bu exploit fark edilmeseydi saldırganın ele geçirilmiş host üzerinde ilgili “bağlantı” için tek bir sshd log'u olmadan root olarak rastgele komut çalıştırabileceği anlamına mı geliyor, merak ediyorum
Uzaktan kod çalıştırma, log düşülmeden önceki bağlantı aşamasında gerçekleşiyor
Acaba hangi anomali tespiti bunu yakalayabilirdi
Test dosyalarını ayrı bir depoya ayırıp derleme sırasında kullanılamaz hâle getirmek bu saldırıyı zorlaştırabilir miydi, merak ediyorum
Mantık şu: Derlemeye dahil olabilen her şey insan tarafından okunabilir olmalı
Bu saldırıyı bir uçak kazası gibi ele alıp tekrar başarılı olma ihtimalini azaltacak yeni kurallar getirmeliyiz
Katkıda bulunan herkesin tek tek doğrulanması mümkün olmasa bile, gürültülü test verileri kolayca ayrılabilir olmalı