Linux
關於已保存使用者 ID 的問題
據我了解,不同的使用者ID如下(從程序的角度來看):
- 真實使用者ID:擁有該程序的使用者ID
- 有效使用者ID:確定目前允許做什麼和不允許做什麼的使用者ID
- 保存的使用者ID:基本上是原來的有效使用者ID,必要時可以恢復到原來的有效使用者ID
現在我有兩個問題:
- 在程序開始時將有效使用者ID保存在變數中不會使保存的使用者ID變得不必要嗎?
- 如何在 C 程序中檢索保存的使用者 ID?我找不到任何這樣做的功能。
在程序開始時將有效使用者 ID 保存在變數中不會使保存的使用者 ID 變得不必要嗎?
這不是使用者空間程序記住什麼的問題,而是核心允許它使用什麼權限的問題。為了使使用者之間的分離起作用,它必須是控制程序可以使用哪些使用者 ID 的系統。否則,任何程序都可能只是要求成為 root。
如何在 C 程序中檢索保存的使用者 ID?我找不到任何這樣做的功能。
使用標準功能,您不能(只有
getuid()
andgeteuid()
)。不過,至少Linuxgetresuid()
可以返回所有三個使用者 ID。無論如何,通常您不需要閱讀它。在 setuid 程序的情況下,它允許在真實使用者 ID 和有效使用者 ID 之間切換,因此它作為有效使用者 ID 的副本開始。
在 setuid 程序中,真正的使用者 ID 是執行它的使用者的使用者 ID,有效和保存的使用者 ID 是擁有該程序的使用者的使用者 ID。有效使用者 ID 對權限檢查很重要,因此如果程序想要暫時放棄權限,它會在真實使用者 ID 和保存的使用者 ID 之間更改有效使用者 ID。
核心如何使用保存的使用者 ID 來檢查程序是否可以更改其使用者 ID?這是否意味著當程序試圖更改其有效使用者 ID 時,核心會檢查保存的使用者 ID 以確保允許該程序這樣做?
是的。Linux 手冊頁
setuid()
提到了這一點,但它有些隱藏:ERRORS EPERM The user is not privileged and uid does not match the real UID or saved set-user-ID of the calling process.
換句話說,您只能將(有效)使用者 ID 設置為真實或保存的 ID 之一。
手冊頁
setreuid()
對此更清楚:Unprivileged processes may only set the effective user ID to the real user ID, the effective user ID, or the saved set-user-ID.