setuid()與setgid() -- 設置 UID 和 GID

用 setuid() 設置實際用戶 UID 和有效用戶 UID。
用 setgid() 設置實際組 ID 和有效組 ID。
兩個函數聲明如下
setuid()與setgid() <wbr>-- <wbr>設置 <wbr>UID <wbr>和 <wbr>GID
在使用該函數時會遇到以下情況:
1. 若進程有 root 權限,則函數將實際用戶 ID、有效用戶 ID 設置爲參數 uid 。使用 root 運行下面代碼:
setuid()與setgid() <wbr>-- <wbr>設置 <wbr>UID <wbr>和 <wbr>GID
運行輸出:
引用
# ./setuid.exe 1001
real uid: 0
effective uid: 0
real uid: 1001
effective uid: 1001

由此可見,在 root 下,實際用戶 ID 和有效用戶 ID 均被設爲 setuid() 的參數 uid 的值。

2. 若進程不具有 root 權限,那麼普通用戶使用 setuid() 時參數 uid 只能是自己的,沒有權限設置別的數值,否則返回失敗:
引用
$ ./setuid.exe 1001
real uid: 1000
effective uid: 1000
setuid error: Operation not permitted
real uid: 1000
effective uid: 1000


由以上可以看出,只有超級用戶進程才能更改實際用戶 ID 。所以一個非特權用戶進程不能通過 setuid 或 seteuid 得到特權用戶權限。但是 su 命令卻能使一個普通用戶變成特權用戶。這並不矛盾,因爲 su 是一個 "set_uid" 程序。執行一個設置了 "set_uid" 位的程序時,內核將進程的有效用戶 ID 設置爲文件屬主的 ID(root 的 ID)。而內核檢查一個進程是否具有訪問某權限時,是使用進程的有效用戶 ID 來進行檢查的。su 程序的文件屬主是 root,普通用戶運行 su 命令時,su 進程的權限是 root 權限。 

Warning:對於調用了 setuid() 函數的程序要格外小心,當進程的有效用戶 ID 即 euid 是 root 用戶時,如果調用 setuid() 使 euid 爲其他非 root 用戶,則該進程從此就不具有超級用戶權限了。看下面代碼:
setuid()與setgid() <wbr>-- <wbr>設置 <wbr>UID <wbr>和 <wbr>GID
我們使用 root 編譯上面的程序,並運行 chmod u+s 給程序添加 suid 位,然後以普通用戶來運行它。
在上面程序中,在運行 setuid (1000) 函數時,我們還是具有 root 權限的,所以該函數會設置成功。正是因爲有了 root 權限,所以 3 個 ID (真實用戶ID,已保存用戶ID,有效用戶ID)都會被設置爲 1000。所以此後程序已經被降權爲普通用戶,想再  seteuid (0) 已經不可能。

可以這樣使用 stuid() 函數
開始時,某個程序需要 root 權限玩成一些工作,但後續的工作不需要 root 權限。可以將該可執行程序文件設置 set_uid 位,並使得該文件的屬主爲 root。這樣,普通用戶執行這個程序時,進程就具有了 root 權限,當不再需要 root 權限時,調用 setuid( getuid() ) 恢復進程的實際用戶 ID 和有效用戶 ID 爲執行該程序的普通用戶的 ID 。對於一些提供網絡服務的程序,這樣做是非常有必要的,否則就可能被攻擊者利用,使攻擊者控制整個系統。

對於設置了 set_uid 位的可執行程序也要注意,尤其是對那些屬主是 root 的更要注意。因爲 Linux 系統中 root 用戶擁有最高權力。黑客們往往喜歡尋找設置了 set_uid 位的可執行程序的漏洞。這樣的程序如果存在緩衝區溢出漏洞,並且該程序是一個網絡程序,那麼黑客就可以從遠程的地方輕鬆地利用該漏洞獲得運行該漏洞程序的主機的 root 權限。即使這樣的成不是網絡程序,那麼也可以使本機上的惡意普通用戶提升爲 root 權限。

(來自:http://blog.sina.com.cn/s/blog_701371290100yetd.html)
發佈了23 篇原創文章 · 獲贊 0 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章