Android安全模型之Linux安全模型

Android系統以Linux內核爲基礎,理解Android的安全設計首先要理清Linux安全模型的主要概念與元素,包括用戶與權限,進程與內存空間等。shell

用戶與權限安全

Linux安全模型的基礎是用戶與用戶組。Linux的用戶由用戶名與用戶標識(UID)表示。用戶可同時參與多個用戶組,每一個用戶組由組標識(GID)表示。網絡

Linux系統定義有三類用戶:socket

  • 超級用戶(root),具備最高的系統權限,UID爲0ui

  • 系統僞用戶,Linux操做系統出於系統管理的須要,但又不肯賦予超級用戶的權限,須要將某些關鍵系統應用文件全部權賦予某些系統僞用戶,其UID範圍爲 1~499。系統的僞用戶不能登陸系統。spa

  • 普通用戶,只具有有限的訪問權限,UID爲 500~6000,能夠登陸系統得到shell。操作系統

爲控制不一樣的用戶對不一樣系統資源的訪問,Linux操做系統使用用戶權限機制實現此目的。在Linux權限模型下,每一個文件屬於一個用戶和一個組,由UID與GID標識其全部權。針對於文件的具體訪問權限定義爲可讀(r)可寫(w)可執行(x),並由三組讀,寫,執行組成的權限三元組來描述相關的權限。第一組定義文件全部者(用戶)的權限,第二組定義同組用戶(GID相同但UID不一樣的用戶)的權限,第三組定義其餘用戶的權限(GID與UID都不一樣的用戶)。好比在shell使用交互命令「ls -l <文件名>」 能夠得到文件的相應權限設置:命令行

$ ls -l /bin/foobar
-rwxr-xr--   1  root  wheel  20540  Oct 26 22:49  /bin/foobar

字段-rwxr-xr--中的首字符(-)爲文件 /bin/foobar的類型,還多是以下字符,表示不一樣的文件類型設計

  • "d":目錄code

  • "l":符號連接

  • "c":字符設備文件

  • "b":塊設備文件

  • p」:pipe管道

  • "s":socket套接字

在字段-rwxr-xr--首字符以後,爲3個三元組,即rwx的組合,"-"表示無相應權限。例如:

  • 第一組rwx表示文件全部者(此處爲root)能夠進行讀,寫,執行的操做。

  • 第二組r-x表示文件組用戶(此處爲wheel組的用戶)沒有寫權限,但有可讀和執行權限。

  • 第三組r--表示任何其它用戶對本文件的權限,即只可讀,沒有寫與執行的權限。

可是,Linux對於可執行的文件還有特殊的權限許可標識,即所謂的suidsgid,以及「粘滯位」(sticky bit)。這3個元素實際成爲上述權限三元組以外的第四個組,以(suid,sgid,stickybit)的方式存在。因爲特殊權限致使「特權」,若無特殊需求,不該該啓用這些權限,避免出現嚴生安全漏洞!

進程與內存空間

Linux是一個多用戶與多進程的操做系統,容許多個用戶同時運行各自隔離的多個應用進程,而且經過用戶及權限對用戶資源進行隔離與保護。

Linux的用戶,進程,內核,設備之間的關係以下圖:


  • Linux內核容許多個用戶同時存在並運行不一樣的進程。

  • 每一個用戶擁有多個同時運行的進程,多個進程分別屬於不一樣的用戶。

  • 全部進程(不管是否屬於同一用戶)各自運行於獨立的內存空間。

  • 用戶進程經過系統調用接口訪問操做系統的服務。

  • 操做系統內核經過設備驅動訪問硬件設備與資源,如數據存儲與網絡設備等。

在技術上,Linux利用現代計算機中央處理器(CPU)的內存管理單元(MMU)將系統內存分爲內核區用戶區。操做系統內核自己運行於內核區,而用戶進程運行於用戶區。在加載進程時,操做系統將進程的可執行映像(代碼和數據)映射到虛擬內存空間的用戶區,將操做系統內核代碼與數據映射到虛擬地址空間的內核區。Linux虛擬內存管理將內核區與用戶區的訪問權限設置爲不一樣級別,操做系統內核具有最高的虛擬內存訪問權限,而進程在運行時能訪問的存儲空間只限於其可見的虛擬內存空間的用戶區。進程的虛擬內存空間的用戶區包含着進程自己的程序代碼和數據,可細分爲代碼段,數據段,堆,棧,以及進程運行的環境變量,命令行參數傳遞區域 等。

Linux的進程虛擬地址與物理地址的映射關係及進程鏡像的內存地址分配以下圖所示:

可總結爲:

  • 進程有本身獨立的虛擬內存空間,由內核區和用戶區組成,映射入物理內存。

  • 在進程的虛擬內存內核區,操做系統內核的代碼和數據等被映射到內核區,從而使進程在運行中獲得操做系統的支持。內核區老是映射到物理內存的低地址空間

  • 在進程的虛擬內存用戶區,進程的可執行映像(代碼與數據)映射到虛擬內存的用戶區,即進程用戶區由進程的程序代碼和數據組成。用戶區映射到物理地址內核映射區以上的任意地址空間

  • 虛擬內存地址的訪問權限,操做系統將進程虛擬內存空間內核區的訪問權限設置爲0級,用戶區爲3級;內核訪問虛擬內存的權限爲0級,而進程訪問虛擬內存的權限爲3級。因此進程代碼永遠不能訪問內核區的代碼與數據

所以,Linux操做系統的進程內存管理確保一個進程沒法訪問其餘進程的內存空間,沒法污染其餘進程的內存空間,進而保證應用進程,不管惡意或無心,都沒法侵入操做系統空間及其餘進程的內存空間更改代碼以得到更高權限。

相關文章
相關標籤/搜索