一文解析Android系統(tǒng)SELinux
前言
SELinux是一種加強(qiáng)文件安全的一種策略,可以更好地保護(hù)我們的Android系統(tǒng), 比如限制系統(tǒng)服務(wù)的訪問權(quán)限、控制應(yīng)用對(duì)數(shù)據(jù)和系統(tǒng)日志的訪問等措施,這樣就降低了惡意軟件的影響,并且可以防止因代碼存在的缺陷而產(chǎn)生的對(duì)系統(tǒng)安全的影響。
從系統(tǒng)安全方面考慮,SELinux是保護(hù)神,但是從軟件開發(fā)方面,SELinux就是一道牽絆,這是一把雙刃劍。SELinux默認(rèn)開啟,即使獲得了該系統(tǒng)的root權(quán)限,也只能向相關(guān)策略中指定的設(shè)備寫入數(shù)據(jù),從而更好地保護(hù)和限制系統(tǒng)服務(wù),保障系統(tǒng)和數(shù)據(jù)的安全。
環(huán)境
硬件平臺(tái):Google Pixel2
操作系統(tǒng):Android10.0
selinux有兩種工作模式
名稱 | 作用 |
---|---|
permissive | 所有操作都被允許(即沒有MAC),但是如果有違反權(quán)限的話,會(huì)記錄日志 |
enforcing | 所有操作都會(huì)進(jìn)行權(quán)限檢查 |
SELinux 依靠標(biāo)簽來匹配操作和策略。標(biāo)簽用于決定允許的事項(xiàng)。套接字、文件和進(jìn)程在 SELinux 中都有標(biāo)簽。SELinux 在做決定時(shí)需參照兩點(diǎn):一是為這些對(duì)象分配的標(biāo)簽,二是定義這些對(duì)象如何交互的策略。
在 SELinux 中,標(biāo)簽采用以下形式:user:role:type:mls_level,其中 type 是訪問決定的主要組成部分,可通過構(gòu)成標(biāo)簽的其他組成部分進(jìn)行修改。對(duì)象會(huì)映射到類,對(duì)每個(gè)類的不同訪問類型由權(quán)限表示。
策略規(guī)則采用以下形式:allow domains types:classes permissions;,其中:
名稱 | 作用 |
---|---|
domain | 一個(gè)進(jìn)程或一組進(jìn)程的標(biāo)簽。也稱為域類型,因?yàn)樗皇侵高M(jìn)程的類型。 |
type | 一個(gè)對(duì)象(例如,文件、套接字)或一組對(duì)象的標(biāo)簽。 |
class | 要訪問的對(duì)象(例如,文件、套接字)的類型。Permission - 要執(zhí)行的操作(例如,讀取、寫入)。 |
策略配置源文件
- external/sepolicy
這是獨(dú)立于設(shè)備的配置,一般不能針對(duì)設(shè)備進(jìn)行修改 - device///sepolicy
這是特定于設(shè)備的配置,基于 BOARD_SEPOLICY_* 變量來選擇對(duì)應(yīng)平臺(tái)的策略配置。
Type Enforcement (TE) 配置文件
.te 文件中保存了對(duì)應(yīng)對(duì)象的域和類型定義、規(guī)則。通常每個(gè)域一個(gè) .te 文件,例如installd.te。在 device.te、file.te 中聲明了設(shè)備和文件類型。在某些文件(例如domain.te、app.te)中則存儲(chǔ)著共享規(guī)則。
標(biāo)簽配置文件
- file_contexts:文件安全上下文
- property_contexts:屬性安全上下文
SEAndroid app分類
SELinux(或SEAndroid)將app劃分為主要三種類型(根據(jù)user不同,也有其他的domain類型):
名稱 | 作用 |
---|---|
untrusted_app | 第三方app,沒有Android平臺(tái)簽名,沒有system權(quán)限 |
platform_app | 有android平臺(tái)簽名,沒有system權(quán)限 |
system_app | 有android平臺(tái)簽名和system權(quán)限 |
從上面劃分,權(quán)限等級(jí),理論上:untrusted_app < platform_app < system_app
user
user可以理解為UID。android的UID和linux的UID根本是兩回事,Linux的UID是用于針對(duì)多用戶操作系統(tǒng)中用于區(qū)分用戶的,而Android中的UID是用于系統(tǒng)進(jìn)行權(quán)限管理的。參考鏈接中的文章對(duì)于uid的產(chǎn)生講的很清楚。
seinfo
不同簽名會(huì)創(chuàng)建對(duì)應(yīng)的selinux上下文。
Android.mk
LOCAL_CERTIFICATE := platform
有platform簽名,所以seinfo是platform。
自定義安全策略
以上面兩個(gè)運(yùn)行的app來說,我們?yōu)檫@兩個(gè)APP添加額外的權(quán)限,對(duì)應(yīng)的TE配置文件分別就是system_app.te、untrusted_app.te,對(duì)應(yīng)路徑為:
$aosp/system/sepolicy/public/system_app.te $aosp/system/sepolicy/public/untrusted_app.te
以longzhiye.example.app為例,我們?yōu)槠涮砑觕an設(shè)備的執(zhí)行權(quán)限:
longzhiye@longzhiye-laptop:~/mount/project/androidq$ vi system/sepolicy/public/system_app.te
...... allow system_app vendor_shell_exec:file { getattr open read execute execute_no_trans }; allow system_app shell_exec:file { getattr open read execute execute_no_trans }; allow system_app shell:file { getattr open read execute execute_no_trans }; ......
以策略規(guī)則配置形式(allow domains types:classes permissions)
分析:
策略規(guī)則 | 示例 |
---|---|
domains | system_app |
types | vendor_shell_exec |
classes | file |
permissions | getattr open read execute execute_no_trans |
neverallow failures
有時(shí)我們?cè)黾拥臋?quán)限,系統(tǒng)默認(rèn)的配置是不允許的,比如我們上面給forlinx.example.app增加的執(zhí)行腳本的權(quán)限,報(bào)錯(cuò)如下:
libsepol.report_failure: neverallow on line 9 of system/sepolicy/private/system_app.te (or line 41463 of policy.conf) violated by allow system_app shell:file { read open }; libsepol.report_failure: neverallow on line 22 of system/sepolicy/private/shell.te (or line 40025 of policy.conf) violated by allow system_app shell:file { read open }; libsepol.check_assertions: 2 neverallow failures occurred
系統(tǒng)默認(rèn)的安全策略的路徑為system/sepolicy/,根據(jù)報(bào)錯(cuò)的提示,我們可以修改默認(rèn)的配置,修改system/sepolicy/private/system_app.te和system/sepolicy/private/shell.te,從而完成權(quán)限的賦予。
安卓中快速編譯sepolicy并驗(yàn)證(需要本地代碼整編過一次,已經(jīng)生成out目錄)
$ mmm system/sepolicy/ $ adb push out/target/product/xxx/system/etc/selinux /system/etc/selinux $ adb push out/target/product/xxx/vendor/etc/selinux /vendor/etc/selinux
也可單編systemimage,并刷機(jī)
$ make systemimage $ adb reboot bootloader $ fastboot flash system ./system.img $ fastboot reboot
如何應(yīng)對(duì)neverallow? 繞過CTS認(rèn)證
在system/sepolicy/private/logpersist.te與system/sepolicy/prebuilts/api/29.0/private/logpersist.te中配置以下allow語(yǔ)句并編譯,
會(huì)報(bào)neverallow的錯(cuò)。如下聲明allow:
allow logpersist system_data_file:dir write;
這表示谷歌不允許我們使用allow語(yǔ)句,解除限制的最暴力方法就是將報(bào)錯(cuò)處的neverallow語(yǔ)句刪掉,這樣確實(shí)可行,但是會(huì)過不了cts。
由于我們要訪問的目錄path為/data/syslog,將該目錄定義成自己的Type,可以自定義Type,如下:
在file.te中自定義一個(gè)type為file_type,data_file_type,core_data_file_type:
(1)type log_data_file, file_type, data_file_type, core_data_file_type;
在file_contexts中定義安全上下文:
(2)/data/syslog(/.*)? u:object_r:log_data_file:s0
在logpersist.te將allow語(yǔ)句改為:
(3)allow logpersist log_data_file write;
然后在logpersist.te中單獨(dú)將自定義的log_data_file減去即可。(這里最好的是自定義一個(gè)service代替logpersist,那就要新建一個(gè)te文件了,比較麻煩)
neverallow logpersist { file_type userdebug_or_eng(`-misc_logd_file -coredump_file') with_native_coverage(`-method_trace_data_file') -log_data_file }:file { create write append };
如何新增domian域?(一般在平臺(tái)相關(guān)目錄下添加)
例子如下
在device/平臺(tái)名/system/private/file_contexts 文件添加
# tcontext=u:object_r:sysfs:s0
/sys/kernel/display/abcd u:object_r:wxl_abcd:s0 #wxl_abcd替換sysfs,wxl_abcd隨便取
在device/平臺(tái)名/system/public/file.te 中添加
type wxl_cabc, fs_type,sysfs_type;
在 device/平臺(tái)名/system/private/system_server.te 文件中添加
allow system_server wxl_abcd:file { r_file_perms w_file_perms rw_file_perms };
添加 write 或者 read 的權(quán)限要注意 open 的權(quán)限,最后使用 r_file_perms、w_file_perms、rw_file_perms。
添加設(shè)備文件節(jié)點(diǎn)權(quán)限(sysfs gpio管腳節(jié)點(diǎn)權(quán)限)?
/sys/class/leds/green/brightness //快捷方式
/sys/devices/soc.0/gpio-leds.66/leds/green/brightness //實(shí)際節(jié)點(diǎn)
操作LED燈的設(shè)備文件節(jié)點(diǎn)為APP層system app進(jìn)程開放該節(jié)點(diǎn)訪問權(quán)限(讀或?qū)?,權(quán)限配置主要修改(一般在/device/平臺(tái)/sepolicy/common)目錄下的file.te、file_contexts和system_app.te三個(gè)文件
(1)file.te修改如下:
# GPIO accessed by system app
type sysfs_gpio, fs_type, sysfs_type;
(2)file_contexts修改如下:
/sys/devices/soc/1010000.pinctrl/gpio/gpio62/value u:object_r:sysfs_gpio:s0 /sys/devices/soc/1010000.pinctrl/gpio/gpio63/value u:object_r:sysfs_gpio:s0
(3)system_app.te修改如下:
allow system_app sysfs_gpio:file rw_file_perms;
如果通過以上添加SELinux之后,仍沒有權(quán)限讀寫sys或proc節(jié)點(diǎn),需要到/system/core/rootdir/init.rc里面配置如下:
(1)修改設(shè)備節(jié)點(diǎn)用戶所有者和所屬用戶組,以及它們所對(duì)應(yīng)的權(quán)限
chown system system 設(shè)備文件結(jié)點(diǎn)
chmod 777 設(shè)備文件結(jié)點(diǎn)
修改selinux沒有生效???
將SELinux Policy 文件存放在下面目錄
(1) Google 原生目錄 /system/sepolicy
(2) 廠商配置目錄 /device/廠商平臺(tái)/sepolicy/
android將SELinux Policy 文件存放的te一般都是在device/平臺(tái)/sepolicy 和 /system/sepolicy兩個(gè)目錄下
到此這篇關(guān)于Android系統(tǒng)SELinux詳解的文章就介紹到這了,更多相關(guān)Android系統(tǒng)SELinux內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android WebView攔截iframe標(biāo)簽內(nèi)部跳轉(zhuǎn)教程
這篇文章主要介紹了Android WebView攔截iframe標(biāo)簽內(nèi)部跳轉(zhuǎn)教程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-03-03Android中GridView和ArrayAdapter用法實(shí)例分析
這篇文章主要介紹了Android中GridView和ArrayAdapter用法,結(jié)合實(shí)例形式分析了Android中GridView結(jié)合ArrayAdapter實(shí)現(xiàn)表格化排版的相關(guān)技巧,需要的朋友可以參考下2016-02-02Android實(shí)現(xiàn)調(diào)用攝像頭拍照并存儲(chǔ)照片
本文主要介紹了如何利用Android調(diào)用攝像頭拍照,并顯示拍照后的圖片到ImageView中,文中的示例代碼講解詳細(xì),感興趣的可以動(dòng)手試一試2022-01-01android使用surfaceview+MediaPlayer播放視頻
這篇文章主要為大家詳細(xì)介紹了android使用surfaceview+MediaPlayer播放視頻,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-11-11Android編程之?dāng)?shù)據(jù)庫(kù)Sql編程實(shí)例分析
這篇文章主要介紹了Android編程之?dāng)?shù)據(jù)庫(kù)Sql編程,實(shí)例分析了Android操作Sqlite數(shù)據(jù)庫(kù)的相關(guān)技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-04-04Android網(wǎng)絡(luò)請(qǐng)求-sign參數(shù)的設(shè)置方式
這篇文章主要介紹了Android網(wǎng)絡(luò)請(qǐng)求-sign參數(shù)的設(shè)置方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-03-03Android HTTP網(wǎng)絡(luò)請(qǐng)求的異步實(shí)現(xiàn)
這篇文章主要介紹了Android HTTP網(wǎng)絡(luò)請(qǐng)求的異步實(shí)現(xiàn),感興趣的小伙伴們可以參考一下2016-07-07Android studio實(shí)現(xiàn)PopupWindow彈出框效果
這篇文章主要為大家詳細(xì)介紹了Android studio實(shí)現(xiàn)PopupWindow彈出框效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-10-10Android簽名文件轉(zhuǎn)化為pk8和pem的實(shí)現(xiàn)
這篇文章主要介紹了Android簽名文件轉(zhuǎn)化為pk8和pem的實(shí)現(xiàn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-03-03