詳解Android Selinux 權(quán)限及問題
由于現(xiàn)做的是MTK平臺,源碼路徑基于MTK, 不過高通大同小異
說明
Android 5.0以后完全引入了 SEAndroid/SELinux 安全機制,這樣即使擁有 root 權(quán)限或 chmod 777 ,仍然無法再JNI以上訪問內(nèi)核節(jié)點。
其實在 Android 4.4 就有限制的啟用此安全機制了。后面內(nèi)容都按照 5.0 以后介紹,4.4 會有些許差異。
SELinux Mode
SELinux 分為兩種模式,Android 5.0 后所有進(jìn)程都使用 enforcing mode。
enforcing mode: 限制訪問 permissive mode: 只審查權(quán)限,不限制
SELinux Policy文件路徑
# Google 原生目錄 external/sepolicy # 廠家目錄,高通將 mediatek 換為 qcom alps\device\mediatek\common\sepolicy alps\device\mediatek\<platform>\sepolicy
編譯時將以合并的方式將廠家policy追加到Google原生。
Log
沒有權(quán)限時可以在內(nèi)核找到如下 log :
# avc: denied { 操作權(quán)限 } for pid=7201 comm=“進(jìn)程名” scontext=u:r:源類型:s0 tcontext=u:r:目標(biāo)類型:s0 tclass=訪問類型 permissive=0 avc: denied {getattr read} for pid=7201 comm="xxx.xxx" scontext=u:r:system_app:s0 tcontext=u:r:shell_data_file:s0 tclass=dir permissive=0 ``` ## 權(quán)限修改 主要有三種方式,前兩種只能用來測試,第三種是推薦的正式處理方式。 ### adb在線修改seLinux ```bash # Enforcing - 表示已打開 ,Permissive - 表示已關(guān)閉 getenforce; //獲取當(dāng)前seLinux狀態(tài) setenforce 1; //打開seLinux setenforce 0; //關(guān)閉seLinux
kernel中關(guān)閉
# alps\kernel-3.18\arch\arm64\configs\xxx_defconfig CONFIG_SECURITY_SELINUX=y // 屏蔽此配置項
SELinux Sepolicy中添加權(quán)限
修改相應(yīng)源類型.te文件(基本以源進(jìn)程名命名),添加如下一行語句:
# 格式 allow 源類型 目標(biāo)類型:訪問類型 {操作權(quán)限}; // 注意分號 # 實例,具體寫法參考源碼 allow system_app shell_data_file:dir{getattr read write}; allow mediaserver tfa9897_device:chr_file { open read write }; allow system_server tfa9897_device:chr_file rw_file_perms; chr_file - 字符設(shè)備 file - 普通文件 dir - 目錄
通常很少修改Google default 的policy, 推薦更新mediatek 下面的相關(guān)的policy.
新建節(jié)點
如果是自己新建的節(jié)點,需要在 sepolicy 路徑下的 file_contexts 文件中做如下添加:
# 參考已有的格式 /dev/goodix_fp u:object_r:goodixfp_device:s0
Android 5.0 修改的文件為device.te 和 file_contexts.be,而且device/mediatek/common/BoardConfig.mk 中的 BROAD_SEPOLICY_UNION 增加對應(yīng)的xxxx.te。
編譯
# 模塊編譯 mmm external/sepolicy make -j24 ramdisk-nodeps & make -j24 bootimage-nodeps # 整編 make -j24
ps添加權(quán)限后的neverallowed沖突
編譯報錯:
libsepol.check_assertion_helper: neverallow on line xxx ofexternal/sepolicy/domain.te ……
原因:
新添加的sepolicy項目違反了domain.te 中規(guī)定的的總策略原則。所以該條權(quán)限策略不能添加,如果強行添加的話有CTS測試失敗的風(fēng)險。
解決方法:
1.從運行l(wèi)og中找到要訪問的目標(biāo)名稱,一般是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.找到相應(yīng)的*_contexts文件。
一般有file_contexts, genfs_contexts, property_contexts, service_contexts 等文件
在contexts文件中指定要訪問的目標(biāo)為一個“源類型 ”有權(quán)限訪問的“目標(biāo)類型”
如:在file_contexts中添加: /dev/tfa9890 u:object_r:audio_device:s0
舉例
添加權(quán)限:
在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.目標(biāo)名稱是: tfa9890, 其在系統(tǒng)中的路徑是: /dev/tfa9890, 是audio相關(guān)的設(shè)備文件
2.源類型是mediaserver, 在mediaserver.te 文件中發(fā)現(xiàn)其具有 audio_device 目標(biāo)類型的權(quán)限
3.所以在file_contexts 中添加 “/dev/tfa9890 u:object_r:audio_device:s0” 可以解決問題
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
一看就喜歡的loading動畫效果Android分析實現(xiàn)
一看就喜歡的loading動畫效果Android分析實現(xiàn),絢爛的效果,相信大家一定會喜歡,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-01-01Android Room數(shù)據(jù)庫容易遇到的問題以及解決方法
這篇文章給大家介紹了我們在Android Room數(shù)據(jù)庫容易遇到的坑以及解決方法,文中有詳細(xì)的代碼示例供我們參考,具有一定的參考價值,需要的朋友可以參考下2023-09-09Flutter實現(xiàn)資源下載斷點續(xù)傳的示例代碼
在項目開發(fā)中,特別是C端的產(chǎn)品,資源下載實現(xiàn)斷點續(xù)傳是非常有必要的。今天我們不講過多原理的知識,分享下簡單實用的資源斷點續(xù)傳2022-07-07Android 基于google Zxing實現(xiàn)二維碼、條形碼掃描,仿微信二維碼掃描效果(推薦)
這篇文章主要介紹了 Android 基于google Zxing實現(xiàn)二維碼、條形碼掃描,仿微信二維碼掃描效果,非常不錯,具有參考借鑒價值,需要的朋友參考下2017-01-01Android組件之DrawerLayout實現(xiàn)抽屜菜單
DrawerLayout組件同樣是V4包中的組件,也是直接繼承于ViewGroup類,所以這個類也是一個容器類。接下來通過本文給大家介紹Android組件之DrawerLayout實現(xiàn)抽屜菜單,感興趣的朋友一起學(xué)習(xí)吧2016-02-02