- xz arka kapısına ilişkin tersine mühendislik ön analizine göre bu davranış basit bir kimlik doğrulama atlatması değil, uzaktan kod çalıştırmaya (RCE) daha yakın
- Hook'lanmış
RSA_public_decryptiçinde sunucu host key imzasının sabit birEd448anahtarıyla doğrulandığı akış temel unsur olarak öne çıkıyor - İmza doğrulamasını geçerse payload
system()fonksiyonuna iletilip çalıştırılabiliyor - Analiz, izin alınarak paylaşılan ön bulgulara dayanıyor; Bluesky gönderisi alıntı gönderiler veya gömülü içerikler içeriyor
- Arka kapı geçitli ve yeniden oynatılamaz olarak özetleniyor; bu nedenle aynı girdinin basitçe tekrar kullanıldığı saldırılardan farklı değerlendirilmesi gerekiyor
xz arka kapısının yürütme akışı
- İzin alınarak paylaşılan tersine mühendislik ön analizi, hook'lanmış
RSA_public_decryptüzerine odaklanıyor- Sunucunun host key için imzasını sabit bir
Ed448anahtarıyla doğruluyor - Doğrulamadan sonra payload
system()fonksiyonuna iletiyor
- Sunucunun host key için imzasını sabit bir
Sınıflandırma ve kısıtlar
- Bu davranış, kimlik doğrulama atlatması değil uzaktan kod çalıştırma (RCE) olarak sınıflandırılıyor
- Arka kapı, gated/unreplayable özelliklerine sahip olarak özetleniyor
- Orijinal Bluesky gönderisi alıntı gönderiler veya başka gömülü içerikler içeriyor
1 yorum
Hacker News görüşleri
Bu konuya dair ek tersine mühendislik sonuçları var. Backdoor’un dizgeleri gizlemek için kullandığı prefix trie’dan çıkarılmış sembol yeniden eşleme bilgilerini içeriyor ve tersine mühendislik/analizin kendisinden de saklanmaya çalışmış gibi görünüyor
https://gist.github.com/smx-smx/a6112d54777845d389bd7126d6e9...
Çözümlenmiş dizgelerin tam listesi burada
https://gist.github.com/q3k/af3d93b6a1f399de28fe194add452d01
OpenSSL’in iç yapısına çok hâkim olmayan biri olarak bakınca, N değerinin
rsa_stiçindekinalanından alındığı anlaşılıyorhttps://github.com/openssl/openssl/blob/56e63f570bd5a479439b...
Bu değer bir
BIGNUMve değişken uzunluklu bir tip gibi görünüyorhttps://github.com/openssl/openssl/blob/56e63f570bd5a479439b...
Backdoor, uzaktaki saldırgandan gelen sertifikadan bu değeri çıkarıp ChaCha20 ile çözmeyi deniyor; başarılı olursa sonucu
system()’e veriyor.system(), mevcut sürecin çalıştığı kullanıcı yetkileriyle tek satırlık bir shell script’i çalıştıran basit bir sarmalayıcıya yakınDoğru anladıysam bu, açık anahtar atlatmadan daha kötü. Açık anahtar atlatma olsaydı, teoride yalnızca oturum açmaya çalışan kullanıcının yetkileri elde edilirdi ve sıkılaştırılmış SSH yapılandırmalarında root girişinin engellenmiş olma ihtimali yüksekti
Ama bu,
sshdsürecinin kendi bağlamında uzaktan kod çalıştırma olduğu için, root olarak çalışan birsshdise payload da root olarak çalıştırılabilir. Yaygın bir uzaktan kod çalıştırma olarak pratikte neredeyse en kötü senaryoya yakınBu backdoor performans sorunu yüzünden bulunmasaydı, daha sonra bulunma olasılığının ne kadar olduğunu merak ediyorum. Performans sorununu koddaki bir hata/düzeltilebilir kusur olarak anlamıştım; bunu yakalayabilecek araçların olup olmadığı da önemli
Bu tür sorular, bu tip backdoor’ların ilk kez mi görüldüğünü yoksa yalnızca ilk kez mi ortaya çıkarıldığını anlamak açısından çok ilgili
Küçük bir hata her şeyi yıkabilir; bazen tek bir cümle bile zincirleme reaksiyon başlatıp incelikle kurulmuş bir planı ortaya çıkarır
Ceza soruşturmaları her gün böyle yürür. Polis işinde kaynak kısıtları vardır, ama yazılıma her gün hobi olarak analiz yapanlar, bunu hobi gibi sürekli yapan uzmanlar ve meslek olarak yapan uzmanlar bakar
Sonunda bir gün bulunma olasılığı yüksekti
XZ saldırısı çok iyi yürütülmüş ve neredeyse bir başyapıt. Bir devlet kurumunun dâhil olmuş olmasına şaşırmam. Ama aynı zamanda inanılmaz şanslıydı. Şu anda sorun olarak işaretlenen şeylerden biri bile bulunmuş olsaydı, yalnızca ben değil birçok meslektaşım da uzun bir takibe girerdi
Çıkarılabilecek sonuçlardan biri şu: xz/liblzma açık kaynak olmasaydı böyle bir sorunu bulmak imkânsız olurdu. Elbette açık kaynak olduğu için en başta mümkün hale gelmiş bir yanı da var; ama bunun Windows ya da MacOS’un içinde olduğunu hayal edin
Ancak kullanmazsanız amacınıza ulaşamazsınız. Ne kadar çok kullanılırsa ileride tespit edilme olasılığı da o kadar artar. SolarWinds ile karşılaştırılabilir
Kişisel olarak
system()çağrısı biraz özensizdi ve bir ikili işlev tarayıcısının o yolu potansiyel olarak bulabileceğini düşünüyorumsshdyaması kabul edilebilir bir aşama olan linkleme zamanında gerçekleşiyor; bu analiz doğruysa bu bir master key backdoor’u da değil, dolayısıyla tipik oturum açma denetim izleri yok. Ayrıcasshd’nin başka süreçler başlatması başlı başına elbette izin verilebilir bir şeyÇok sıkı bir SELinux politikası,
sshd’nin shell dışında bir şey çalıştırmasını yakalayabilir; ama bu düzeyde sıkılaştırma çok nadirdirHedefin dışından keşfetme meselesi de zaten bir bakıma denenmiş oldu. Birçok kişi payload’a
valgrindvb. ile baktı ama göremedi. Debug ortamında bulunmamak için de oldukça iyi korunmuş. Çünkü payload’ın altındaki görünür altyapı ASan gibi araçlarla uyumlu değilLinklense bile kod
main()’den çok önce çalıştığı için, debugger ileliblzmaçevresini kurcalasanız da genelde çalıştığı anı gözlemleyemezsinizstraceolsaydı süreç oluşturulduktan sonraki tüm sistem çağrılarını ve linker davranışını görebilirdi. Ancak şu ana kadar anlaşıldığı kadarıyla payload bu aşamada etkinleşip etkinleşmeyeceğine karar vermek için sistem çağrısı yapmıyor;argv,environvb. şeylere bakıyor gibi görünüyor[0] https://en.wikipedia.org/wiki/PWB/UNIX
[1] https://news.ycombinator.com/item?id=38020792
İkili payload içinde kodlanmış bir dize var gibi görünüyor
https://gist.github.com/q3k/af3d93b6a1f399de28fe194add452d01...
Bu dize bir kill switch olarak çalışıyor
https://piaille.fr/@zeno/112185928685603910
Eğer gerçekten öyleyse, azaltma yöntemlerinden biri şu olabilir
-aeklenmeli. Aksi halde environment dosyasını silebilirsiniz. Ayrıca genel olarak doğru olan, kötü amaçlı kod içermeyen bir sürüme yükseltip yeniden başlatmaktırBackdoor’un tam olarak ne yaptığını kısaca açıklayabilir misiniz? Bunu henüz biliyor muyuz? Backdoor’un kendisi payload değil gibi; kötü amaçlı bir sıkıştırılmış dosya mı gerekiyor, yoksa
sshdsürecine hook atıp uzaktaki saldırganın kötü amaçlı paketlerini mi dinliyor, merak ediyorumOrijinal metin, saldırganın SSH oturumunun kimlik doğrulama öncesi aşamasında kötü amaçlı payload gönderebildiği izlenimi veriyor; ama exploit’in neden hiçbir zaman ortaya çıkmayabileceğini de anlamıyorum. Kod reverse engineering ile çözülebiliyorsa bir proof of concept de yazılabilir değil mi?
Sonuçta saldırgan bu backdoor’a sahip bir makineyi nasıl kontrol ediyor?
Buradaki durum da benzer. xz şüpheli bir şey yapmadan önce bazı verileri çözmeyi deniyor. Asimetrik bir yöntem olduğu için gizli şifreleme anahtarını vermeden de çözme doğrulaması yapılabiliyor. Çünkü karşılık gelen açık anahtara sahip
Gizli anahtarı bulmak pratikte imkânsız olduğundan ve payload’un şifresi çözülemezse belirgin biçimde farklı davranmadığından, exploit kodu hiçbir zaman yayımlanmayabilir. Exploit kodu oluşturmanın tek yolu gizli anahtarın bir şekilde bulunması; pratikte de bu ancak backdoor geliştiricisinin sızdırmasıyla mümkün
sshdbaşlarkenlibsystemd’yi yüklüyor, o da hack kodunu içeren XZ kütüphanesini yüklüyorXZ kütüphanesi, RSA imzalarını doğrulayan OpenSSL fonksiyonlarının kendi sürümlerini enjekte ediyor
Biri SSH’ye giriş yaparken kimlik doğrulama için imzalı bir SSH sertifikası sunduğunda, bu değiştirilmiş fonksiyonlar çağrılıyor
Sertifika, normal giriş sürecinde kullanıcı adı veya rol gibi assertion bilgileri içerebilir ve bu bilgiler, sertifikanın belirli bir kullanıcı girişinde geçerli olup olmadığını belirlemeye yarar. Ancak değiştirilmiş fonksiyon, belirli bir saldırgan anahtarıyla imzalanmış bir sertifika algılarsa, sertifikanın bazı alt alanlarını çıkarıp sistem komutu olarak çalıştırıyor. Çalışma bağlamı
sshd, yani root kullanıcısıNe yazık ki saldırganın imzalama anahtarını bilmiyoruz; yalnızca hack kodunun doğrulamada kullandığı açık anahtarı biliyoruz. Temelde saldırgan, enfekte sistemde root olarak keyfi komut çalıştırma imkânına sahip ve geride en fazla başarısız bir giriş denemesi kadar iz kalır. İnternete açık sistemlerde bu tür denemeler zaten çok olur
Kritik nokta, saldırganın anahtar imzasının gerekli olması. O anahtar sızmadıkça veya RSA algoritması kırılmadıkça, başka araştırmacıların ya da üçüncü tarafların bu backdoor’u kötüye kullanması imkânsız. RSA kırılırsa bundan çok daha büyük sorunlarımız olur
Şu an için exploit’i yalnızca saldırgan çalıştırabildiğinden tarama yapmak da imkânsız. Performans düşüşü gibi ikincil etkiler dışında tespit edilmesi zor; nitekim gerçekten de böyle fark edildi
Bu kadar çok Linux sunucusunun her gün kullandığı kritik bir paketin, finansman eksikliği yüzünden asıl yazar tarafından sürdürülemez hâle gelmesini anlamak zor. Açık kaynakta bir şeylerin değişmesi gerekiyor
Çözümlerden biri, belirli bir ölçeğin üzerindeki şirket veya işletmelere bakım maliyeti ödemeyi zorunlu kılan bir lisans olabilir
Dolayısıyla satıcının açık kaynağı güvenli tutmak için motivasyonu oluşuyor. Bakımcıya para vermek, kod denetimi yaptırmak veya katkı sağlaması için tam zamanlı birini işe almak gibi
Şu anda xz deposuna girince GitHub kullanım şartlarını ihlal ettiği için devre dışı bırakılmış görünüyor. Devre dışı bırakılması kendi başına anlaşılır, ama GitHub’ın kodu ve geçmişi bırakıp bir banner göstermesini, yalnızca kötüye kullanılabilecek özellikleri kapatmasını isterdim
Böylece araştırmacılar ve diğer insanlar exploit’ten ders çıkarabilir. Daha önemsiz bir durumda bir kütüphane kötü amaçlı kod barındırdığı için deposu kaldırılmışsa, insanlar bunu sadece önemsiz bir şey diye geçiştirebilir
Kaynak koduyla ilgileniyorsanız bulması kolay. Bu kod ve Git deposu, dünyanın dört bir yanındaki çeşitli Git depolarına bağlı ve sürümlerde de kaynak birkaç kez paketlenmiş durumda
Pek bilinmeyen bir açık kaynak oyunun fiilî bakımcısı olarak, geliştiricilerin gelip gittiğini gördüm. Değerli katkıların hepsini olduğu gibi birleştiriyorum.
Bazı işbirlikçiler, çeşitli kodlama stilleriyle C ve C++’ın birbirine karıştığı bir ortamda özelliklerin epey derinine iniyor. Uygulama ayrıntılarının tamamını her zaman kavrayamıyorum ama aklımın bir köşesinde, biri gerçekten kötü bir arka kapı koyarsa projenin biteceği düşüncesi var.
Neyse ki oyun çok obscure ve saldırı yüzeyi de çok küçük. Yine de iyi niyetle Windows ikili dosyalarını imzalama hevesimi durdurdu.
Bu xz arka kapısı gerçekten devasa bir kâbus; asıl geliştiriciler ve buna karışan herkes adına üzülüyorum.
Orman yolunda yürürken geçen bir araba sizi öylece ezip geçebilir. Sürücünün yakalanmama ihtimali yüksektir, bunu engellemenin yolu yoktur ve polis de yanınızda değildir. Yazılım arka kapılarından çok daha korkutucu olan bu senaryo, aslında bir şeyler yaparak yaşayabilmek için kabul etmek zorunda olduğumuz asgari risklerden biridir. Gerçekte böyle şeyler de olur.
Ama sonuçta insanların büyük çoğunluğu başkalarına aktif olarak zarar vermeye çalışmaz. İnsanın yaptığı her şey hep bu varsayım üzerine kuruluydu ve hâlâ öyle.
Kod incelemelerini biraz daha sıkılaştırmanın, linter’ları, CI’ı ve örüntü eşleştirmeyi daha çok kullanmanın, kod imzalamayı daha yaygınlaştırmanın ve insanların kimliklerini doğrulamanın bu tür olayları engelleyeceği yanılsaması asıl sorun. Bu, dünyayı her ayrıntı düzeyinde yönetip kontrol edebileceğimiz ve etmemiz gerektiği yönündeki Silicon Valley tarzı sanrının bir belirtisi. Böyle “tedaviler”, engellemeye çalıştıkları hastalıktan çok daha kötü olabilir.
[1]: http://hintjens.com/blog:106
Katkıcıların projeye keyifle katıldığı bir topluluk oluşturmanın avantajını anlıyorum. Ama bu, projeyi net bir vizyon ya da yön olmadan büyütüyor ve sonunda başkalarının katkılarını ortak bir standarda uydurmak için bakımcıya aşırı yük bindiren bir yöntem gibi gelmişti.
Gerçek kod incelemesi gelecekte belirsiz bir zamana erteleniyor; o zaman incelemenin titiz olup olmayacağı, kimin sorumluluk alıp bunu yapacağı ya da sorunları düzelteceği de belirsiz. Sonuçta kullanıcılara ne dağıtıldığını kontrol edemeyen bir kaos reçetesi gibi geliyor.
Kötü amaçlı kod dağıtımı sorunu da var. İlgili blog yazısının yorumlarında da bu konu geçiyor ve Pieter, xz vakasıyla birebir aynı senaryoyu anlatıyor.
“Mallory’nin sabırlı ve aldatıcı olduğunu, yeterince uzun süre geçerli bir katkıcı gibi davranarak projenin kontrolünü ele geçirdiğini ve ardından yavaş yavaş arka kapı yerleştirdiğini varsayalım. O zaman dikkatli kod incelemesi de yardımcı olmaz. Mallory’nin bakımcı olacak kadar güven kazanması yeterlidir; bu, mümkün olup olmama değil, yöntem meselesidir.”
Kendisi “en iyi savunma topluluğun büyüklüğü ve çeşitliliğidir” sonucuna varıyor.
Ama dikkatli kod incelemesinin bu tür olayların gerçekleşme olasılığını gerçekten azaltabileceğini düşünüyorum. İster güvenilir katkıcıdan ister dışarıdan gelsin, tüm katkıları titizlikle incelerseniz garip davranışları veya “A yapıyor” denip gerçekte B yapan commit’leri daha erken yakalama olasılığı artar.
Optimistic Merging’in daha büyük ve daha çeşitli bir topluluğa yol açıp açmadığı da tartışmalı. Katı katkı yönergelerine sahip olup da aktif toplulukları olan pek çok proje var. Ayrıca kötü amaçlı yamaların ne zaman ve nasıl yakalanacağına yanıt vermiyor.
xz’deki sorun küçük bir topluluk değil, topluluğun hiç olmamasıydı. Tek bir kötü niyetli aktör projenin kontrolünü ele geçirdi ve neredeyse hiç kimsenin denetimi yoktu. Katkı yönergeleri topluluk büyüklüğünde bir etken değildi; Optimistic Merging kullanılmış olsun ya da olmasın bu olay yaşanacaktı.
[2]: http://hintjens.com/blog:106/comments/show#post-2409627
brew install caskya da vi/emacs/vscode eklentileri kurulduğunu görmek beni hep şaşırtıyor.Rust, varsayılanları en güvenli olan programlama dili/topluluk olarak görülebilir; işaretçi numaralarına neredeyse izin vermeyecek düzeyde güvenlik öncelikli bir tasarıma sahip. Ama en yaygın ve önerilen kurulum yolu şöyle; ben de tam bir ikiyüzlü olarak sık sık böyle yapıyorum.
https://www.rust-lang.org/tools/install
Bu sadece bir örnek. “Bunu
curlile çekipsh’e pipe et” diyerek uzaktan kod çalıştırmayı kendi kendimize açarken, aynı anda birininunsafebloğu üzerine tartışma alışkanlığı çok fazla insanda kas hafızasına dönüşmüş durumda.Böyle bir şeyin yaşanması üzücü ama şaşırtıcı değil. Bu tür kötü niyetli aktörlere karşı daha iyi araçların, üstelik açık kaynak olarak, ortaya çıkmasını umuyorum.
Bu arka kapının ortaya attığı sorular var. Aynı ekip ya da benzer bir ekip tarafından yerleştirilmiş başka hangi arka kapılar var? Bu tür ekiplerden kaç tanesi faal? Bu tür sızma saldırılarına açık bağımlılık sayısı ne kadar? Sektörümüzde bu tür gizli operasyonların hedef alabileceği saldırı yüzeyi ne kadar geniş?
apache httpd,postgres,mysql,nginx,openssh,dropbear ssh,haproxy,varnish,caddy,squid,postfixgibi başlıca ağ servislerinin, bunların tüm bağımlılıklarının ve o bağımlılıkların tüm committer grafiklerinin çıkarılması; nerelerin en yüksek değere sahip olup en az izlendiğini anlamak için ilk adım olabilir.Bu, birinin böyle bir şeyi denediği ilk örnek olamaz. Yalnızca başarısız olup açığa çıkan ilk örnek. Linux çekirdeğine yönelik denenip yakalanmış arka kapıları biliyoruz, ama bu uzaktan yapılan bir saldırı ve tamamen farklı nitelikte.
Neden tespit edilse bile bir hata gibi görünebilecek masum görünümlü bir şey dağıtmak yerine, tam işlevli bir arka kapı uygulayıp dağıtım yöntemini de gizlemeye çalıştılar?
Bunlar bilinçli kararlar olmalı. Bunun nedeni, hedefin ne olduğuna dair ipucu verebilir.
Bu, exploit’i uzaktan taramak için elimizde olmayan saldırganın özel anahtarına ihtiyaç olduğu anlamına geliyor gibi. Diğer tek seçenek, yerelde tespit betiği çalıştırmak.
Bu sorunun gerçek sistemlerde geniş ölçekte yayıldığı ortaya çıkmadıkça, böyle bir yaklaşım; geçmişte benzer “uzmanların” her yıl parola değiştirilmesini isteyip gerçek güvenliği düşürürken kâğıt üzerinde güvenliği daha iyi gösterdiği olaydan bile daha kötü görünüyor.
Arka kapının imza doğrulaması yaklaşık 100µs sürecektir; dolayısıyla parmak izi eşleşen anahtarların işlenmesi, eşleşmeyenlere göre bu kadar daha uzun sürmeli. Bu zaman farkı en azından LAN üzerinde gerçekçi biçimde tespit edilebilir; tarayıcı hedefe yakın bir konumdan çalıştırılıyorsa internet üzerinden de mümkün olabilir.
Tekrarlanan kimlik doğrulama hatalarından sonra istemci IP’sini engelleyen sistemlerde tarama daha zor olacaktır.
(https://bench.cr.yp.to/results-sign.html Ed448 doğrulamasını yaklaşık 400 bin çevrim olarak gösteriyor; 4GHz’de bu 100µs’ye karşılık gelir.)
sshd’nin bir challenge verdiği ve saldırganın bunu imzalaması gereken bir yapı mı var?Popüler olmayan bir görüş olabilir ama tüm operasyona hayranlık duymamak elde değil. Elbette kınıyorum, ama yine de hayran kalıyorum. Fikirden uygulamaya kadar gerçekten bir sanat eseri gibiydi ve bu kadar erken yakalanması büyük bir şanstı.
Bir dahaki sefere saldırganların, insanın beklediği işlemlerde tuhaf gecikme sıçramaları oluşturmayan bir payload geliştirmesi muhtemel.
Nedense Kim Dotcom’un yasa dışı dinleme hedefi olduğunu fark etmesi aklıma geliyor. Bunun nedeni MW3’te ping’inin aniden çok yükselmesiydi. Araştırınca yalnızca kendi paketlerinin fiziksel olarak çok uzaktaki GCSB ofisinden geçirilerek yönlendirildiği ortaya çıkmıştı. GCSB’nin Yeni Zelanda’da süresiz oturum hakkına sahip kişileri dinleme yetkisi yok. Sonunda Yeni Zelanda başbakanından kişisel bir özür almıştı.
Bence en dahice kısım, sızılacak projenin seçimiydi. Geriye dönüp “Hans”ın IFUNC pull request tartışmasını okumak insanın içini acıtıyor, ama bu projenin neden seçildiğini gerçekten çok iyi gösteriyor.
“Jia” ve “Hans”ın arkasında kaç kişi olduğunu, iletişimi ve kod katkılarını nasıl analiz edip stratejiye döktüklerini bilmek isterdim. Mail listesinde baskı kuruyormuş gibi görünen üçüncü kişilikler gibi bazı yönler biraz özensiz kurgulanmış görünüyor.
Bu yüzden hâlâ sofistike küçük bir ekip, hatta tek bir kişi tarafından yapılmış olma ihtimali de var. Bir devlet aktörü olsaydı, böyle bir operasyon için bütün gün sahte kişilikler oluşturup sürdüren insanların bulunacağını düşünürdüm.
Birisi “Bu üç kullanıcının biraz kaba biçimde bastırması tuhaf, bunlar kim? Hesapların hepsi aynı dönemlerde oluşturulmuş. Şüpheli. Neden biri sahte hesaplarla bunu bu kadar ısrarla zorlasın? Araştırmalıyım” diye düşünseydi işleri zorlaşırdı. Toplam harcanan çabaya kıyasla o kısım dikkatsiz, kötü planlanmış ya da bütçesi yetersizdi.
Dramatik bir varsayım eklersek, saldırgan patlatacağı bilgi nükleer bombasından korkup kasıtlı olarak işi bozmuş da olabilir.
Nihai sonucu tiksintiyle karşılarken saldırının karmaşıklığını da kabul edebiliriz.