Apa pun yang dapat Anda lakukan pada akun yang disusupi, penyerang juga dapat melakukannya.
Pada dasarnya, ini karena penyedia Linux mengisolasi antar pengguna, bukan antara proses individual yang berjalan sebagai pengguna yang sama. Setiap proses yang berjalan sebagai pengguna tertentu dianggap memiliki kemampuan yang setara dengan proses lain yang berjalan di bawah pengguna tersebut.
Benarkah sistem sudo yang dapat dieksekusi dapat dielakkan dengan cara ini?
Ya, dan dengan cara lain juga. Jika Anda meningkatkan hak istimewa untuk melakukan root pada akun tanpa hak yang disusupi, Anda membahayakan root. Jika Anda melepaskan hak istimewa dari root menggunakan su
ke akun yang tidak memiliki hak istimewa, Anda juga berkompromi dengan root! Anda tidak akan pernah dapat meningkatkan hak istimewa dengan aman di akun yang tidak dipercaya. Meskipun dimungkinkan untuk mengeksploitasi sistem menggunakan PATH
, itu juga memungkinkan untuk membajak proses bash itu sendiri untuk mengendus input kunci. Menonaktifkan eksekusi dengan noexec
selanjutnya tidak berguna karena juru bahasa (bash, python, perl, dll) masih akan berjalan. noexec
opsi tidak dan tidak pernah dirancang sebagai fitur keamanan, meskipun sering dijajakan seperti itu.
Daftar lengkap cara penyerang dapat membajak penggunaan sudo
atau su
:
-
Menggunakan
LD_PRELOAD
variabel pada proses induk (mis.bash
). -
Mengaitkan proses induk dengan
ptrace()
atauprocess_vm_writev()
. -
Mengendus atau menyuntikkan penekanan tombol ke emulator terminal menggunakan protokol X11.
-
Membuat alias atau fungsi untuk membungkus
sudo
yang sebenarnya dapat dieksekusi.
Saya menjelaskan ini secara lebih rinci tentang jawaban saya untuk pertanyaan lain.
Mengapa sistem Linux desktop, secara default, disiapkan dengan cara yang mudah dieksploitasi?
Meningkatkan hak istimewa pada akun yang tidak dipercaya bukanlah sesuatu yang Anda seharusnya melakukan. Belum lagi, Linux desktop adalah renungan dalam skema besar arsitektur * nix umum. Ini adalah kegagalan teater keamanan yang tak henti-hentinya mengulangi nasihat buruk yang sama, bukan kegagalan arsitektur keamanan Linux itu sendiri. Orang berulang kali mengatakan untuk menggunakan sudo
untuk root karena banyak pengguna baru akan menjalankan semuanya sebagai root, bahkan browser mereka! Dalam hal ini, lebih baik menggunakan sudo
. Berbahaya jika pengguna sudah cukup pintar untuk tidak menggunakan root untuk semuanya.
Perhatikan bahwa sudo
sangat dapat dikonfigurasi dan dapat dirancang untuk mengizinkan hanya perintah tertentu. Di sinilah ia benar-benar bersinar. Anda dapat mengonfigurasi sudo
untuk hanya mengizinkan Anda menjalankan apt-get update
sebagai root (dengan atau tanpa kata sandi), dan tolak yang lainnya. Itu juga akan membatasi penyerang untuk melakukan apa pun selain... yah... melakukan pembaruan perangkat lunak.
Penting untuk diingat bahwa, meskipun Anda mengonfigurasinya untuk hanya mengizinkan menjalankan perintah tertentu sebagai root, Anda masih dapat menyalahkan diri sendiri jika Anda memasukkan program yang tidak dirancang untuk dijalankan sebagai root melalui pengguna yang tidak tepercaya ke daftar putih. Saya melihat contoh nyata dari seseorang yang mencoba menjalankan VeraCrypt dengan cara ini dan menjelaskan mengapa ini tidak aman. Idenya adalah bahwa VeraCrypt aman untuk dijalankan sebagai root, jadi aman untuk menggunakan sudo
untuk mengangkatnya ke root sebagai pengguna yang tidak dipercaya dan tidak memiliki hak istimewa. Ternyata idenya cacat, dan memungkinkan eskalasi hak istimewa yang sepele!
Bukankah seharusnya cara default untuk memanggil sudo memastikan bahwa itu sebenarnya dapat dieksekusi yang disediakan oleh sistem (tidak ada yang akan mengetik /usr/bin/sudo setiap saat)?
Mengetik path lengkap tidak akan melindungi Anda! Anda dapat dengan mudah membuat fungsi yang berisi /
di depan , dan itu akan mengesampingkan yang sebenarnya dapat dieksekusi. Bahkan jika executable memastikan bahwa itu asli dan berusaha untuk mengalahkan sniffing, proses berbahaya dapat membajak bash
memproses dan mengendus penekanan tombol secara terpisah dari sudo
, membuatnya tidak mungkin untuk dideteksi dari sudut pandangnya.
$ function /usr/bin/sudo { echo 'hijacked!'; } $ /usr/bin/sudo id hijacked!
Dalam lingkungan seperti itu, tampaknya menggunakan sudo pada dasarnya tidak aman dan akan lebih baik mengaktifkan login sebagai root dan login di TTY terpisah.
Ini selalu kasus. Perhatikan bahwa masuk ke TTY lain pun tidak sepenuhnya aman. Anda harus menggunakan SAK, kombinasi Secure Attention Key, untuk memastikan bahwa Anda berinteraksi dengan sesi login asli (agetty
atau logind
, Misalnya). SAK adalah kombinasi kunci yang didengarkan oleh kernel (dan karenanya tidak dapat ditekan oleh ruang pengguna). Ketika terdeteksi, itu akan membunuh setiap proses di TTY saat ini, memicu prompt login untuk muncul. Jika Anda telah beralih ke TTY asli tanpa kompromi, maka itu hanya akan menyebabkan prompt menghilang dan muncul kembali. Jika Anda menggunakan TTY yang dibajak, itu akan mematikan proses berbahaya dan mengembalikan perintah login asli.