Xzbot: Catatan, honeypot, dan demo exploit untuk backdoor xz
(github.com/amlweems)- xzbot adalah repositori untuk mengeksplorasi backdoor xz (CVE-2024-3094), yang menyediakan honeypot, patch kunci publik ED448, format payload backdoor, dan demo eksekusi kode jarak jauh
- Honeypot menerapkan patch sederhana pada OpenSSH untuk mencatat upaya koneksi yang masuk dengan nilai N kunci publik yang sesuai dengan format backdoor ke log sshd
- Patch ED448 mengganti kunci publik hardcoded yang dipakai backdoor untuk verifikasi tanda tangan dan dekripsi payload dengan kunci yang dibuat pengguna, sehingga backdoor dapat dipicu
- Payload backdoor dimasukkan ke nilai N kunci tanda tangan CA pada sertifikat SSH; tipe permintaan dibuat dengan
a * b + c, dan Type 2 menjalankan perintah null-terminated dengansystem() - CLI demo menunjukkan alur menyambung ke server SSH yang rentan dan menjalankan perintah; eksploitasi yang berhasil tidak menghasilkan log INFO atau yang lebih tinggi
Cakupan dan komponen xzbot
- xzbot adalah proyek untuk mengeksplorasi CVE-2024-3094, yaitu backdoor xz
- Komponen yang disertakan ada empat
- honeypot: server rentan palsu untuk mendeteksi percobaan exploit
- ed448 patch: mem-patch
liblzma.soagar memakai kunci publik ED448 sendiri - backdoor format: ringkasan format payload backdoor
- backdoor demo: CLI untuk memicu RCE dengan asumsi kunci privat ED448 diketahui
Honeypot: mendeteksi percobaan melalui patch OpenSSH
- openssh.patch adalah patch sederhana untuk OpenSSH yang mencatat upaya koneksi yang masuk dengan nilai N kunci publik yang sesuai dengan format backdoor
- Alurnya adalah meng-clone
openssh-portable, menerapkan patch, lalu menjalankanautoreconf,configure, danmake - Upaya koneksi muncul di log
sshdsebagaixzbot: magic 1 [preauth]beserta deretan byte payload
Patch kunci publik ED448
- Backdoor memakai kunci publik ED448 hardcoded untuk verifikasi tanda tangan dan dekripsi payload
- Jika kunci publik ini diganti dengan kunci milik pengguna, backdoor dapat dipicu
- Repositori ini menyajikan kunci publik ED448 milik penyerang serta nilai kunci publik pengganti yang dibuat dengan
seed=0 - Langkah awalnya adalah menyiapkan shared object
liblzma.so.5.6.1yang berisi backdoor- Sebagai contoh sumber, disajikan snapshot Debian
xz-utils 5.6.1-1 - Setelah memasang
pwntools, jalankanpatch.py liblzma.so.5.6.1untuk menghasilkanliblzma.so.5.6.1.patch - Setelah itu jalankan
sshdmenggunakan shared objectliblzma.so.5.6.1.patchyang telah dimodifikasi
- Sebagai contoh sumber, disajikan snapshot Debian
- assets berisi contoh
Format payload backdoor
- Backdoor dapat dipicu saat terhubung dengan sertifikat SSH dengan memasukkan payload ke dalam nilai N kunci tanda tangan CA
- Payload ini harus dienkripsi dan ditandatangani dengan kunci ED448 penyerang
- Struktur luarnya terdiri dari field berikut
a: 32-bitb: 32-bitc: 64-bitciphertext: 240 byte
- Tipe permintaan diturunkan dari
a * b + c- Jika nilainya lebih besar dari 3, backdoor melewati pemrosesan
- Type 1: kegunaannya tidak diketahui dan mengharapkan 0 byte
- Type 2: menjalankan payload null-terminated dengan
system() - Type 3: kegunaannya tidak diketahui dan mengharapkan data tanda tangan 48 byte
ciphertextdienkripsi dengan chacha20 menggunakan 32 byte pertama kunci publik ED448 sebagai kunci simetris- Karena itu, percobaan exploit dapat didekripsi dengan kunci 32 byte yang disajikan
- Di dalam
ciphertextyang telah didekripsi terdapat tanda tangan 114 byte, field 1-bitxdany, panjang, string perintah, dan lainnya- Jika
xatauydiatur, alurnya menuju jalur kode yang sedikit berbeda
- Jika
- Tanda tangannya adalah tanda tangan ED448 RFC-8032
- Input mencakup nilai magic 32-bit, field 5 byte sebelum perintah, secara opsional
lengthbyte dari perintah, serta 32 byte pertama hash SHA-256 hostkey server
- Input mencakup nilai magic 32-bit, field 5 byte sebelum perintah, secara opsional
CLI demo exploit
- CLI dipasang dengan Go
go install github.com/amlweems/xzbot@latest
xzbot -hmenampilkan tiga opsi utama-addr: alamat server SSH, default127.0.0.1:2222-seed: seed ED448 yang harus cocok dengan kunci backdoor xz, default0-cmd: perintah yang akan dijalankan dengansystem(), defaultid > /tmp/.xz
- Contohnya terhubung ke server SSH rentan di
127.0.0.1:2222dan menjalankan perintahid > /tmp/.xz - Jika watchpoint dipasang pada lokasi pemanggilan
system()di server rentan, terlihat prosessshdmenjalankanid > /tmp/.xz - Setelah eksekusi, disajikan contoh bahwa
/tmp/.xzberisi outputuid=0(root) gid=0(root) groups=0(root)
Pohon proses dan karakteristik log
- Pohon proses untuk koneksi SSH normal berlanjut ke sesi pengguna dan shell dari
sshd - Contoh eksekusi backdoor berbentuk munculnya
sshd: root [priv],sshd: root [net],sh -c sleep 60, dansleep 60setelahxzbot -cmd 'sleep 60' - Eksploitasi yang berhasil tidak menghasilkan entri log INFO atau yang lebih tinggi
1 komentar
Opini Hacker News
Cukup menarik bahwa ini bukan eksekusi kode jarak jauh yang bisa disalahgunakan siapa saja, melainkan dibuat agar membutuhkan kunci privat penyerang
Ironisnya, ini tampak seperti kerentanan yang sangat sadar keamanan
Kalau mereka membuat lubang besar yang bisa dimasuki siapa saja, itu akan cepat ditemukan dan ditutup; dan jika tidak ada penurunan performa, mungkin saja backdoor ini bertahan lama secara diam-diam karena tidak bisa dieksploitasi secara luas
Seluruh kontribusi terhadap xz pada akhirnya tampak seperti pekerjaan untuk memasukkan backdoor ini; misalnya, mereka bahkan membuat framework pengujian yang bisa menyembunyikan payload berbahaya
Sebelum mengerjakan xz, mereka juga berkontribusi ke libarchive milik BSD, dan di sana muncul kerentanan
Desain dan eksekusinya sangat canggih, dan rasanya hampir murni keberuntungan bahwa masalah performa menjadi pemicu penemuannya
Jika demikian, payload tidak bisa disebar sembarangan ke banyak server, dan mengirimkannya ke satu host saja merupakan struktur yang cukup mahal secara komputasi
Kejadian ini tidak lepas dari pikiran saya sepanjang akhir pekan
Mekanismenya menarik dan merupakan kumpulan obfuscation yang hebat, sementara bagian rekayasa sosialnya adalah cerita yang sangat familier—sampai memalukan—bagi maintainer open source
Hal yang paling menarik adalah pemilihan data uji yang buruk sebagai vektor serangan: jika menyiapkan arsip yang baik, memanipulasinya secara struktural, lalu memakainya sebagai data buruk untuk fuzz testing, tahap-tahap berikutnya menjadi sangat mudah
Untuk nanti, manipulasi seperti ini seharusnya terlihat pada grafik pola biner
Teknik selebihnya, setelah payload ditentukan, umumnya lebih mirip obfuscation biasa; tetapi langkah paling brilian adalah bahwa dengan pola yang sama mereka bisa menambahkan “patch” atau bahkan backdoor baru ke file uji lain tanpa ketahuan
GitHub menyembunyikan dan menghapus repositori sama sekali tidak membantu, malah menghambat analisis insiden ini
Saya menemukan bahwa dependensi itu secara khusus lebih menyukai xz, dan jika belum terpasang, ia bahkan memasang xz di mesin host seolah-olah itu fitur kemudahan
Dependensi lain tidak berperilaku seperti itu, jadi agak aneh
Strategi jangka panjang seperti ini menakutkan, dan sampai “kejahatan” benar-benar dieksekusi, kita tidak bisa tahu mana yang berbahaya dan mana yang sekadar aneh
Apalagi jika itu file “sampah biner” untuk membuktikan kegagalan pengujian, tempat itu sangat cocok untuk menyembunyikan konten berbahaya
Sangat mengesankan bahwa komunitas, terutama amlweems, bisa mengimplementasikan dan mendokumentasikan kode proof-of-concept secepat ini
Jika tidak ada kerentanan tambahan pada fungsi kriptografi atau pemuatan payload, mungkin saja ini bahkan tidak membuka celah keamanan bagi semua penyerang lain sampai kuncinya berhasil dipecahkan
Langkah berikutnya adalah menemukan cara mendeteksi distribusi yang rentan, tetapi itu tampaknya tidak mudah; mungkin juga upstream bisa memasukkan cara untuk memantau apakah ada yang secara aktif memindai server SSH dengan kunci hardcoded
Proof-of-concept untuk versi asli membutuhkan kunci privat penyerang yang tidak dipublikasikan
Hal terbaik yang bisa dilakukan hanyalah benchmarking yang lebih halus, tetapi kita tidak bisa tahu apakah host internet sembarang lambat karena rentan, karena lokasinya jauh, atau karena komputernya sendiri lambat
Kita juga tidak punya akses ke berapa lama percobaan koneksi ke host itu di masa lalu, dan ada pula perubahan routing
Saya penasaran apakah ada yang sudah menjalankan proof-of-concept ini pada alat pendeteksi perilaku proses yang tidak normal
Produk seperti Carbon Black, AWS GuardDuty, dan Sysdig termasuk di sini; kasus ini tampak sangat cocok untuk kategori produk tersebut guna menguji apakah, saat benar-benar dideploy, ada kemungkinan seseorang menyadarinya relatif cepat
GuardDuty tidak mengintip ke dalam proses seperti EDR semacam CrowdStrike atau Carbon Black, jadi sepertinya sulit tertangkap; Sysdig memantau container dan infrastruktur cloud, jadi sulit juga menangkap eksploit itu sendiri
Namun setelah eskalasi privilese, ada kemungkinan menangkap anomali dari tindakan lanjutan pelaku ancaman
Pada akhirnya, yang paling mungkin menangkap eksploit itu sendiri adalah EDR yang memantau proses endpoint, atau evaluasi rantai pasok perangkat lunak yang memantau masalah keamanan pada perangkat lunak bebas dan open source upstream
Menariknya, ini mengarah ke topik keamanan yang lebih besar
Tim pengembang bisa tidak suka memasang EDR di server karena penurunan performa dan masalah pengalaman pengguna saat tindakan isolasi dilakukan, dan mereka juga bisa tidak suka kebijakan yang membatasi penggunaan perangkat lunak bebas dan open source
Eksploit ini menusuk tepat di tengah “kerentanan” tingkat organisasi, dan tergantung posisinya, bisa muncul argumen untuk tetap mempertahankan paparan maupun untuk memperbaikinya
Mereka mengatakan, “Salah satu metode deteksi runtime adalah memantau apakah SSHD memuat library berbahaya. Shared library semacam ini sering menyertakan versi dalam nama file”
Blog itu juga memuat aturan deteksi nyata yang belum saya lihat dari vendor keamanan lain
https://sysdig.com/blog/cve-2024-3094-detecting-the-sshd-bac...
Saya salah membaca tautan di bawah, dan isi aslinya saya tinggalkan untuk catatan
Kalau melihat bagian bawah thread email yang sama, disebutkan bahwa orang yang meng-commit backdoor itu belakangan juga tampak melakukan kontribusi kernel, tetapi analisis aslinya sendiri benar-benar bagus, jadi tulisan seperti ini layak dibaca
https://www.openwall.com/lists/oss-security/2024/03/29/10
Lasse sendiri juga mengatakan bahwa itu sama sekali tidak mendesak dan tidak akan masuk ke merge window kali ini, dan orang yang waras tidak menuduh Lasse sebagai pelaku jahat
Insiden ini punya kemiripan yang luar biasa banyak dengan insiden Audacity beberapa tahun lalu
Cookie guy mengklaim dirinya ditikam dan polisi federal terlibat dalam kasus itu, yang menyiratkan kemungkinan insiden tersebut terkait dengan aktor yang jauh lebih besar daripada 4chan
Saat itu banyak orang mengira hanya Muse Group yang terlibat, tetapi mungkin saja itu aktor negara Rusia
Sebelumnya ia mengklaim Audacity memiliki banyak telemetri dan backdoor, lalu menghapusnya pada commit pertama setelah melakukan fork
Mungkin saja Audacity memang benar-benar memiliki backdoor, jadi sepertinya perlu memeriksa kode sumbernya
Belakangan mereka sedang menggabungkan operasi dengan APT29, dan kalau saya, saya tidak akan membangunkan cozy bear
Saya penasaran bagaimana eksploit sebenarnya melakukan ini saat runtime, tanpa openssh.patch honeypot pada waktu kompilasi https://github.com/amlweems/xzbot/blob/main/openssh.patch
Rantainya adalah
opensshd -> notifikasi systemd -> xz yang disertakan sebagai dependensi sementara, dan saya ingin tahu bagaimana setelahliblzma.so.5.6.1dimuat ke memori, ia bisa menelusuri balik sampaiopenssh_RSA_verifyuntuk memasang hook atau patchJika dimuat sebelum libcrypto, ia mendaftarkan handler audit simbol; ini tampaknya fitur khusus glibc, dan dapat menerima notifikasi saat simbol libcrypto di-resolve sehingga patch GOT bisa ditunda
Saya penasaran apakah ada yang tahu eksploit ini hanya berjalan ketika ada koneksi SSH masuk
Daftar string di GitHub memuat
DISPLAYdanWAYLAND_DISPLAYhttps://gist.github.com/q3k/af3d93b6a1f399de28fe194add452d01
Keduanya tidak punya kaitan jelas dengan SSH, jadi mungkin ada sesuatu yang dilakukan bahkan ketika tidak ada koneksi
Ini bisa penting bagi orang yang menjalankan kode tersebut tetapi menganggap dirinya aman karena tidak mengekspos server SSH ke internet
Dengan kata lain, mekanisme untuk menghindari situasi ketika seseorang mencoba mendeteksi, mereproduksi, atau men-debug-nya
Jika tidak dimatikan saat terhubung ke mesin yang tidak tepercaya, itu menjadi celah keamanan umum di sisi orang yang terhubung
Saya penasaran apakah pernyataan “eksploitasi yang berhasil tidak membuat entri log” berarti, jika eksploit ini tidak ketahuan, penyerang bisa menjalankan perintah arbitrer sebagai root di host yang sudah dikompromikan tanpa satu pun log sshd untuk “koneksi” tersebut
Eksekusi kode jarak jauh terjadi pada tahap koneksi, sebelum log dicatat
Saya penasaran deteksi anomali seperti apa yang bisa menangkap ini
Saya penasaran apakah serangan ini bisa dibuat lebih sulit jika file pengujian dipisahkan ke repositori terpisah sehingga tidak dapat digunakan pada waktu build
Logikanya, apa pun yang terlibat dalam build harus dapat dibaca manusia
Serangan ini harus diperlakukan seperti kecelakaan pesawat, dan aturan baru perlu diperkenalkan untuk mengurangi kemungkinan keberhasilannya lagi
Meski kita tidak bisa memverifikasi setiap kontributor satu per satu, data pengujian yang berisik seharusnya mudah dipisahkan