/***********************************
* Author:劉江明
* Environment:MTK Android 6.0
* Date:2016年11月04日
***********************************/
一. 前述
在Android5.0之前SEAndroid並沒有真正地被啓用。真正比較關注SELinux與SEAndroid是從着手Android6.0開始。網上關於SELinux與SEAndroid的與不算多。概念又新又多,而且沒有一個統一的中文翻譯。剛開始一頭紮下去看了一頭霧水。在這裏,希望能用自己微薄的知識做一下通俗的總結,最關鍵的問題想通過實例如瞭解,這東西怎麼運用到實例裏面去。
在這裏看了很多文章,下面很多知道都是引用了很多大神的博客,也相當於稍做總結 。感謝這些大神的默默奉獻。
希望自己在後面能對Android的安全體系有一個完整的瞭解。目前,第一篇文章,先了解一下SELinux/SEAndroid的基礎概念,然後通過實例去分析。然後瞭解一下在Android系統源碼中,SELinux源碼中的簡單分佈,與如何在源碼打開Root權限和如果完全不編譯SEAndroid。最後是希望能進一步深入到源碼裏面去了解SEAndroid機制。這裏面涉及很廣,包括Zygote,packagemanagerservice,dalvik等等等。希望這些願景都能被實現
二. 關於SELinux與SEAndroid的基本概念
先簡述一下相關概念
1. 兩種安全機制DAC(Discretionary Access Control)和MAC(Mandatory Access Control)。通俗地講,這兩個機制的區別是。在DAC裏,如果一個應用獲取了一個用戶權限,如Root,那他的所有操作操作都是基於這個用戶權限。而MAC就簡單霸道好多,無論你是誰,甚至是有Root用戶權限,文件權限爲777,但每個動作都是需要被允許之後可以被執行。這裏可以是在安全策略文件中被允許,與可以是用戶手動允許
2. MAC機制基於LSM(Linux Security Module)標準實現。
3.
SELinux全稱Security-Enhanced Linux。SELinux在MAC上實現的,所以SELinux也是基於LSM標準。在Linux kernel 2.6後正式直接整合進Linux裏面
4. 第一條中提到MAC的安全策略文件的作用就是表明了允許幹什麼。學名是TEAC(Type Enforcement
Access Control)。簡稱TE。裏面的語言被稱爲強制類型語言。我們的目標就是學會如何何用這個文件
5. Security Context,安全上下文。Security Context的作用就是相當於這些文件和進程的“身份證”。
6. SELinux Mode,SELinux有兩種模塊Permissve Mode(寬容模式)和Enforcing Mode(強制模式)。區別在於Permissive只會打印SELinux Log。而強制模式會進行真正攔截。如果被攔截,kernel log中的關鍵字是"avc:denied"。可以在下面的文件節點查看SELinux是什麼模式,這裏返回了一個1,表示在enforce模式
上述1,2,3,4,5它們的關係是這樣的
上面這個圖沒有提到TE文件的關係。TE文件的規則和一些用戶主動允許的動作等等會存儲在圖中的database裏。
當有一個進程執行read動作(Event)被Security Server 監測到地時候,DAC會作初步的檢查。然後把動作的傳進LSM,同時,LSM會找到該進程和文件的上下文
前面說了SELinux基於LSM實現。SELinux在初始化的時候會實現一些由LSM提供的抽象函數(abstract)和把一些LSM回調(Hook)註冊進LSM。LSM會讀取SELinux裏database的TE規則,或者在AVC(AccessVector cache)裏尋找相應的規則。AVC相當於一個規則的緩存,加快讀取的速度。找到相應的規則後又把它傳回LSM,在LSM裏做出最後的判斷
關於SEAndroid
Android在SELinux的基礎上擴展了SEAndroid,其實兩者在原理上差不多,但是SEAndroid面向的對象就是更豐富了,後面會介紹。需要了解的是google到了Android 5.0之後才完全深度整合了SELinux和SEAndroid。具體進程如下:
三. SELinux與SEAndroid的基礎知識
1. SELinux兩個最基本的對象是主體(Subject)和客體(Object)。主體和客體分別對應的是“進程”和“文件”。這裏的文件並不單指的是實際存在的文件,而是指Linux裏“一切皆文件”裏指的文件。如Socket,系統屬性等。
2. 在SEAndroid,對主體和客體進行了進一步形式上的封裝和擴展,其實差不多。SEAndroid裏細分爲:系統文件,服務,系統屬性,Bindert和Socket。這裏的系統屬性指的是build.prop裏的屬性,也是getprop命令查詢出來的屬性。我們後面就是針對這幾個對象進行實例分析
3. 在adb裏執行下面的命令可以查看主體和客體的安全上下文。
查看客休(文件)的安全上下文 ls -Z
查看主體(進程)的安全上下文ps -Z
其中文件的安全上下文 “u:object_r:rootfs:s0”具體表示如下
U:一個名爲U的SELinux用戶
object_r:這個標誌位在進程裏表示的是一個用戶角色(role)但是文件無扮演任何角色,這僅是一個文件的標識
rootfs:這是一個type的標誌位,也是TE裏最重要的一個標示位。不然怎麼稱爲TE(Type Enforcement)
s0:LSM的級別
進程的安全上下文“u:r:init:s0”。就第二位與文件的不同,r 全稱role,表示的是一個用戶角色。第三位同樣表示類型(type)也是最重要的
從上面可以看出,Linux用於安全機制的元素有好幾種,用戶,角色,類型,安全等級。這幾種元素在某些場合,還是會被用到,但對於LSM和SELinux最重要的還是type。所以後面的關注點在於主體和客體的type。
關於角色的一點介紹
-
//通過external/sepolicy/users和external/sepolicy/roles文件的內容,我們就可以看到SEAndroid所定義的SELinux用戶和SELinux角色。
-
//文件external/sepolicy/users的內容如下所示:
-
user u roles{
r} level s0 range s0- mls_systemhigh;
-
-
//上述語句聲明瞭一個SELinux用戶u,它可用的SELinux角色爲r,它的默認安全級別爲s0,可用的安全級別範圍爲s0~mls_systemhigh,其中,mls_systemhigh爲系統定義的最高安全級別。
-
//文件external/sepolicy/roles的內容如下所示:
-
role r;
-
role r types domain;
-
//第一個語句聲明瞭一個SELinux角色r;第二個語句允許SELinux角色r與類型domain關聯。
---------摘自《SEAndroid安全機制框架分析》
關於安全等級,只要知道兩個原則“read down”和"write up"。即低安全級可以往高安全級的寫東西,高安全級的可以往低安全級的讀東西,反過來則不可以,同級的可以相互讀寫。《深入理解SELinux SEAndroid之二》一文中對安全級有很詳細的介紹。
以下的薦書摘自“阿拉丁神農”和“羅昇陽”大神的博客
1 SELinux NSA’s Open Source Security Enhanced Linux:
下載地址:http://download.csdn.Net/detail/innost/6947063
評價:講得SELinux版本比較老,不包括MLS相關內容。但是它是極好的入門資料。如果你完全沒看懂本文,則建議讀本文。
2 SELinux by Example Using Security Enhanced Linux:
下載地址:http://download.csdn.net/detail/innost/6947093
評價:這本書比第1本書講得SELinux版本新,包括MLS等很多內容,幾乎涵蓋了目前SELinux相關的所有知識。讀者可跳過1直接看這本書。
3 The_SELinux_Notebook_The_Foundations_3rd_Edition:
下載地址:http://download.csdn.net/detail/innost/6947077
評價:這是官方網站上下的文檔,但它卻是最不適合初學者讀的。該書更像一個彙總,解釋,手冊文檔。所以,請務必看完1或2的基礎上再來看它。
4 Security Enhanced (SE) Android: Bringing Flexible MAC to Android