全面理解 Android 安全機制(Linux基礎)

發表於2015-09-01

Linux Sandbox 機制

Linux Sandbox(沙箱)機制,主要用於程式或程式隔離,限制不可信程式或程式的許可權,將程式或程式造成的不良後果降到最低。Sandbox 機制可以為不可信的程式提供虛擬化的記憶體、網路、外部儲存等資源;而對於使用者來說是透明的。

Sandbox在程式中的應用

  • 每個程式都有自己獨立的地址空間,MMU 硬體強制分離地址空間,每個程式都有自己的許可權邊界
  • 核心在系統中有強制的介面層(Kernel安全策略)
  • root使用者擁有至高許可權,其他使用者擁有自主訪問 DAC(Discretionary Access Control Model) 訪問許可權。

Linux 使用者

Linux 支援多使用者工作,每個使用者之間都使用了沙箱達到相互隔離,互不影響。

Linux 許可權機制

主要討論檔案許可權、UID、GID 和 Capability。

檔案許可權

檔案許可權有讀、寫和執行許可權,分別對應 r w x 這幾個字母。

如下一個例子。

-rwxr-xr-x 1 stackvoid_ming bt 23902 Jul 2 2014 repo

第一個 “-” 代表檔案型別,預設為普通檔案,若為 “d” 則代表目錄(dir)檔案, “l” 代表連結(Link)檔案。

第2位到第4位(即 rwx)代表的是此檔案擁有者的許可權,檔案擁有者有讀寫執行許可權。 第5位到第7位(即 r-x)代表的是 GROUP(使用者組)對這個檔案的許可權,這裡沒有寫許可權,有讀和執行許可權。 第8位到第10位(即 r-x)代表的是 Other(別的使用者,非檔案擁有者和非使用者組使用者),這裡有讀和執行的許可權。

UID/GID

UID: User Identifier;全稱使用者識別符號,在類UNIX系統中是核心用來辨識使用者的一個無符號整型數值,亦是UNIX檔案系統與程式的必要組成部分之一。

有效使用者ID(Effective UID,即EUID)與有效使用者組ID(Effective Group ID,即EGID)在建立與訪問檔案的時候發揮作用;具體來說,建立檔案時,系統核心將根據建立檔案的程式的EUID與EGID設定檔案的所有者/組屬性,而在訪問檔案時,核心亦根據訪問程式的EUID與EGID決定其能否訪問檔案。

真實使用者ID(Real UID,即RUID)與真實使用者組ID(Real GID,即RGID)用於辨識程式的真正所有者,且會影響到程式傳送訊號的許可權。沒有超級使用者許可權的程式僅在其RUID與目標程式的RUID相匹配時才能向目標程式傳送訊號,例如在父子程式間,子程式從父程式處繼承了認證資訊,使得父子程式間可以互相傳送訊號。

暫存使用者ID(Saved UID,即SUID)於以提升許可權執行的程式暫時需要做一些不需特權的操作時使用,這種情況下程式會暫時將自己的有效使用者ID從特權使用者(常為root)對應的UID變為某個非特權使用者對應的UID,而後將原有的特權使用者UID複製為SUID暫存;之後當程式完成不需特權的操作後,程式使用SUID的值重置EUID以重新獲得特權。在這裡需要說明的是,無特權程式的EUID值只能設為與RUID、SUID與EUID(也即不改變)之一相同的值。

檔案系統使用者ID(File System UID,即FSUID)在Linux中使用,且只用於對檔案系統的訪問許可權控制,在沒有明確設定的情況下與EUID相同(若FSUID為root的UID,則SUID、RUID與EUID必至少有一亦為root的UID),且EUID改變也會影響到FSUID。設立FSUID是為了允許程式(如NFS伺服器)在不需獲取向給定UID賬戶傳送訊號的情況下以給定UID的許可權來限定自己的檔案系統許可權。

GID(Group identifier)跟 UID 一樣,也是無符號整型數值。對某個檔案非擁有者,如果有組許可權,可以按照組許可權來訪問此檔案,一般來說組許可權要高於 OTHER,低於檔案擁有者許可權。

例如上面的例子:

-rwxr-xr-x 1 stackvoid_ming bt 23902 Jul 2 2014 repo

stackvoid_ming 指的就是 user id,bt 指的是 Group ID。

Capability

Linux系統分為root使用者和非root使用者,root使用者至高無上,想幹嘛幹嘛,至於非root使用者許可權有限,想root許可權,可以通過setuid實現。如果一個程式想要一個大於非root使用者許可權,只能將自己提升到root許可權;實際上此程式並不需要這麼多許可權,這可能會導致很多風險(一個程式許可權太大),所以POSIX制定了Capability機制來細分root的許可權。

目前核心(3.14,\include\uapi\linux\capability.h)有36個capability,未來根據需求會繼續增加。 Capability是可配選項,可以通過CONFIG_SECURITY_CAPABILITIES選項設定(kernel2.5.27之後,3.8後預設enable)。看似很美好的許可權細分,實際上大多數程式都還沒使用。

程式中的Capability實際上就是一堆點陣圖。例如:

CapInh:00000000000025C0

希望程式擁有什麼許可權(Capability),設定這裡對應的bit位即可。我們可以檢視/proc//status來檢視程式的capability。Capability 不是我們重點關心的,這裡點到即可,詳細可以參考這篇文件

Reference

wikipedia-UID Linux-capabilities

相關文章