Linux中的UID,EUID,SUID

  在做Android系統源碼的時候,裏面的權限管理,經常涉及到這些,可以說是Android權限機制的基礎,但是理解的不透徹。先看看Linux中這幾個概念,暫不關注Android中這些ID的利用。
  下面分別用RUID, EUID,SUID來表示實際用戶ID,有效用戶ID,設置用戶ID。另外用戶ID是個整型數,爲了說明方便真接使用了用戶名來代表不同的UID。先解釋一下這幾個ID的作用:

  RUID, 即UID,用於在系統中標識一個用戶是誰,當用戶使用用戶名和密碼成功登錄後一個Linux系統後就唯一確定了他的RUID。

  EUID, 用於系統決定用戶對系統資源的訪問權限,通常情況下等於RUID。

  SUID,用於對外權限的開放。跟RUID及EUID是用一個用戶綁定不同,它是跟文件而不是跟用戶綁定。

  我們知道linux系統的密碼都存在了/etc/shadow這個文件裏。查看/etc/shadow文件的屬性如下:

steve@ubuntu:~$ ll /etc/shadow
-rw-r----- 1 root shadow 1035 Mar 30 08:19 /etc/shadow

  從上可以看出/etc/shadow文件是一個屬於root用戶及shadow 組的文件,並且只有EUID爲root的用戶具有讀寫的權限,shadow 組的具有讀權限。
  當你在steve用戶(EUID此時也爲steve)的shell下試圖用vim打開這個文件時會提示權限不允許。
  用過UNIX系統的人都知道,任何一個用戶都可以使用passwd這個命令來得新設定自己的密碼。但從上面已經知道,非root用戶是無法讀這個文件的,那麼普通用戶是如何做到修改這個文件的呢?我們知道passwd這個命令實際執行的程序是/usr/bin/passwd, 查看這個文件屬性如下:

-rwsr-xr-x 1 root root 41284 Apr  8  2012 /usr/bin/passwd* 

  對應文件存取標誌的s位就是通常說的SUID位,另外可以看到所有用戶都有執行的這個程序權力。當steve用戶執行passwd命令的時候。Shell會fork出一個子進程,此時進程的EUID還是steve,然後exec程序/usr/bin/passwd。exec會根據/usr/bin/passwd的SUID位會把進程的EUID設成root, 此時這個進程都獲得了root權限, 得到了讀寫/etc/shadow文件的權限, 從而steve用戶可完成密碼的修改。 exec退出後會恢復steve用戶的EUID爲steve,這樣就不會使steve用戶一直擁有root權限。暫時的進行了權限的提升。

  我們可以測試一下,用root用戶把/usr/bin/passwd的SUID位去掉,如下:

steve@ubuntu:~$ sudo chmod u-s /usr/bin/passwd 
steve@ubuntu:~$ ll /usr/bin/passwd
-rwxr-xr-x 1 root root 41284 Apr  8  2012 /usr/bin/passwd*

  然後steve用戶用命令passwd去更新密碼會提示如下錯誤:

steve@ubuntu:~$ passwd
Changing password for steve.
(current) UNIX password: 
Enter new UNIX password: 
Retype new UNIX password: 
passwd: **Authentication token manipulation error**
passwd: password unchanged

  這就是因爲/usr/bin/passwd程序的SUID去掉後,steve用戶雖然可以執行該程序,但因爲/usr/bin/passwd/的SUID沒有設置,這樣exec後進程的EUID仍爲steve的原因。

  另外也許有人會發現普通的文件文件普通的文本文件會也可以設置SUID位, 但這是沒有意義的,因爲文本文件沒有地方執行seteuid()的系統調用來改變當用用戶的EUID。

  最後,這裏的對用戶ID的規則同樣也適用了組ID。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章