Halo semuanya. Kami secara aktif bergabung dengan pekerjaan dan pada bulan Januari kami sedang mempersiapkan banyak peluncuran yang kuat. Di antara yang lain, satu set telah diumumkan untuk aliran baru kursus Administrator Linux yang disukai semua orang. Untuk mengantisipasi peluncuran, kami biasanya membagikan terjemahan materi yang bermanfaat.
Izin file menawarkan alternatif yang aman untuk executable SUID, tetapi mereka mungkin tampak sedikit membingungkan pada awalnya.
Kita semua tahu bahwa binari
SUID adalah
solusi keamanan yang buruk . Untungnya, jika aplikasi Anda memerlukan beberapa hak istimewa terbatas, ada cara yang lebih efisien yang disebut
izin file .
Saya akan menghemat waktu Anda jika Anda ingin menghindari pembacaan rinci artikel di atas: pada dasarnya, izin file memungkinkan proses yang berjalan sebagai root dan, oleh karena itu, memiliki hak untuk melakukan sesuatu, untuk menyimpan fitur-fitur tertentu yang dibatasi oleh
daftar ini ketika mereka setel ulang hak istimewa dan jalankan sebagai pengguna yang tidak memiliki hak. Ini berarti bahwa jika seorang penyerang berhasil mengkompromikan suatu proses dengan meluap buffer atau eksploitasi lainnya, ia tidak akan dapat mengambil keuntungan dari apa pun selain hak minimum minimum tertentu yang benar-benar dibutuhkan oleh proses tersebut.
Izin sangat bagus untuk layanan yang biasanya selalu dijalankan sebagai root, tetapi bagaimana dengan utilitas baris perintah? Untungnya, ini juga didukung asalkan Anda memiliki utilitas yang benar diinstal. Jika Anda menggunakan Ubuntu, misalnya, Anda akan memerlukan paket
libcap2-bin
. Anda juga perlu menjalankan kernel non-archaic (mulai dari versi
2.6.24 ).
Fungsi-fungsi ini memungkinkan Anda untuk mengaitkan izin dengan file yang dapat dieksekusi mirip dengan pengaturan bit SUID, tetapi hanya untuk serangkaian izin tertentu. Utilitas
setcap
digunakan untuk menambah dan menghapus izin dari file.
Langkah pertama adalah memilih izin yang Anda butuhkan. Untuk artikel ini, saya berasumsi bahwa ada alat diagnostik jaringan yang disebut
tracewalk
yang harus dapat menggunakan
soket mentah . Ini biasanya mengharuskan aplikasi dijalankan sebagai root, tetapi ketika melihat
daftar, ternyata hanya izin
CAP_NET_RAW
yang
CAP_NET_RAW
.
Dengan asumsi Anda berada di direktori tempat biner
tracewalk
berada, Anda dapat menambahkan izin ini sebagai berikut:
sudo setcap cap_net_raw=eip tracewalk
Untuk saat ini, abaikan suffix
=eip
untuk mendapatkan izin, saya akan membicarakannya dalam beberapa detik. Harap dicatat bahwa nama izin adalah huruf kecil. Sekarang Anda dapat memeriksa apakah Anda telah mengkonfigurasi izin dengan benar dengan:
setcap -v cap_new_raw=eip tracewalk
Atau Anda dapat mendaftar semua izin yang ditetapkan untuk file yang dapat dieksekusi ini:
getcap tracewalk
Untuk referensi, Anda juga dapat menghapus semua izin dari yang dapat dieksekusi menggunakan:
setcap -r tracewalk
Pada titik ini, Anda harus dapat menjalankan executable sebagai pengguna yang tidak terjangkau, dan ia harus dapat bekerja dengan soket mentah, tetapi tidak memiliki hak istimewa lain yang dimiliki oleh pengguna root.
Jadi apa arti akhiran aneh
=eip
? Ini akan membutuhkan sedikit pemahaman tentang sifat izin. Setiap proses memiliki tiga set izin -
efektif, dapat diwariskan dan diizinkan (efektif, dapat diwariskan dan diizinkan) :
- Izin yang efektif adalah izin yang menentukan proses apa yang sebenarnya dapat dilakukan. Misalnya, tidak dapat menangani soket mentah jika
CAP_NET_RAW
tidak dalam set efisien. - Izin yang diizinkan adalah izin yang diizinkan dimiliki proses jika memintanya melalui panggilan yang sesuai. Mereka tidak mengizinkan suatu proses untuk benar-benar melakukan apa pun kecuali itu secara khusus ditulis untuk meminta izin yang ditentukan. Ini memungkinkan Anda untuk menulis proses untuk menambahkan izin penting ke set efektif hanya untuk periode ketika mereka benar-benar diperlukan.
- Izin yang dapat diwarisi adalah izin yang dapat diwarisi dalam koleksi proses anak yang tersedia. Selama operasi
fork()
atau clone()
, proses anak selalu diberikan salinan izin dari proses induk, karena pada saat itu masih menjalankan file executable yang sama. Set yang diwarisi digunakan ketika exec()
(atau yang setara) dipanggil untuk mengganti executable dengan yang lain. Pada titik ini, set proses yang tersedia disamarkan oleh set yang diwarisi untuk mendapatkan set yang tersedia yang akan digunakan untuk proses baru.
Dengan demikian, utilitas
setcap
memungkinkan kita untuk menambahkan izin dari ketiga set ini secara independen untuk file yang dapat dieksekusi yang diberikan. Perhatikan bahwa makna grup ditafsirkan sedikit berbeda untuk izin file:
- Izin file yang tersedia adalah yang selalu tersedia untuk dieksekusi, bahkan jika proses induk yang memanggilnya tidak memilikinya. Mereka dulu disebut izin "paksa".
- Izin file yang diwarisi menentukan topeng tambahan yang juga dapat digunakan untuk menghapus izin dari set proses panggilan. Mereka digunakan di samping set yang diwariskan dari proses panggilan, jadi izin hanya diwarisi jika ada di kedua set.
- Izin file yang efektif sebenarnya hanya satu bit, bukan satu set, dan jika itu diinstal, itu berarti seluruh set yang tersedia juga disalin ke set efektif dari proses baru. Ini dapat digunakan untuk menambahkan izin ke proses yang tidak secara khusus ditulis untuk meminta mereka. Karena ini hanya satu bit, jika Anda mengaturnya untuk izin apa pun, itu harus ditetapkan untuk semua izin. Anda dapat menganggapnya sebagai bit warisan karena digunakan untuk memungkinkan izin untuk aplikasi yang tidak mendukungnya.
Saat menentukan izin melalui
setcap
tiga huruf
e
,
i
dan
p
merujuk ke set yang
efisien, diwariskan, dan dapat diakses , masing-masing. Jadi, spesifikasi sebelumnya:
sudo setcap cap_net_raw=eip tracewalk
... menunjukkan bahwa izin
CAP_NET_RAW
harus ditambahkan ke set yang tersedia dan diwarisi dan bahwa bit efektif juga harus ditetapkan. Ini akan mengganti semua izin yang ditetapkan sebelumnya dalam file. Untuk mengatur beberapa izin sekaligus, gunakan daftar yang dipisahkan koma:
sudo setcap cap_net_admin,cap_net_raw=eip tracewalk
Panduan perizinan membahas semua ini secara lebih rinci, tetapi mudah-mudahan posting ini sedikit menggambarkan kejadian tersebut. Masih menyebutkan beberapa peringatan dan trik.
Pertama, kemampuan file tidak berfungsi dengan symlink - Anda harus menerapkannya ke biner itu sendiri (yaitu, ke target symlink).
Kedua, mereka tidak bekerja dengan skrip yang ditafsirkan. Misalnya, jika Anda memiliki skrip Python yang ingin Anda beri izin, Anda harus menugaskannya untuk juru bahasa Python itu sendiri. Jelas, ini merupakan masalah keamanan potensial, karena dengan demikian semua skrip yang dieksekusi dengan penerjemah ini akan memiliki izin yang ditentukan, meskipun ini masih jauh lebih baik daripada melakukan SUID. Solusi yang paling umum, tampaknya, adalah menulis file yang dapat dieksekusi terpisah dalam C atau analog yang dapat melakukan operasi yang diperlukan dan menyebutnya dari skrip. Ini mirip dengan pendekatan yang digunakan oleh Wireshark, yang menggunakan file biner
/usr/bin/dumpcap
untuk melakukan operasi istimewa:
$ getcap /usr/bin/dumpcap /usr/bin/dumpcap = cap_net_admin,cap_net_raw+eip
Ketiga, izin file dinonaktifkan jika Anda menggunakan
LD_LIBRARY_PATH
lingkungan
LD_LIBRARY_PATH
untuk alasan keamanan yang jelas
(1) . Hal yang sama berlaku untuk
LD_PRELOAD
, sejauh yang saya tahu.
1. Karena penyerang jelas dapat mengganti salah satu pustaka standar dan menggunakan LD_LIBRARY_PATH
untuk memaksa pustaka untuk dipanggil dalam preferensi atas sistem, dan oleh karena itu memiliki kode arbitrer sendiri dieksekusi dengan hak istimewa yang sama dengan aplikasi panggilan.
Itu saja. Rincian program kursus dapat ditemukan di webinar, yang akan diadakan pada 24 Januari.