Jawaban:
Anda mungkin tahu normal membaca, menulis, dan mengeksekusi izin untuk file di unix.
Namun, dalam banyak aplikasi, jenis struktur izin ini - misalnya memberikan pengguna tertentu izin penuh untuk membaca file yang diberikan, atau tidak ada izin sama sekali untuk membaca file - terlalu kasar. Untuk alasan ini, Unix menyertakan bit izin lainnya, set-user-ID
bit tersebut. Jika bit ini ditetapkan untuk file yang dapat dieksekusi, maka setiap kali pengguna selain pemilik mengeksekusi file, pengguna memperoleh semua hak baca / tulis / jalankan hak istimewa pemilik dalam mengakses salah satu file pemilik lain!
Untuk mengatur bit set-user-ID untuk file, ketik
chmod u+s filename
Pastikan bahwa Anda telah menetapkan izin eksekusi grup-lainnya juga; alangkah baiknya memiliki izin baca grup-lainnya juga. Semua ini bisa dilakukan dengan pernyataan tunggal
chmod 4755 filename
Ini juga disebut sebagai UID Tersimpan. File yang diluncurkan yang memiliki Set-UID bit aktif, UID yang disimpan akan menjadi UID pemilik file. Jika tidak, UID yang disimpan akan menjadi UID Nyata.
UID ini digunakan untuk mengevaluasi hak istimewa proses untuk melakukan tindakan tertentu. EUID dapat diubah menjadi UID Riil, atau Superuser UID jika EUID! = 0. Jika EUID = 0, itu dapat diubah menjadi apa saja.
Contoh dari program tersebut adalah passwd
. Jika Anda mendaftar secara penuh, Anda akan melihat bahwa ia memiliki bit Set-UID dan pemiliknya adalah "root". Ketika pengguna normal, katakan "mtk", berjalan passwd
, itu dimulai dengan:
Real-UID = mtk
Effective-UID = mtk
Saved-UID = root
man credentials
adalah sumber informasi yang baik dalam kasus ini. Lihat juga pertanyaan ini di SO . Untuk penjelasan sejarah, lihat posting arsip ini .
Daripada menyebut mekanisme "set UID" dan "UID efektif", keseluruhan konsep UID harus disebut itu. Alasan keberadaan berbagai UID adalah berbagai masalah dengan pemisahan hak istimewa. Bahkan pengguna reguler (yang tidak memiliki hak istimewa) kadang-kadang perlu melakukan hal-hal (sumber daya akses) yang hanya dapat dilakukan oleh pengguna yang memiliki hak istimewa. Untuk mencapai ini dengan mudah, program dapat mengubah UID mereka. Ada 3 jenis:
UID nyata - UID yang memiliki proses
UID efektif - UID yang saat ini dijalankan oleh proses - ini menentukan kemampuan aktual proses pada saat tertentu. Ini juga yang ps
menunjukkan Anda di bidang USER.
save set UID - placeholder yang digunakan untuk berpindah-pindah antara UID yang nyata dan efektif
Kebutuhan untuk yang terakhir muncul dari kenyataan, bahwa pengguna biasa hanya dapat beralih di antara ketiganya dan tidak ada yang lain dan program setuid biasanya perlu tahu, entah siapa pengguna yang memuatnya (ditambah UID yang asli tidak boleh diubah karena itu akan membuat kekacauan lebih besar).
mtk expalanation adalah yang bagus.
The passwd
contoh adalah salah satu dari eskalasi hak istimewa - passwd selalu berjalan sebagai root karena harus mengubah file yang hanya root diperbolehkan untuk mengubah. Ini membuatnya penting bahwa passwd executable tidak rentan terhadap buffer overflows, dll, sedemikian rupa sehingga pengguna normal yang pintar mungkin bisa menggunakannya untuk penggunaan yang tidak dimaksudkan.
Alasan lain adalah untuk melindungi pengguna dengan cara yang sama seperti yang mungkin Anda gunakan su
jika Anda login sebagai root - untuk mengurangi atau membatasi hak istimewa Anda untuk tugas tertentu, bukan meningkatkannya. Sebagai contoh, jika saya memiliki izin untuk memulai layanan daemon yang tidak memerlukan akses ke barang-barang saya dan memiliki barang-barangnya sendiri, yang hanya itu yang dibutuhkan (mis., Logger), menjalankannya suid akan berarti ia hanya memiliki akses ke barang-barang itu dan bukan milikku atau orang lain.
Perhatikan bahwa dimungkinkan untuk mengatur uid secara terprogram bahkan jika bit suid tidak diatur pada executable , bagaimanapun, itu tidak akan berfungsi untuk eskalasi. Yaitu., Jika Anda adalah pengguna normal dan menulis program yang menetapkan uid di beberapa titik itu sendiri, program itu tidak dapat beralih ke root. Apache bekerja dengan cara ini, saya percaya. Ini biasanya dimulai dengan root dan memiliki satu proses yang kemudian bercabang anak-anak yang beralih uid ke pengguna non-privelleged (misalnya, "httpd"). Proses-proses anak tersebut adalah apa yang sebenarnya dilakukan oleh server web.