古詩詞大全網 - 個性簽名 - SELinux的標簽

SELinux的標簽

在支持SELinux的系統中,所有的進程都有壹個SELinux的標簽,查看進程的標簽可以用下面的命令:

下面是Android 8.1.0模擬器上執行這個命令的結果(去掉了kernel、init等開發中很少有需要修改的進程):

可以看到,主要的進程有這麽幾類

然後去/data/data目錄下看看文件/目錄的SELinux標簽:

基本上就是這麽兩類,壹些特殊的目錄有特殊的標簽。(其他目錄的標簽很多,看這個目錄下的標簽主要是app目錄帶有c512,c768不同於其他目錄的標簽段)

這些標簽都是由SELinux安全上下文文件定義,在如下文件中,定義了相關文件、設備、服務(名)等非進程類的對象標簽

java世界進程的SELinux標簽由seapp_contexts文件定義,zygote根據啟動java進程的相關信息,結合seapp_contexts中的條件來給java進程打SELinux TAG

這個文件定義了android默認的app安全上下文的標簽設置策略:

這些配置都會在Zygote fork出app進程時,調用selinux_android_setcontext的過程中去匹配

如隨便寫個minTargetSdkVersion>=26的hello world apk安裝進去啟動,顯然其user=_app seinfo!=platform(根據簽名判斷),根據編譯app TargetSdkVersion是否>=26 (沒有 minTargetSdkVersion=26 這個配置則表示minTargetSdkVersion=0 )最後會匹配到這壹條:

那麽該進程就被設置安全上下文標簽為u:r:untrusted_app:s0:c512,c768(c512,c768這個字段是根據levelFrom=user打的)

具體每個字段意思可以仔細閱讀seapp_contexts前面的註釋

其中有的配置項包含seinfo=platform這樣的,這個表示要匹配到這壹條的進程,必須擁有platform簽名,具體platform匹配什麽簽名在如下文件中定義

還可以自定義其他的seinfo對應不同的簽名來配置seapp_contexts。

其他上面提到的native進程如logd、servicemanager,native服務hal service,Android其他native 服務進程如surfaceflinger mediaserver等進程的標簽,主要由以下兩個方式設置:

另壹種拿surfaceflinger進程為例,其對應的策略文件:

有如下定義:

根據其宏定義展開

所以編譯後的init_daemon_domain(surfaceflinger)

第壹次展開為:

第二次展開為:

最終展開為:

所以類似surfaceflinger這種由init啟動的native進程/服務,其標簽要麽是init.rc中由seclable 命令指定 ,要麽是其對應的.te文件中由規則init_daemon_domain()宏聲明,由init進程域轉到了init_daemon_domain()聲明的域中。