Xz: Satu Karakter yang Menonaktifkan Landlock Linux
(git.tukaani.org)- Perubahan CMakeLists.txt di xz.git terjadi saat deteksi sandbox Landlock diubah dari pemeriksaan keberadaan header menjadi uji kompilasi nyata, dan dalam proses itu ada kasus masuknya karakter tunggal
.di dalam kode uji - Pemeriksaan baru ditambahkan untuk menyaring sistem yang meski memiliki
linux/landlock.h, mungkin tidak memiliki definisi syscall yang diperlukan - Uji kompilasi menyertakan
<linux/landlock.h>,<sys/syscall.h>,<sys/prctl.h>dan mereferensikanprctl,SYS_landlock_create_ruleset,SYS_landlock_restrict_self,LANDLOCK_CREATE_RULESET_VERSION - Kriteria lama
HAVE_LINUX_LANDLOCK_Hdiubah menjadi HAVE_LINUX_LANDLOCK, dan pengaturanSANDBOX_COMPILE_DEFINITIONsertaSANDBOX_FOUNDjuga mengikuti hasil ini - Commit ini memperbaiki Linux Landlock feature test pada build Autotools dan CMake, dan diff yang disediakan menampilkan perubahan di sisi CMake
Perubahan metode deteksi Landlock di CMake
- File yang menjadi sasaran adalah CMakeLists.txt di xz.git, dan lokasi perubahan ada pada blok
# Sandboxing: Landlock - Logika CMake sebelumnya hanya memeriksa keberadaan header dengan
check_include_file(linux/landlock.h HAVE_LINUX_LANDLOCK_H)ketikaENABLE_SANDBOXbernilaiONataulandlockdanSANDBOX_FOUNDbelum aktif - Setelah diubah,
check_c_source_compilesdigunakan untuk benar-benar mengompilasi kode C kecil guna memastikan apakah Landlock dapat digunakan- Pada sebagian sistem,
linux/landlock.hmungkin ada tetapi definisi syscall yang dibutuhkan Linux Landlock tidak tersedia - Kode uji menyertakan
<linux/landlock.h>,<sys/syscall.h>,<sys/prctl.h> - Di dalam
my_sandbox(), kode tersebut mereferensikanprctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0),SYS_landlock_create_ruleset,SYS_landlock_restrict_self,LANDLOCK_CREATE_RULESET_VERSION
- Pada sebagian sistem,
Karakter tunggal dan perubahan nama variabel
- Tepat setelah blok include pada kode uji kompilasi yang disisipkan, ada satu baris
.saja - Variabel hasil diubah dari
HAVE_LINUX_LANDLOCK_Hmenjadi HAVE_LINUX_LANDLOCK - Kondisi juga berubah dari
if(HAVE_LINUX_LANDLOCK_H)menjadiif(HAVE_LINUX_LANDLOCK) - Nilai
SANDBOX_COMPILE_DEFINITIONmenggunakan"HAVE_LINUX_LANDLOCK"alih-alih"HAVE_LINUX_LANDLOCK_H" - Setelah itu, pengaturan
SANDBOX_FOUND ONtetap dipertahankan
1 komentar
Komentar Hacker News
Jawaban: https://git.tukaani.org/?p=xz.git;a=commitdiff;h=f9cf4c05edd...
Kalau belum terlalu paham sistem kontrol akses Landlock di Linux, penjelasannya ada di sini: https://docs.kernel.org/userspace-api/landlock.html
Halaman respons insiden resmi xz (mungkin...): https://tukaani.org/xz-backdoor/
Tapi karena satu tanda titik kecil yang menempel dekat tepi kiri diff dan sulit dilihat, kode C itu selalu menjadi tidak valid, sehingga Landlock selalu dimatikan?
Sangat mengesankan dalam kebusukannya, dan sangat busuk dalam kepiawaiannya. Saat pertama membaca, aku juga tidak melihatnya
Kalau ingin menyembunyikannya, ada cara yang lebih baik dengan mengganti karakter mirip Unicode. Beberapa terlihat identik sampai ke pikselnya, tergantung font
Mungkin aku melewatkan alurnya, tapi apakah niat jahat di sini sudah dipastikan?
Saat memeriksa dengan hati-hati, aku melihat tanda titik di posisi yang jelas-jelas tidak semestinya, lalu berpikir “ternyata tidak sesulit itu”
Aku mengetuk layar sedikit, dan tanda titik itu bergerak
Sialan, ternyata debu monitor
Sulit dipercaya keamanan sistem bergantung pada rantai kebenaran yang serapuh ini. Ada begitu banyak titik yang bisa mencegahnya
+ # A compile check is done here because some systems have+ # linux/landlock.h, but do not have the syscalls defined+ # in order to actually use Linux Landlock.Header pada sistem seperti itu seharusnya diperbaiki agar dikecualikan secara eksplisit. Apa gunanya header kalau tidak mendeklarasikan fungsinya sendiri?
Dan aku juga tidak mengerti kenapa setelah binary blob dibuat (meski dikompilasi dari open source), tidak ada satu pun tes untuk memastikan keamanannya tetap utuh
Bahkan fitur pembayaran situs web pun tidak akan dideploy tanpa end-to-end test untuk fungsi inti. Tampaknya ada ketidaksinkronan prioritas di mana penambahan fitur lebih diutamakan daripada stabilitas
Semoga perbaikannya bukan sekadar menghapus
.. Aku baru saja melihat tulisan lain di HN yang menunjukkan penghapusan.Memperbaiki header atau menambahkan tes tidak akan mencegahnya. Karena sejak awal tidak ada tanda bahwa header-nya rusak, dan tes tambahan pun bisa dirusak dengan cara lain atau diabaikan di release tarball
[1] https://git.tukaani.org/?p=xz.git;a=commit;h=328c52da8a2bbb8...
Karena pengguna mungkin mencoba mengompilasi dengan GCC 9.4.0, dan fitur yang bergantung pada header itu tidak esensial bagi aplikasi, jika build mendeteksi header rusak, build cukup mematikan fitur tersebut dan mengeluarkan peringatan
Kembali ke xz, jika keamanan bukan prioritas tertinggi, mengabaikan kegagalan fitur opsional dan tetap melanjutkan terlihat cukup masuk akal. Tentu setelah kejadian mudah untuk menyalahkan, tetapi jika konteks itu tidak diabaikan, keputusan tersebut tidak sepenuhnya tidak masuk akal
Astaga, commit terakhirnya justru membuat pelaporan keamanan menjadi lebih buruk: https://git.tukaani.org/?p=xz.git;a=commitdiff;h=af071ef7702...
Landlock seharusnya dipakai di mana/bagaimana?
Rasanya sulit benar-benar dipakai di library serbaguna seperti kompresi/dekompresi. Library tidak tahu program harus melakukan apa, dan apa yang harus dibatasi.
Kalau berupa program, itu bisa lebih jelas.
Serangan sshd menggunakan liblzma sebagai library. Kalau begitu, mematikan Landlock tampaknya tidak relevan? Apakah ini sinyal bahwa masih ada kode jahat lain yang belum ditemukan, atau rencananya akan dimasukkan nanti?
Jika Landlock dihapus, daemon tidak mengunci dirinya sendiri, sehingga saat mencapai tahap eksploitasi, eksekusi payload jadi lebih mudah.
Saya tidak melihat keduanya tidak terkait. Sepertinya mereka sudah memikirkan payload, dan menyadari bahwa ini akan menjadi penghalang.
Kasus ini sangat membingungkan. Beberapa bagiannya luar biasa canggih sampai sulit dipercaya, sementara bagian lain terlihat cukup ceroboh.
Idenya adalah library memulai pekerjaan kompleks di thread terpisah, lalu menunggu thread itu di dalam API yang dipanggil kode pengguna. Thread tersebut menerapkan Landlock pada dirinya sendiri, lalu mulai bekerja. Jika ada yang salah, kodenya terisolasi.
Tentu saja dalam kasus ini sandbox dikendalikan penyerang, jadi tidak akan bekerja. Sebab penyerang bisa saja mematikannya atau membuatnya lebih lemah daripada semula. Meski begitu, ini juga bisa dilakukan dengan cara lain.
Sebenarnya apa yang mereka incar di sini? Apakah mereka berniat memasukkan lebih banyak backdoor nanti, backdoor yang lebih mudah disangkal secara masuk akal? Menurut saya oss-fuzz maupun perubahan ini kemungkinan tidak akan benar-benar menemukan backdoor yang akhirnya ditemukan.
Lalu kenapa menaruh semua telur backdoor dalam satu keranjang, yaitu satu library?
Selain itu, caranya bukan membuat backdoor pada library itu sendiri, melainkan menargetkan tool yang menggunakannya. Gaya “Reflections on trusting trust”.
Kedengarannya seperti rencana sempurna sampai akhirnya gagal.
Saya penasaran mengapa mencegah Landlock aktif di xz itu berguna. Apakah pada tahap berikutnya mereka berniat menyuntikkan konten berbahaya ke arsip xz? Kalau begitu, mengapa tidak langsung memasukkan perilaku berbahaya ke xz itu sendiri?
Menyusupkan buffer overflow atau use-after-free ke proyek C yang dipelihara mungkin bisa dilakukan tanpa ketahuan. Mendistribusikan trojan horse sungguhan jauh lebih sulit, dan itu terlihat pada backdoor xz-to-sshd.
Ini secara mengejutkan terlalu mencolok. Teknik mematikan fiturnya cerdik dan commit-nya juga cukup meyakinkan. Tapi mengapa memilih kesalahan sintaks yang jelas, alih-alih sekadar salah eja? Misalnya, kalau kesalahannya
PR_SET_NO_NEW_PRIV, apakah orang akan menyadarinya?Itu juga akan memberi ruang penyangkalan yang lebih besar.
Secara terpisah, tim malware ini telah membuat dataset yang sangat bagus untuk melatih AI mengidentifikasi masalah keamanan. Setiap commit punya masalah keamanan, dan komunitas open source akan menelusurinya satu per satu untuk menemukannya.
Terima kasih kepada para maintainer yang melakukan pekerjaan pembersihan. Jelas itu bukan pekerjaan yang menyenangkan.
Jadi saya benar-benar tidak suka sistem build gaya configure yang menyalakan dan mematikan fitur secara otomatis. Kalau menginginkan sesuatu, saya ingin mengaktifkannya secara eksplisit. Jika ada alasan kuat untuk menjadikan suatu fitur sebagai default, maka seharusnya fitur itu bisa dimatikan secara eksplisit sebagai gantinya.
Cukup sediakan kumpulan fitur default dan izinkan
--enable-a --disable-bsesuai kebutuhan.Menelan bug dalam proses pemeriksaan secara diam-diam adalah masalah lain lagi.