Bukankah menyimpan ID pengguna yang efektif dalam variabel di awal program akan membuat ID pengguna yang disimpan tidak diperlukan?
Ini bukan pertanyaan tentang apa yang diingat oleh program userspace, tetapi hak apa yang diizinkan oleh kernel untuk digunakan. Agar pemisahan antara pengguna berfungsi, itu harus menjadi sistem yang mengontrol ID pengguna apa yang dapat digunakan oleh suatu proses. Kalau tidak, proses apa pun bisa saja meminta untuk menjadi root.
Bagaimana cara mengambil ID pengguna yang disimpan dalam program C? Saya tidak dapat menemukan fungsi apa pun yang melakukan itu.
Dengan fungsi standar Anda tidak bisa (hanya ada getuid()
dan geteuid()
). Setidaknya Linux memiliki getresuid()
yang mengembalikan ketiga ID pengguna.
Bagaimanapun, biasanya Anda tidak perlu membacanya. Itu ada untuk memungkinkan peralihan antara ID pengguna asli, dan ID pengguna efektif dalam hal program setuid, sehingga dimulai sebagai salinan ID pengguna efektif.
Dalam program setuid, ID pengguna sebenarnya adalah pengguna yang menjalankannya, dan ID pengguna yang efektif dan tersimpan adalah pengguna yang memiliki program tersebut. ID pengguna yang efektif adalah yang penting untuk pemeriksaan hak istimewa, jadi jika proses ingin mencabut hak istimewa untuk sementara, proses ini akan mengubah ID pengguna yang efektif antara ID pengguna yang asli dan yang disimpan.
Dengan cara apa kernel menggunakan ID pengguna yang disimpan untuk memeriksa apakah suatu proses dapat atau tidak dapat mengubah ID penggunanya? Apakah ini berarti bahwa ketika suatu proses mencoba mengubah ID pengguna efektifnya, kernel memeriksa ID pengguna yang disimpan untuk memastikan, proses diizinkan untuk melakukannya?
Ya. Halaman manual Linux untuk setuid()
menyebutkan ini, tetapi agak tersembunyi:
ERRORS
EPERM The user is not privileged and uid does not match the real
UID or saved set-user-ID of the calling process.
Dengan kata lain, Anda hanya dapat menyetel ID pengguna (efektif) ke salah satu ID asli atau tersimpan.
Halaman manual untuk setreuid()
lebih jelas tentang itu:
Unprivileged processes may only set the effective user ID to the real
user ID, the effective user ID, or the saved set-user-ID.