下面是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()聲明的域中。