詳解Android Selinux 許可權及問題
由於現做的是MTK平臺,原始碼路徑基於MTK, 不過高通大同小異
說明
Android 5.0以後完全引入了 SEAndroid/SELinux 安全機制,這樣即使擁有 root 許可權或 chmod 777 ,仍然無法再JNI以上訪問核心節點。
其實在 Android 4.4 就有限制的啟用此安全機制了。後面內容都按照 5.0 以後介紹,4.4 會有些許差異。
SELinux Mode
SELinux 分為兩種模式,Android 5.0 後所有程序都使用 enforcing mode。
1 2 |
|
SELinux Policy檔案路徑
1 2 3 4 5 6 |
|
編譯時將以合併的方式將廠家policy追加到Google原生。
Log
沒有許可權時可以在核心找到如下 log :
1 2 3 4 5 6 7 8 9 10 11 12 |
|
kernel中關閉
1 2 |
|
SELinux Sepolicy中新增許可權
修改相應源型別.te檔案(基本以源程序名命名),新增如下一行語句:
1 2 3 4 5 6 7 8 9 |
|
通常很少修改Google default 的policy, 推薦更新mediatek 下面的相關的policy.
新建節點
如果是自己新建的節點,需要在 sepolicy 路徑下的 file_contexts 檔案中做如下新增:
1 2 |
|
Android 5.0 修改的檔案為device.te 和 file_contexts.be,而且device/mediatek/common/BoardConfig.mk 中的 BROAD_SEPOLICY_UNION 增加對應的xxxx.te。
編譯
1 2 3 4 5 6 |
|
ps新增許可權後的neverallowed衝突
編譯報錯:
libsepol.check_assertion_helper: neverallow on line xxx ofexternal/sepolicy/domain.te ……
原因:
新新增的sepolicy專案違反了domain.te 中規定的的總策略原則。所以該條許可權策略不能新增,如果強行新增的話有CTS測試失敗的風險。
解決方法:
1.從執行log中找到要訪問的目標名稱,一般是name欄位後的名稱
avc: denied { read write } for pid=303 comm="mediaserver" name="tfa9890"dev="tmpfs" ino=3880 scontext=u:r:mediaserver:s0tcontext=u:object_r:device:s0tclass=chr_file permissive=0
2.找到相應的*_contexts檔案。
一般有file_contexts, genfs_contexts, property_contexts, service_contexts 等檔案
在contexts檔案中指定要訪問的目標為一個“源型別 ”有許可權訪問的“目標型別”
如:在file_contexts中新增: /dev/tfa9890 u:object_r:audio_device:s0
舉例
新增許可權:
在mediaserver.te中新增allow mediaserver device:chr_file { read write open};
編譯報錯:
libsepol.check_assertion_helper: neverallow on line 258 ofexternal/sepolicy/domain.te (or line 5252 of policy.conf) violated byallow mediaserver device:chr_file { read write open};
違反了domain.te 258的:
neverallow {domain –unconfineddomain –ueventd } device:chr_file { open read write}
執行Log:
avc: denied { read write } for pid=303 comm="mediaserver"name="tfa9890" dev="tmpfs" ino=3880 scontext=u:r:mediaserver:s0 tcontext=u:object_r:device:s0tclass=chr_file permissive=0
修改步驟:
1.目標名稱是: tfa9890, 其在系統中的路徑是: /dev/tfa9890, 是audio相關的裝置檔案
2.源型別是mediaserver, 在mediaserver.te 檔案中發現其具有 audio_device 目標型別的許可權
3.所以在file_contexts 中新增 “/dev/tfa9890 u:object_r:audio_device:s0” 可以解決問題
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援指令碼之家