實際使用者ID,有效使用者ID,儲存 設定 使用者ID

2021-06-09 15:20:26 字數 1998 閱讀 1066

如果當前程序具有超級許可權則:

呼叫setuid(uid)時,該程序可以將自己的:實際使用者id,有效使用者id,儲存的set-user-id設定成其引數uid的值。既是說,特權使用者程序可以將自己改變成任意程序。

如果當前程序是非特權使用者則:

呼叫setuid(uid)時,如果uid是其實際使用者id或儲存的set-user-id,就把有效使用者id設定成uid的值;如果uid不等於這兩個值則將errno設定成eperm(可供用perror()使用),並出錯返回。既是說,非特權使用者不能隨意改變自己,這裡涉及到儲存的set-user-id,所以後面再詳細說。

乙個系統啟動後,使用者從login登入後,會產生乙個使用者程序,該程序和所有程序一樣有七個id值:實際使用者id,有效使用者id,儲存的set-user-id,實際組id,有效組id,新增組id,儲存的set-group-id,這裡只說uid的問題,這3個uid來自我們登入名。(這中間的建立過程我想明白再說)至此我們有了乙個使用者shell程序,當執行程式時,通常由fork+exec族函式來做。由使用者程序fork出來的子程序繼承父程序的實際uid,和有效uid值(還要繼承一些東西,在此先遮蔽掉),子程序再呼叫exec族,呼叫時:如果檔案的set-user-id沒有置位(st_mode中),那這個子程序的實際uid,有效uid不變,儲存的set-user-id從有效使用者id複製。如果檔案的set-user-id置位,那這個子程序的實際uid不變,有效uid設定為程式檔案的使用者id,儲存的set-user-id從有效使用者id複製。

檔案的set-user-id位應該只能由所有者置位,特權使用者可以置位所有檔案。

說一下正常setuid函式的作用:

引用apue上的例子(經過簡化改遍):有乙個檔案a所有者為root,我們需要對它進行操作,但該檔案只允許root操作。所以系統又提供乙個程式用來操作這個檔案,該程式通過給定的幾個受限操作來限制使用者,並且所有者為root,且set-user-id置位。

1),那我們執行次程式後程序中:

實際使用者id=普通

有效使用者id=root

儲存的set-user-id=root

2),程式去操作檔案a,因為程式有效使用者id是root,所以可以操作。

3),然後程式執行setuid(getuid()),此時程序:

實際使用者id=普通

有效使用者id=普通

儲存的set-user-id=root

此時程序就不再有特權。

4),當執行完一些操作後又要操作檔案a,則程式執行setuid(rootid),這裡的rootid是程式儲存的rootid,可以通過複製程序的儲存的set-user-id得來。此時程序:

實際使用者id=普通

有效使用者id=root

儲存的set-user-id=root

5),現在程式又可以操作檔案a了

綜述:有效使用者id在需要時變成特權id,不需要時通過setuid(getuid())變回實際使用者id,失去特權,這樣特權uid只用在最需要的時候,可以一定程度增強安全性。可以想象如果檔案a是乙個鎖,經歷這5部剛好是:加鎖--操作--解鎖的過程(實際apue上也是將檔案a說成是乙個鎖,我將它簡化了)。事實上使用者對密碼的修改也是這樣做的。

再說一下setuid的非正常作用:

乙個普通使用者如果想寫乙個程式,裡面包括了setuid(uid)函式,並將其set-user-id置位,那麼即使執行自己這個程式,他也擴充套件不了許可權,因為執行程式時,使用者程序的幾個uid都是自己,執行程式後,實際使用者id還是被置為自己,到程式中的setuid(uid)時setuid()的uid只能來自該程序的實際uid和儲存的set-user-id,這個函式的這個特性就限制了當前非特權程序不能通過自己來越權。但是如果有乙個程式,它的所有者是root,且有緩衝區溢位問題,且檔案的set-user-id位被root置位,那麼普通使用者執行這樣的程式時,實際使用者id被設定成root,當前程序的三個uid分別為:實際使用者id為普通使用者,有效使用者id為root,儲存的set-user-id為root,此時如果通過改變程序的流,去執行乙個程式,那麼它將以root的身份執行這個程式,因為很多程式是通過檢查有效使用者id(不是實際使用者id)識別使用者身份。

有效使用者ID 實際使用者ID

實際使用者id,有效使用者id和設定使用者id 看unix相關的書時經常能遇到這幾個概念,但一直沒有好好去理清這幾個概念,以致對這幾個概念一直一知半解。今天好好區分了一下這幾個概念並總結如下。說白了這幾個uid引出都是為了系統的許可權管理。下面分別用ruid,euid,suid來表示實際使用者id,...

實際使用者ID,有效使用者ID及設定使用者ID

原文 看unix相關的書時經常能遇到這幾個概念,但一直沒有好好去理清這幾個概念,以致對這幾個概念一直一知半解。今天好好區分了一下這幾個概念並總結如下。說白了這幾個uid引出都是為了系統的許可權管理。下面分別用ruid,euid,suid來表示實際使用者id,有效使用者id,設定使用者id。另外使用者...

實際使用者ID,有效使用者ID及設定使用者ID

實際使用者id,有效使用者id和設定使用者id 看unix相關的書時經常能遇到這幾個概念,但一直沒有好好去理清這幾個概念,以致對這幾個概念一直一知半解。今天好好區分了一下這幾個概念並總結如下。說白了這幾個uid引出都是為了系統的許可權管理。下面分別用ruid,euid,suid來表示實際使用者id,...