Linux

關於已保存使用者 ID 的問題

  • July 20, 2020

據我了解,不同的使用者ID如下(從程序的角度來看):

  • 真實使用者ID:擁有該程序的使用者ID
  • 有效使用者ID:確定目前允許做什麼和不允許做什麼的使用者ID
  • 保存的使用者ID:基本上是原來的有效使用者ID,必要時可以恢復到原來的有效使用者ID

現在我有兩個問題:

  1. 在程序開始時將有效使用者ID保存在變數中不會使保存的使用者ID變得不必要嗎?
  2. 如何在 C 程序中檢索保存的使用者 ID?我找不到任何這樣做的功能。

在程序開始時將有效使用者 ID 保存在變數中不會使保存的使用者 ID 變得不必要嗎?

這不是使用者空間程序記住什麼的問題,而是核心允許它使用什麼權限的問題。為了使使用者之間的分離起作用,它必須是控制程序可以使用哪些使用者 ID 的系統。否則,任何程序都可能只是要求成為 root。

如何在 C 程序中檢索保存的使用者 ID?我找不到任何這樣做的功能。

使用標準功能,您不能(只有getuid()and geteuid())。不過,至少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.

引用自:https://unix.stackexchange.com/questions/548985