unix是乙個多使用者的作業系統。每個使用者都有乙個id,用以唯一標識該使用者。這個id,被稱為uid。每個使用者都屬於某乙個組,組也有乙個id。這個id,被稱為組id,gid。
檔案所有者相關
檔案所有者id:擁有某檔案的使用者的id
檔案所有者組id:擁有某檔案的使用者所屬組的id
實際使用者id和實際組id
程序的實際使用者id:執行該程序的使用者的id
程序的實際組id:執行該程序的使用者所屬的組id
說白一點,實際使用者id和實際使用者組id:標識我是誰。也就是登入使用者的uid和gid,比如我的linux以simon登入,在linux執行的所有的命令的實際使用者id都是simon的uid,實際使用者組id都是simon的gid(可以用id命令檢視)。
第四種id:有效使用者id和有效組id
程序的有效使用者id:用於檔案訪問許可權的檢查
程序的有效組id:
程序用來決定我們對資源的訪問許可權。一般情況下,有效使用者id等於實際使用者id,有效使用者組id等於實際使用者組id。當設定-使用者-id(suid)位設定,則有效使用者id等於檔案的所有者的uid,而不是實際使用者id;同樣,如果設定了設定-使用者組-id(sgid)位,則有效使用者組id等於檔案所有者的gid,而不是實際使用者組id。
unix系統通過程序的有效使用者id和有效使用者組id來決定程序對系統資源的訪問許可權。
通過id命令我們可以看出當前的uid=1001,gid=1001。通過ls命令我們可以看出a.out程式沒有設定suid和sgid,所有者是worker1,所有組也是worker1。
執行test我們發現有效使用者id等於實際使用者id(1001),有效使用者組id等於實際使用者組id(1001)。
我們切換到root使用者執行,實際使用者id=0 ,有效使用者=0,同樣的,有效使用者id等於實際使用者id,有效使用者組id等於實際使用者組id。
我們給a.out設定了suid位 chmod u+s a.out
程序的有效使用者id等於檔案所有者的uid(1001),有效使用者組id還是等於實際使用者組id(0)。
設定suid位可以用於提權或者降權,具體見如下文章:
總結下來就是;
suid典型的應用就是passwd命令,使用此命令普通使用者也能以root的身份去讀寫shadow檔案。設定suid後,有效使用者id等於檔案所有者root的id,這樣普通使用者就可以用root的身份讀取shadow檔案了。
把程式(cat)的屬主改為普通使用者時,並設定suid後,即便是root去讀flag也會因為設定了suid,有效使用者id等於檔案所有者普通使用者,只能以普通使用者的身份去讀這個flag繼而提示許可權不夠被拒絕。
Unix第三章 檔案I O
012 stdin fileno stdout fileno stderr fileno include intopen const char path,int oflag mode t mode intopenat int fd,const char path,int oflag mode t m...
unix 網路程式設計 第三章
包裹函式 就是對有錯誤返回值的函式的封裝。在unix網路程式設計中用大寫表示。err sys 必須要errno 的值才能輸出錯誤?執行緒函式遇到錯誤的時候 不設定errno的值,而是把error的值作為函式的返回值。必須檢查某個確定的錯誤,並處理它,而不是終止程序執行。unix errno 值 每當...
C和指標 第三章 四種作用域
塊作用域 任何位於一對花括號之間是乙個 塊,塊內宣告的識別符號具有 塊作用域,巢狀 塊內,內部變數會遮蔽外部相同標示的標示符,非巢狀 塊,不會同時處於活動狀態所以不會遮蔽。int main printf d n value 123和456以及789是巢狀,會遮蔽123,456和789是非巢狀不互相影...