XZ arka kapı olayı: ilk analiz sonuçları
(securelist.com)- XZ Utils/liblzma arka kapısı, 29 Mart 2024'te Openwall OSS-security posta listesinde kamuya açıklandı ve saldırganın nihai hedefinin systemd tabanlı dağıtımlardaki OpenSSH sunucusu sshd içine uzaktan kod çalıştırma yeteneği yerleştirmek olduğu düşünülüyor
- Enfeksiyon zinciri, XZ deposundaki test dosyaları ve derleme altyapısını kullanan çok aşamalı bir ekleme sürecinden oluşuyordu;
build-to-host.m4,bad-3-corrupt_lzma2.xzvegood-large_compressed.lzmaüzerinden geçerek kötü amaçlı nesne dosyası derleme sırasındaliblzmaile linkleniyordu - Arka kapı içeren XZ 5.6.0 ve 5.6.1, bazı büyük tedarikçilerin beta ve deneysel derlemeleriyle dağıtıldı; CVE-2024-3094 ise 10 ciddiyet puanıyla sınıflandırıldı
- İkili arka kapı, GLIBC'nin IFUNC mekanizmasını ve
cpuidçağrı yolunu kötüye kullanarak yükleniyor; ardından OpenSSL/libcrypto ile ilgili işlevleri hook'layarak enfekte makinedeki bağlantıları izlemeye çalışıyor - Kötü amaçlı kod,
/usr/bin/sshdçalışıp çalışmadığını ve kill switch ortam değişkenini kontrol ediyor; trie tabanlı dizge işleme, dinamik sembol çözümleme vertdl-auditçalışma zamanı yamasıyla analiz ve tespiti zorlaştırıyor
Olayın özeti ve etki alanı
- 29 Mart 2024'te Openwall OSS-security posta listesindeki mesaj ile XZ arka kapısının keşfi kamuya açıklandı
- XZ, birçok büyük Linux dağıtımına entegre edilmiş bir sıkıştırma yardımcı programı
- Riskin özü, arka kapı içeren
liblzmakütüphanesinin bazı systemd tabanlı dağıtımlarda OpenSSH sunucu sürecisshdile bağlanabilmesi- Ubuntu, Debian ve RedHat/Fedora Linux, OpenSSH'nin systemd özelliklerini kullanması için yamalandığından bu kütüphaneye bağımlı
- Arch Linux ve Gentoo'nun etkilenmediği değerlendiriliyor
- Saldırganın nihai hedefinin, başkalarının kullanamayacağı bir sshd uzaktan kod çalıştırma yeteneği eklemek olduğu düşünülüyor
- Tek bir kötü amaçlı yama, sahte paket veya typo-squatting paketleri etrafında dönen diğer tedarik zinciri saldırılarından farklı olarak bu olay, dünya çapındaki SSH sunucularının ele geçirilmesine neredeyse ulaşan çok aşamalı bir operasyon niteliğinde
Arka kapının yerleştirilme yöntemi
liblzmaarka kapısı, derleme süreci ile test dosyalarını birlikte kullanarak iki düzeyde eklendi- Nihai paketi üreten derleme altyapısı kaynak kodu,
build-to-host.m4eklenerek değiştirildi - Test senaryosu dosyalarının içine gizlenmiş betik ve ikili bileşenler derleme sırasında çıkarıldı
- Nihai paketi üreten derleme altyapısı kaynak kodu,
- Enfeksiyon akışı üç dosya etrafında ilerliyordu
build-to-host.m4: sonraki aşama betiğini çıkaran derleme betiğibad-3-corrupt_lzma2.xz: shell betiğinin gizlendiği test dosyasıgood-large_compressed.lzma: kötü amaçlı ikili nesnenin gizlendiği test dosyası
- Çıkarılan kötü amaçlı ikili bileşen, derleme sürecinde normal kütüphane ile linklenerek Linux depolarına taşınabiliyordu
- Büyük tedarikçiler bu kötü amaçlı bileşeni beta ve deneysel derlemeler içinde dağıttı
- XZ Utils ihlaline CVE-2024-3094 atandı ve ciddiyet puanı azami değer olan 10 olarak belirlendi
Başlıca zaman çizelgesi
- 19 Ocak 2024: Yeni maintainer
jiaT75, XZ web sitesini GitHub Pages'e taşıdı - 15 Şubat 2024:
build-to-host.m4,.gitignoredosyasına eklendi - 23 Şubat 2024: Kötü amaçlı betik aşamasını içeren iki “test dosyası” eklendi
- 24 Şubat 2024: XZ 5.6.0 yayımlandı
- 26 Şubat 2024:
CMakeLists.txtiçine Landlock güvenlik özelliğini engelleyen bir commit girdi - 4 Mart 2024: Arka kapı, Valgrind ile ilgili sorunlara yol açtı
- 9 Mart 2024: İki test dosyası güncellendi, CRC işlevi değiştirildi ve Valgrind sorunu “düzeltildi”
- 9 Mart 2024: XZ 5.6.1 yayımlandı
- 28 Mart 2024: Hata keşfedildi ve Debian ile RedHat'e bildirildi
- 28 Mart 2024: Debian, XZ 5.6.1'i 5.4.5-0.2 sürümüne geri aldı
- 29 Mart 2024: OSS-security posta listesinde kamuya açık e-posta yayımlandı
- 29 Mart 2024: RedHat, arka kapılı XZ'nin Fedora Rawhide ve Fedora Linux 40 beta ile dağıtıldığını doğruladı
- 30 Mart 2024: Debian, derlemeleri durdurdu ve yeniden derleme sürecini başlattı
- 2 Nisan 2024: XZ'nin ana geliştiricisi arka kapı olayını kabul etti
Enfeksiyon zincirinin 3 aşaması
-
1. aşama: değiştirilmiş
build-to-host.m4- XZ'nin resmi GitHub deposu sürümleri kötü amaçlı test dosyalarını içeriyordu, ancak bu dosyaların çalıştırılma fırsatı olmadığından başlangıçta zararsız görünüyordu
- Enfeksiyonu başlatan kötü amaçlı kodun,
jiaT75kontrolündekixz[.]tukaani.orgüzerinden sunulan sürüme dahil edildiği düşünülüyor - Dağıtımların çoğu bu URL'yi kullandı ve indirilen sürümde kötü amaçlı kod içeren
build-to-host.m4dosyası yer aldı build-to-host.m4, derleme sırasında çalışıyor vebad-3-corrupt_lzma2.xziçindeki “bozuk” veriyitrile düzelttikten sonraxz -dile açıyor- Açma işleminin sonucunda daha sonra
/bin/bashile çalıştırılacak bir shell betiği bulunuyor
-
2. aşama: eklenmiş shell betiği
- Kötü amaçlı
.m4dosyasının eklediği betik, Linux makinede mi çalıştığını ve amaçlanan derleme sürecinin içinde mi yürütüldüğünü kontrol ediyor - Sonraki aşamanın yürütülmesi için
good-large_compressed.lzmakullanılıyor - Bu dosya XZ ile normal biçimde sıkıştırılmış olsa da, açılmış veri içinde çöp veri bulunuyor
- Betik, veriyi çıkarmak için
headpipeline'ınıevalile çalıştırıyor - Her
headkomutu ya sonraki 1024 baytı atlıyor ya da sonraki 2048 bayt ya da 724 baytı çıkarıyor - Toplam 33.492 bayt çıkarılıyor
tail, dosyanın son 31.265 baytını tutuyor ve kalanını yok sayıyor- Ardından
trile temel yer değiştirme uygulanarak obfuscation çözülüyor; ikinci XZ komutu dönüştürülmüş baytları rawlzmaakışı olarak açıyor ve sonucu shell'e iletiyor
- Kötü amaçlı
-
3. aşama: arka kapı nesnesinin çıkarılması
- Son aşamadaki shell betiği, beklenen ortamda çalışıp çalışmadığını görmek için çeşitli koşulları kontrol ediyor
- Projenin IFUNC kullanacak şekilde yapılandırılıp yapılandırılmadığını doğruluyor
- GCC ile derlenip derlenmediğini kontrol ediyor
- Ardından betiğin kullanacağı belirli dosyaların projede mevcut olup olmadığını doğruluyor
- Bu aşama,
good-large_compressed.lzmaiçindeki farklı bir offset'te gizlenmiş nesne dosyasını çıkarıyor - Çıkarma süreci, birden çok komutu sıralı biçimde çalıştırıyor ve her komutun çıktısını sonraki komutun girdisine veriyor
- XZ aracıyla
good-large_compressed.lzmaaçılıyor eval $ive birden çokheadçağrısı kullanılıyor- RC4'e benzeyen özel bir algoritma ile ikili veri çözümleniyor
- Çözülen sıkıştırılmış dosya tekrar XZ ile açılıyor
- Baş kısmındaki bazı baytlar kaldırıldıktan sonra sonuç
liblzma_la-crc64-fast.oolarak kaydediliyor - Son olarak betik,
liblzmaiçindekicrc_x86_clmul.hdosyasındais_arch_extension_supportedişlevini değiştiriyor __get_cpuidçağrısını_get_cpuidolarak değiştirerek tek bir alt çizgiyi kaldırıyor- Bu değişiklik, arka kapı nesnesinin kütüphaneye linklenmesini sağlıyor
İkili arka kapının yüklenme yöntemi
- XZ'nin özgün kodunda CRC hesaplaması için
lzma_crc32velzma_crc64adlı özel işlevler bulunuyor - Bu iki işlev, ELF sembol tablosunda GLIBC'nin IFUNC türü olarak saklanıyor
- IFUNC, dinamik bağlayıcının paylaşımlı kütüphane yüklenirken hangi işlevin kullanılacağını dinamik olarak seçmesini sağlıyor
- XZ, modern işlemci özellikleri olan CLMUL, SSSE3 ve SSE4.1'i kontrol edip optimize CRC işlevlerinin kullanılıp kullanılmayacağına karar vermek için bunu kullanıyor
- İşlemci özelliklerini kontrol etmek için
cpuidkomutu gerekiyor ve GLIBC'nin sağladığı__get_cpuidsarmalayıcısı çağrılıyor - Kötü amaçlı betik
__get_cpuidadını_get_cpuidolarak değiştirince, kod çağrısı arka kapı nesne dosyası içindeki_get_cpuidsembolüne bağlanıyor - İlk arka kapı kodu,
lzma_crc32velzma_crc64aynı değiştirilmiş_get_cpuidişlevini kullandığı için iki kez çağrılıyor- Daha önce çalışıp çalışmadığını anlamak için basit bir sayaç kullanılıyor
lzma_crc64IFUNC,_get_cpuidçağrısını yaptığında sayaç değeri 1 ise son giriş noktasına yönlendirme süreci başlıyor
Çalışma zamanı davranışı ve hook hedefleri
- Arka kapı, çalışan sürecin temel bilgilerini içeren yapılarını başlatıyor
- Hardcode edilmiş offset'lerle Global Offset Table(GOT) adresini buluyor ve içindeki
cpuidişaretçisini tespit ediyor - Ardından bu işaretçiyi ana kötü amaçlı işleve çevirerek sanki
cpuidçağrılıyormuş gibi kötü amaçlı işlevi çalıştırıyor - Ana hedef, enfekte makineye gelen bağlantıları izleyebilmek için belirli işlevleri hook'lamak
- Hedef alınan işlevler
libcryptoile ilişkiliRSA_public_decrypt: özel anahtarla imzalanmış şifreli metni çözmek için kullanılıyorEVP_PKEY_set1_RSA: belirli bir context için RSA anahtarını ayarlamakta kullanılıyor- Modern SSH sunucu sürümlerinde bulunmuyor, ancak bağımsız SSH anahtar üretim aracında kullanılıyor
RSA_get0_key: RSA anahtarını almakta kullanılıyor
- Hook süreci, çeşitli iç yapı erişimlerini ve süreç başına yapı manipülasyonunu gerektiriyor; kötü amaçlı kod buna ek olarak analizden kaçınma kontrolleri de yürütüyor
Çalışma ortamı kontrolleri ve analizden kaçınma teknikleri
-
sshdve kill switch kontrolü- Arka kapı önce sembol adreslerini dinamik olarak çözümleyen
ld-linuxdinamik bağlayıcısını parse ediyor - Mevcut çalışma ortamının ölçütlere uyup uymadığını kontrol ediyor
- Mevcut sürecin
/usr/bin/sshdolup olmadığını doğruluyor - Kill switch'in varlığını kontrol ediyor
- Geçerli süreç adı
argv[0]içinden çıkarılıyor - Tüm süreç ortam değişkenleri parse edilerek iç dizge tablosundaki değerlerle eşleşip eşleşmedikleri kontrol ediliyor
- Eşleşen bir ortam değişkeni varsa ya da süreç
sshddeğilse kötü amaçlı kod çalışmayı durduruyor - İç tablodaki tek değişken olan
yolAbejyiejuvnup=Evjtgvsh5okmkAvj, bu bağlamda kill switch görevi görüyor
- Arka kapı önce sembol adreslerini dinamik olarak çözümleyen
-
trie tabanlı dizge işleme
- Arka kapının ayırt edici özelliklerinden biri, dizge işlemleri için tek bir trie yapısı kullanması
- İşlev adı gibi sabitleri doğrudan karşılaştırmak ya da dizge hash'iyle kıyaslamak yerine, trie arama sonucunun belirli sabit değerle aynı olup olmadığına bakıyor
- ELF header magic değeri, trie içinde 0x300 döndürüyor
systemişlev adı 0x9F8 dönüş değeriyle eşleşiyor- Trie sadece karşılaştırma için değil, host binary içindeki dizgeleri bulmak için de kullanılıyor
- Örneğin
ssh-2.0gibi dizge işaretçisini kullanan işlevlerde, arka kapı gövdesinde şüpheli veri bırakmamak için dizge host binary içinde aranıyor - Uygulama 16 baytlık bitmask kullanıyor
- Her yarı,
0x00-0x3Fve0x40-0x7Fgiriş baytı aralıklarına karşılık geliyor - Trie yaprak düğümleri 2 bayt uzunluğunda; 3 bit bayrak olarak kullanılıyor, geri kalanı ise değer ya da sonraki düğüm konumu için ayrılıyor
Sembol çözümleme ve rtdl-audit hook'lama
-
sembol çözümleme rutinleri
- Arka kapıda ELF Symbol yapısını bulmak için en az 3 sembol çözümleme rutini bulunuyor
- Tüm sembol çözümleme işlevleri, trie içinde aranacak anahtarı girdi olarak alıyor
- Bu çözücülerden biri, tüm sembolleri dolaşarak istenen anahtara sahip sembolü buluyor ve bulduğunda
Elf64_Symyapısını döndürüyor - Bu yapı daha sonra arka kapının iç yapılarını doldurmak ve gerekli işlev işaretçilerini saklamak için kullanılıyor
- Bu süreç, Windows tehditlerinde sık görülen API hashing rutinlerine benziyor
- Arka kapı daha sonra şifreleme rutinlerinde kullanacağı çok sayıda OpenSSL
libcryptoişlevini arıyor - Bulup çözdüğü işlevlerin sayısını izliyor ve bu değeri normal çalışmaya devam edip etmeyeceğine ya da durup durmayacağına karar vermek için kullanıyor
-
lzma_allocüzerinden kötüye kullanılan sahte allocator- Bir başka sembol çözücü,
liblzma'nın kendi işlevi olanlzma_alloc'ı kötüye kullanıyor lzma_alloc, varsayılan allocatormallocya da özel bir allocator kullanarak belleğin verimli biçimde ayrılmasına yardımcı olan bir işlev- XZ arka kapısında bu işlev, sahte bir allocator aracılığıyla başka bir sembol çözücü gibi davranıyor
- Normalde “allocation size” olarak kullanılan parametre, aslında trie içindeki sembol anahtarı olarak kullanılıyor
- Bu numaranın amacı, arka kapı analizini zorlaştırmak
- Arka kapı çalışma sırasında sembolleri dinamik olarak çözüyor; tüm sembolleri bir kerede çözmekle ya da yalnızca ihtiyaç anında çözmekle sınırlı değil
- Çözülen semboller, normal OpenSSL işlevlerinden makinede komut çalıştıran
systemgibi işlevlere kadar uzanıyor
- Bir başka sembol çözücü,
-
rtdl-auditçalışma zamanı yaması- Arka kapı, işlev hook'lamak için dinamik bağlayıcının rtdl-audit özelliğini kullanıyor
- Normalde
rtdl-audit, geliştiricilerin özel paylaşımlı kütüphane yazarak sembol çözümleme gibi bağlayıcı olaylarına ilişkin bildirim almasını sağlayan bir özellik - XZ arka kapısı, ayrı bir paylaşımlı kütüphane yazmak yerine bellekte zaten kayıtlı olan varsayılan arayüzü çalışma zamanında yamalayarak sembol çözümleme rutinini ele geçiriyor
- Dinamik bağlayıcının bellek alanındaki
dl_auditglobal değişkeninde saklanan kötü amaçlıaudit_ifaceyapısı,symbind64callback adresini içeriyor - Dinamik bağlayıcı bu callback'i çağırdığında, tüm sembol bilgisi arka kapının kontrolüne geçiyor ve hedef işlevler için kötü amaçlı adres döndürülerek hook işlemi tamamlanıyor
dl_auditvedl_nauditadresleri,dl_mainvedl_audit_symbind_altişlevleri disassemble edilerek elde ediliyor- Arka kapıda komut çözümleme için dahili, minimal bir disassembler bulunuyor ve bu araç
*auditadresleri gibi belirli değerleri bulmak için geniş ölçüde kullanılıyor
Doğrulanan arka kapılı dağıtımlar ve tespit bilgileri
-
arka kapı içeren kaynak dağıtımları
- xz-5.6.0
- MD5:
c518d573a716b2b2bc2413e6c9b5dbde - SHA1:
e7bbec6f99b6b06c46420d4b6e5b6daa86948d3b - SHA256:
0f5c81f14171b74fcc9777d302304d964e63ffc2d7b634ef023a7249d9b5d875
- MD5:
- xz-5.6.1
- MD5:
5aeddab53ee2cbd694f901a080f84bf1 - SHA1:
675fd58f48dba5eceaf8bfc259d0ea1aab7ad0a7 - SHA256:
2398f4a8e53345325f44bdd9f0cc7401bd9025d736c6d43b372f4dea77bf75b8
- MD5:
- xz-5.6.0
-
analiz edilen başlıca artifact'ler
bad-3-corrupt_lzma2.xz:86fc2c94f8fa3938e3261d0b9eb4836be289f8aebuild-to-host.m4:b4dd2661a7c69e85f19216a6dbbb1664good-large_compressed.lzma:540c665dfcd4e5cfba5b72b4787fec4fliblzma_la-crc64-fast.o:212ffa0b24bb7d749532425a46764433
-
arka kapı içerdiği bilinen kütüphaneler
- Debian Sid
liblzma.so.5.6.0- MD5:
4f0cf1d2a2d44b75079b3ea5ed28fe54 - SHA1:
72e8163734d586b6360b24167a3aff2a3c961efb - SHA256:
319feb5a9cddd81955d915b5632b4a5f8f9080281fb46e2f6d69d53f693c23ae
- MD5:
- Debian Sid
liblzma.so.5.6.1- MD5:
53d82bb511b71a5d4794cf2d8a2072c1 - SHA1:
8a75968834fc11ba774d7bbdc566d272ff45476c - SHA256:
605861f833fc181c7cdcabd5577ddb8989bea332648a8f498b4eef89b8f85ad4
- MD5:
- Debian Sid
-
tespit adları
- Kaspersky ürünleri, saldırıyla ilişkili kötü amaçlı nesneleri HEUR:Trojan.Script.XZ ve Trojan.Shell.XZ olarak tespit ediyor
- Kaspersky Endpoint Security for Linux, Critical Areas Scan görevinin bir parçası olarak SSHD süreç belleğindeki kötü amaçlı kodu MEM:Trojan.Linux.XZ olarak tespit ediyor
- Sağlanan Yara kuralı, CVE-2024-3094 ile ilişkili kötü amaçlı
get_cpuidişlevini bulmak içinliblzma_get_cpuid_functionkuralıdır
1 yorum
Hacker News görüşleri
Bu cümlenin gerçekte yaşananları olduğundan küçük gösterdiğini düşünüyorum.
Arka kapının teknik yönlerinden daha korkutucu olan şey, sosyal mühendisliğin miktarı ve seviyesi. Arka kapı nihai üründü; bunun yerleştirilebilmesini sağlayan şey ise o noktada xz projesinin tamamının zaten uzun süredir kötü niyetli aktörlerin, yani “Jia Tan”ın ve çevresindekilerin kontrolüne geçmiş olmasıydı. Bakım sorumlusuna karşı bir yıldan uzun süre psikolojik savaş yürüttüler ve ne bakım sorumlusu ne de başka biri bunu fark etti.
Casus romanı gibi bir olay; böyle bir şey mümkünse, şu anda başka projelerde daha neler oluyor diye merak ediyorum.
Arka kapı kodunun kendisinde de aynı düşünce tarzı görülüyor. Yalnızca zararsız görünmeye çalışmakla kalmıyor; commit mesajları, yorumlar, değişken adları, komut seçimleri vb. üzerinden dışarıdan bakıldığında ne yaptığına dair aktif biçimde bir anlatı kuruyor, gerçekte ise tamamen farklı bir şey yapacak şekilde tasarlanmış. Kodu ilk inceleyen kişinin önce kendi anlayışından şüphe etmesine, sonra bir bug’dan şüphelenmesine, ancak epey sonra kötü niyetten şüphelenmesine yol açan bir yapı.
Umarım hangi istihbarat kurumları varsa bu olayı daha derinlemesine araştırıyordur.
Arka kapılarla ilgili her HN başlığında bu olasılığın paranoya ya da alüminyum folyo şapka muamelesi görerek reddedilmesini görmek sinir bozucu. Sanki hiç yaşanmayan bir şeymiş gibi davranılıyor; oysa bu sefer yakalanmış somut bir örnekten ibaret, yakalanmamış olanlar ise sayısız.
Bu olay açık kaynak bir proje olduğu için keşfedilmesi nispeten daha kolaydı, buna rağmen şansımız yaver gitti. Şimdi kapalı kaynak ürünleri düşünün: arka kapı yerleştirmek, bir kuruluşa sızma ya da onu baskı altına alma meselesine indirgeniyor. Böyle şeyler sık sık olur. Kimse inanmak istemez ama yaygındır. Teknik altyapı şirketlerinde çalışmış kişilerin anlatacak birkaç hikâyesi vardır. NDA’ler ya da daha ağır sebepler yüzünden anlatmak zordur ama gerçekten olur.
Bu, birinin takıntısının ürünü olabilir; ya da bu tür işleri birden çok proje üzerinde 9’dan 5’e mesai gibi yürüten özel bir güvenlik şirketinin veya devlet aktörünün işi olabilir.
Şimdiye kadar ilginin arka kapının çalışmayı başarıp hedeflerine nasıl ulaştığına odaklanması doğal.
Yine de hatalara ve aşırı tasarlanmış kısımlara dair daha derin bir analiz de görmek isterim. Bryan Cantril röportajında [1] Andrés, bunun dağıtım biçimini bile mutlaka bilerek hazırlanmış bir şey değil, hazır arka kapı bileşeni gibi durduğunu ve bu yüzden birçok aptalca yanı olduğunu söylüyor. Örneğin kendisini araştırmaya yönelten sembol tablosu sorgusu böyleydi.
Benzer şekilde, neden RC4 ile 48 baytın kesilip çıkarıldığını da merak ediyorum [2].
Daha fazla zamanları ya da daha iyi bir ekipleri olsaydı bunu nasıl daha iyi yapabilecekleri veya nerede daha büyük hata yaptıkları hakkında bir şeyler duymak isterim.
[1] https://youtu.be/jg5F9UupL6I?si=gvXsYFXgagkGOMd4
[2] https://twitter.com/matthew_d_green/status/17744729080201014...
Doğru anladıysam, işe yarar bir sertleştirme önlemi her dinamik bağlantılı kütüphanenin kendi GOT’una sahip olmasını sağlamak ve dinamik bağlama bittikten sonra tabloyu salt okunur olarak işaretlemek olabilir. Yani dinamik sınırın ötesinden diğer taraftaki ifunc girdilerinin yamalanmasını engellemek.
Bu, bir yerlere bağlanan ama çalıştırılmayan kodun tedarik zinciri güvenliğini iyileştirebilir.
Daha da ileri gidip ifunc’ı bildirime dayalı bir şekilde uygulamak, böylece bağlanan her kütüphanede keyfî kod yürütülmesine yol açmamak daha iyi olabilir. Geriye dönük uyumluluk nedeniyle bunu bugün uygulamak zor olurdu ama uzun vadede katmanlı şekilde devreye alınabilir gibi görünüyor. Örneğin bir kütüphane “bildirime dayalı link ifunc” özellik bitiyle derlenirse, dinamik linker bağlı tüm kütüphanelerde aynı özellik bayrağı yoksa çalıştırmayı başarısız kılabilir.
Günümüzde çoğu kütüphane derlemesi, Turing-tam bir ortam gerektiren son derece karmaşık ve anlaşılması güç betiklerin çalıştırılmasıyla yapılıyor. Bu, saldırgana sonsuz bir saldırı yüzeyi veriyor ve derleme süreci ele geçirilirse fırsat doğuyor.
Yürütücünün yalnızca sınırlı bir durum makinesi olduğu bildirime dayalı derleme süreçlerine geçmek yardımcı olur. Tüm kaynak parçalarının yeniden üretilebilir olması şartını da düşünmeye değer.
O noktadan sonra tüm savunmalar etkisiz kalır. İsterse GOT’u yeniden yazılabilir olarak eşleyebilir; böyle bir davranış “şüpheli” diye tespit edilebilse ya da işletim sistemi bu geçişi engelleyebilse bile, enjekte edilmiş kod kontrol akışını yüzlerce farklı yolla tersine çevirebilir. Keyfî okuma/yazma, kod yürütme, her şey mümkündür. Bu aşamadaki bir ihlali engelleyecek güvenlik hafifletmesi yoktur. İsterse özel anahtarı sızdırıp doğrudan saldırgana gönderebilir ya da bir shell açabilir. Bu aşamada koruma tasarlamaya çalışmak boşuna.
Doğru fonksiyon işaretçisi ilk çağrıldığında yüklenir ve stub yerine tabloya eklenir; bu an keyfî derecede uzak bir gelecek olabilir. Nitekim gtk uygulamaları gibi büyük kütüphane ekosistemlerinde bağlı fonksiyonların çoğu hiç çağrılmaz.
-march=nativeile derlemek yaygındır ve glibc’nin USE bayraklarında-multiarchayarlamak ifunc’ı devre dışı bırakmayı kolaylaştırır. Olumsuz bir etki görmedim.İlk 3 aşama açısından bu yazı, son 2 haftada bilinenlere çok fazla bir şey eklemiyor. Akış şeması olan iyi bir derleme yazısı sayılır.
Ancak ikili dosyayı bu kadar ayrıntılı analiz eden kısım yeni görünüyor.
Orada yer alan kaynak kod nasıl oluşturulmuş olabilir? Disassembler çalıştırıp kodun ne yaptığını anladıktan sonra tüm adları açıklayıcı adlarla mı değiştirdiler? 2 haftada yapılmış bir iş için oldukça büyük bir başarı gibi görünüyor.
Global Research & Analysis Team, Kaspersky Lab
https://securelist.com/author/great/
Yazının yazarı Kaspersky Lab’in zararlı yazılım analiz ekibi gibi göründüğünden, ikili dosya tersine mühendisliğinde epey iyi olma ihtimalleri yüksek.
https://hex-rays.com/ida-pro/
Asıl merak ettiğim şey, xz incelemesini tetikleyen SSH başlangıç gecikmesinin tam olarak neyden kaynaklandığı. Bunu ortaya çıkaran oldu mu?
Kodu tersine mühendislik edenlere göre komut mesajının SSH host anahtarıyla da ilişkilendirilmesi gerekiyormuş. Bu yüzden host anahtarı RSA anahtarıysa, her bağlantıda ek bir RSA şifre çözme işlemi de yapmış olabilir.
Bu, gecikmenin nedeni olmaya yeterli gibi görünüyor.
Dışarıdan, önce kod enjeksiyonu denemeden sunucunun enfekte olup olmadığını anlamanın kolay bir yolu.
Yazarlar glibc iç yapısını çok derinlemesine biliyor. Kaynak kodun içine boynunuza kadar gömülmeden bilinmeyecek türden şeyler ve birçok yeni teknik var.
Özel ELF parser’ı ve disassembler o kadar karmaşık ki, bu kodun geçmişte başka bir yerde kullanılmadığını ya da gelecekte tekrar kullanılmayacağını hayal etmek zor.
Bu olayın hak ettiği düzeyde ciddi bir soruşturma görüp görmeyeceğini merak ediyorum, ama pek öyle olacak gibi durmuyor.
Sonuçta bu işi görünür kılan Valgrind hatasına ve SSH yavaşlamasına yol açan backdoor bug’ını analiz eden oldu mu?
Valgrind “düzeltmesi” ifunc’ı devre dışı bırakmaktı; bunun sonucunda backdoor devre dışı kaldı ve hata ortadan kalktı.
Yavaşlama, bildiğim kadarıyla backdoor’un yaptığı tüm sembol ve komut aramalarından kaynaklanıyordu.
Tersinden bakarsak, saldırganın script ve kodlarda tespitten kaçınmak için harcadığı çabayı düşününce, tüm bu proje dikkat dağıtma amaçlı olabilir ya da aynı anda birden fazla deneme yürütülürken bir yedek plan olabilir.
Böyle şeylerden bir adım önde olmak için ne yapmak gerekir? Topluluğun SSHD’ye odaklanması, sistemin genelindeki başka bölümleri etkiler mi? Başka teknik ya da sosyal yönleri?
Alüminyum folyo şapka eğlenceli.
Ya da Microsoft gibi bir yerden kapalı kaynak satın alıp, kodu daha sıkı inceleyecek kaynakları ve iradeleri olmasını umabilirsiniz.
Ayrıca garip ağ etkinliğini ve yetki yükseltme girişimlerini tespit edecek iyi bir güvenlik operasyonları ekibine sahip olma yaklaşımı da her zaman var.
Sadece, üzerinde çalıştığı proje dışında geçmişi ya da izi olmayan katkıcılar bundan sonra tehlike işareti olarak görülmeli.
Eski gruplardan GOBBLES, ADM, ac1db1tch3z, ~el8 de bunları yapıyordu; isec.pl gibi özel sektör “güvenlik araştırmacıları” da yaptı.
Bu sefer sorun olan, devlet aktörlerinin temel projeleri düşük ücretle ayakta tutan şirket kapitalizmi dönemini istismar ediyor olması. Kötü niyetli aktörlerin hedeflerine ulaşmak için kaynakları fiilen sınırsız.
Bu da sonuçta NSO, Zerodium gibi organizasyonlara yönelik talebi ve bu organizasyonların doğuşunu yaratmış oldu.
Ondan önce exploit ve backdoor’ların değeri neredeyse yoktu; hacker’lar Qualys gibi şirketlerden sponsorluk ya da işe alım bekliyordu.
Google’ın sıfır gün açıklarına yönelik hack analizlerini birkaç kez gördüm; onlar da gerçek dışı derecede etkileyiciydi, ama bu hack tarihin en büyüklerinden biri olacak gibi.
xz deposunun GitHub’a yeniden yüklendiğini gördüm; Lasse ve yeni bir katkıcı temizlik yapıyordu. ifunc desteğini kaldırmışlar ve blob olmadan test dosyaları üretilebilsin diye test dosyası üretme kodunu depoya commit etmişler. Doğru yönde çalışıyorlar gibi görünüyor.