Ada dua kasus,
- Anda ingin menghentikan sementara hak akses root saat menjalankan program setuid
- Anda ingin menghapus hak istimewa root secara permanen saat menjalankan program setuid...
- Anda dapat melakukannya untuk sementara dengan menyetel euid ke id pengguna asli dan kemudian mengubah uid menjadi apa pun yang Anda inginkan. Dan nanti ketika Anda membutuhkan hak istimewa root kembali, Anda dapat menyetel ke root dan userid yang efektif akan berubah kembali menjadi root . Ini karena id pengguna yang disimpan tidak diubah.
- Anda dapat menghapus hak istimewa secara permanen dengan langsung mengubah uid menjadi id pengguna dengan hak istimewa yang lebih rendah. Setelah ini, apa pun yang terjadi, Anda tidak dapat memperoleh kembali hak istimewa root.
Kasus 1:
Setelah program setuid mulai dijalankan
1.seteuid(600);
2.setuid(1000);
3.setuid(0);
Untuk kasus ini, hak istimewa root dapat diperoleh kembali.
+----+------+------------+
| uid|euid |saved-uid |
|----|------|------------|
1.|1000| 0 | 0 |
2.|1000| 600 | 0 |
3.|1000| 1000 | 0 |
4.|1000| 0 | 0 |
| | | |
+------------------------+
Kasus 2:
Setelah program setuid mulai dijalankan ,
1.setuid(1000);
2.setuid(0);
+----+------+------------+
| uid|euid |saved-uid |
|----|------|------------|
1.|1000|0 | 0 |
2.|1000|1000 | 1000 |
| | | |
+------------------------+
Dalam hal ini Anda tidak dapat memperoleh kembali hak akses root. Hal ini dapat diverifikasi dengan perintah berikut,
kucing /proc/PROCID/tugas/PROCID/status | kurang
Uid: 1000 0 0 0
Gid: 1000 0 0 0
Perintah ini akan menampilkan Uid dan Gid dan akan memiliki 4 bidang (tiga bidang pertama adalah yang menjadi perhatian kami). Sesuatu seperti di atas
Ketiga bidang tersebut mewakili uid,euid dan stored-user-id. Anda dapat memperkenalkan jeda (input dari pengguna) dalam program setuid Anda dan memeriksa setiap langkah cat /proc/PROCID/task/PROCID/status | less
memerintah. Selama setiap langkah, Anda dapat memeriksa apakah uid yang disimpan berubah seperti yang disebutkan.
Jika Anda euid adalah root dan Anda mengubah uid, hak istimewa akan dihapus secara permanen. Jika id pengguna yang efektif bukan root maka id pengguna yang disimpan tidak akan pernah disentuh dan Anda dapat memperoleh kembali hak istimewa root kembali kapan pun Anda mau dalam program Anda.
DESKRIPSI setuid() menetapkan ID pengguna efektif dari proses pemanggilan. Jika UID efektif pemanggil di-root, UID asli dan set-user-ID yang disimpan juga akan disetel.
Di Linux, setuid() diimplementasikan seperti versi POSIX dengan fitur _POSIX_SAVED_IDS. Hal ini memungkinkan program set-user-ID (selain root) untuk melepaskan semua hak istimewa penggunanya, melakukan beberapa pekerjaan yang tidak memiliki hak istimewa, lalu menggunakan kembali ID pengguna asli yang efektif dengan cara yang aman.
Jika pengguna adalah root atau programnya adalah set-user-ID-root, perhatian khusus harus diberikan. Fungsi setuid() memeriksa ID pengguna yang efektif dari pemanggil dan jika itu adalah pengguna super, semua ID pengguna terkait proses diatur ke uid. Setelah ini terjadi, program tidak mungkin mendapatkan kembali hak akses root.
Dengan demikian, program set-user-ID-root yang ingin untuk sementara melepaskan hak akses root, mengasumsikan identitas pengguna yang tidak memiliki hak istimewa, dan kemudian mendapatkan kembali hak akses root sesudahnya tidak dapat menggunakan setuid(). Anda dapat melakukannya dengan seteuid(2).
(dari Manual Pemrogram Linux, 21-09-2014, halaman setuid.2
)
Hai! Fungsi ini sulit digunakan dengan benar.
Halaman manual menyatakan bahwa setuid akan mengubah uid yang nyata, tersimpan dan efektif. Jadi setelah pemanggilan setuid(1000), ketiganya berubah menjadi 1000.
Itulah yang terjadi jika dan hanya jika Anda euid 0. Pada saat Anda memanggil setuid(0)
, namun, Anda euid 1000 dan diselamatkan uid 0 (centang getresuid(2)
, Misalnya). Itu sebabnya Anda bisa mendapatkan kembali hak istimewa.