Secara umum, tidak mungkin untuk mengetahui dengan pasti - bahkan program yang tampaknya sangat aman dapat memiliki kerentanan yang berarti program tersebut dapat digunakan untuk tindakan sewenang-wenang - tetapi berikut adalah beberapa hal yang perlu diperiksa:
Apakah program melakukan hal berikut?
- Tampilkan isi file atau perangkat arbitrer.
- Salin, pindahkan, tulis, atau hapus file arbitrer.
- Menetapkan/memodifikasi variabel lingkungan arbitrer (yang akan diambil oleh proses istimewa lainnya), atau membuat perubahan arbitrer pada variabel tertentu.
- Aktifkan IOCTL atau berinteraksi dengan perangkat arbitrer.
- Ubah kepemilikan atau izin pada file arbitrer.
- Pasang sistem file arbitrer, atau ubah opsi pemasangan pada yang sudah ada.
- Izinkan akses langsung ke memori sistem atau proses arbitrer (seperti debugger).
- Izinkan peluncuran program arbitrer.
Program apa pun yang melakukan semua itu tidak aman untuk memberikan sudo
kepada pengguna dengan hak istimewa rendah akses ke. Ini mengesampingkan, misalnya, program apa pun dengan kemampuan untuk menentukan file keluaran (biasanya melalui -o
atau -f
parameter), memproses file input dengan cara apa pun yang mengungkapkan kontennya (bahkan hanya melalui pesan kesalahan yang cukup informatif tentang format input yang salah), dan sebagian besar runtime skrip (termasuk shell).
Jika Anda mengganti sewenang-wenang dalam pemeriksaan tersebut dengan terbatas atau spesifik , maka Anda telah menyelesaikan masalah satu langkah (atau beberapa):lakukan salah satu hal yang dapat dilakukan program menyebabkan kejadian sewenang-wenang seperti itu, mungkin melalui berbagai tingkat tipuan? Misalnya, jika program Anda memungkinkan pengguna untuk mengatur variabel lingkungan yang unik, itu akan menyebabkan program istimewa membaca file yang berbeda dari yang diharapkan, dan file yang berbeda itu akan menyebabkan sistem mengizinkan pengguna untuk memasang file gambar pilihan mereka sebagai sistem file dengan setuid
sedikit dihormati, maka Anda tidak boleh mengizinkan pengguna yang tidak dipercaya untuk menjalankan program itu.
Namun, hanya karena sebuah program melewati semua pemeriksaan ini tetap tidak berarti itu benar-benar aman. Misalnya, jika melakukan tindakan jaringan tertentu (seperti mendengarkan pada port yang dibatasi atau mengirim paket mentah), mungkin tidak aman karena mungkin ada program lain di jaringan (atau di mesin yang sama) dengan asumsi bahwa setiap proses mampu melakukannya. hal-hal dimiliki oleh pengguna tepercaya - lagipula, tindakan itu memerlukan root - dan Anda telah mematahkan asumsi itu. Selain itu, daftar poin-poin di atas hanyalah hal-hal yang saya pikirkan dalam beberapa menit; hampir pasti ada beberapa jalan menuju peningkatan hak istimewa yang tidak saya sertakan.
Terakhir, seperti halnya semua pertanyaan keamanan, pertanyaan ini bergantung pada model ancaman Anda.
- Apakah penyerang (pengguna yang tidak dipercaya) lokal ke mesin dengan akses fisik, atau jarak jauh? Sangatlah sulit untuk mencegah penyerang yang gigih dengan akses fisik mendapatkan root, terutama jika mereka harus dapat (kembali) mem-boot mesin tanpa bantuan, jadi pertimbangkan risiko apa yang bersedia Anda terima.
- Apakah mesin digunakan bersama di antara pengguna? Kemudian Anda perlu mempertimbangkan serangan lintas-pengguna tambahan, seperti denial-of-service (dengan mengonsumsi sumber daya secara berlebihan atau menjadikan mesin tidak dapat digunakan).
- Apakah Anda memerlukan non-repudiation (kemampuan untuk membuktikan siapa yang melakukan sesuatu)? Maka Anda perlu memastikan bahwa Anda dapat mengikat tindakan apa pun yang dilakukan melalui
sudo
kepada pengguna yang melakukannya. - Apakah Anda perlu mencegah pengguna melakukan beberapa hal yang biasanya dapat dilakukan bahkan oleh pengguna non-root (seperti menjalankan program sewenang-wenang dalam konteks pengguna mereka sendiri meskipun program tersebut adalah hal-hal seperti game atau cryptominers, atau membuka klien TCP koneksi ke host dan port arbitrer)? Maka Anda juga perlu mempertimbangkan cara Anda menerapkan pembatasan ini, dan mencegah menjalankan sebagai sudo program apa pun yang mungkin mengarah pada cara bagi pengguna untuk melewati pembatasan.
Dll. Jawaban yang benar-benar komprehensif tidak akan mungkin dilakukan di sini; itu tergantung pada terlalu banyak hal. Namun, saya akan mengatakan ini:ini sangat sulit untuk memastikan pengguna yang tidak dipercaya, mengingat kemampuan untuk menjalankan program non-sepele apa pun sebagai root (yang tidak secara eksplisit dirancang untuk dijalankan dengan aman seperti itu), tidak dapat melakukan sesuatu yang tidak terduga. Bahkan jika salah satu program semacam itu tidak mengizinkan apa pun yang menurut Anda penting untuk dicegah, beberapa program semacam itu mungkin saja digabungkan untuk mencapai tujuan penyerang.
Ini pada dasarnya bermuara pada masalah penghentian, Anda dapat mengaudit kode atau merekayasa balik biner, namun meskipun tidak ada "fitur" yang memungkinkan Anda menjalankan perintah sewenang-wenang, masih ada kerentanan dalam biner atau sudo itu sendiri yang dapat mengarah ke eksekusi perintah sewenang-wenang sebagai root untuk pengguna yang diaktifkan.