/***********************************
* 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里做出最后的判斷
關於SEAndroidAndroid在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
參考文章: