Android系統(tǒng)SELinux詳解

本文轉(zhuǎn)載自:Android系統(tǒng)SELinux詳解

前言

??SELinux是一種加強文件安全的一種策略扫腺,可以更好地保護我們的Android系統(tǒng), 比如限制系統(tǒng)服務(wù)的訪問權(quán)限、控制應(yīng)用對數(shù)據(jù)和系統(tǒng)日志的訪問等措施,這樣就降低了惡意軟件的影響茎毁,并且可以防止因代碼存在的缺陷而產(chǎn)生的對系統(tǒng)安全的影響铅乡。

??從系統(tǒng)安全方面考慮,SELinux是保護神允乐,但是從軟件開發(fā)方面篓吁,SELinux就是一道牽絆茫因,這是一把雙刃劍。SELinux默認開啟越除,即使獲得了該系統(tǒng)的root權(quán)限节腐,也只能向相關(guān)策略中指定的設(shè)備寫入數(shù)據(jù),從而更好地保護和限制系統(tǒng)服務(wù)摘盆,保障系統(tǒng)和數(shù)據(jù)的安全。

image.png

1.環(huán)境

  • 硬件平臺:Google Pixel2

  • 操作系統(tǒng):Android 10.0

2.selinux有兩種工作模式

名稱 作用
permissive 所有操作都被允許(即沒有MAC)饱苟,但是如果有違反權(quán)限的話孩擂,會記錄日志
enforcing 所有操作都會進行權(quán)限檢查

3.標簽、規(guī)則和域

??SELinux依靠標簽來匹配操作和策略箱熬。標簽用于決定允許的事項类垦。套接字爬迟、文件和進程在SELinux中都有標簽指巡。SELinux在做決定時需參照兩點:一是為這些對象分配的標簽,二是定義這些對象如何交互的策略限寞。

??在SELinux中糕伐,標簽采用以下形式:user:role:type:mls_level砰琢,其中type是訪問決定的主要組成部分,可通過構(gòu)成標簽的其他組成部分進行修改。對象會映射到類陪汽,對每個類的不同訪問類型由權(quán)限表示训唱。

??策略規(guī)則采用以下形式:allow domains types:classes permissions;,其中:

名稱 作用
domain 一個進程或一組進程的標簽挚冤。也稱為域類型况增,因為它只是指進程的類型。
type 一個對象(例如训挡,文件澳骤、套接字)或一組對象的標簽。
class 要訪問的對象(例如澜薄,文件宴凉、套接字)的類型。
Permission 要執(zhí)行的操作(例如表悬,讀取弥锄、寫入)。

4.策略配置源文件

  • external/sepolicy

??這是獨立于設(shè)備的配置蟆沫,一般不能針對設(shè)備進行修改籽暇;

  • device/sepolicy

??這是特定于設(shè)備的配置,基于BOARD_SEPOLICY_*變量來選擇對應(yīng)平臺的策略配置饭庞。

5.Type Enforcement (TE) 配置文件

??.te文件中保存了對應(yīng)對象的域和類型定義戒悠、規(guī)則。通常每個域一個.te文件舟山,例如installd.te绸狐。在device.te、file.te 中聲明了設(shè)備和文件類型累盗。在某些文件(例如domain.te寒矿、app.te)中則存儲著共享規(guī)則。

6.標簽配置文件

  • file_contexts:文件安全上下文若债;

  • property_contexts:屬性安全上下文符相。

7.SEAndroid app分類

??SELinux(或SEAndroid)將app劃分為主要三種類型(根據(jù)user不同,也有其他的domain類型):

名稱 作用
untrusted_app 第三方app蠢琳,沒有Android平臺簽名啊终,沒有system權(quán)限
platform_app 有android平臺簽名,沒有system權(quán)限
system_app 有android平臺簽名和system權(quán)限

從上面劃分傲须,權(quán)限等級蓝牲,理論上:untrusted_app < platform_app < system_app

8.user

??user可以理解為UID。android的UID和linux的UID根本是兩回事泰讽,Linux的UID是用于針對多用戶操作系統(tǒng)中用于區(qū)分用戶的例衍,而Android中的UID是用于系統(tǒng)進行權(quán)限管理的昔期。

9.seinfo

??不同簽名會創(chuàng)建對應(yīng)的selinux上下文。

// Android.mk
LOCAL_CERTIFICATE := platform

有platform簽名肄渗,所以seinfo是platform镇眷。

10.自定義安全策略

??以上面兩個運行的app來說,我們?yōu)檫@兩個APP添加額外的權(quán)限翎嫡,對應(yīng)的TE配置文件分別就是system_app.te欠动、untrusted_app.te,對應(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

11.neverallow failures

??有時我們增加的權(quán)限具伍,系統(tǒng)默認的配置是不允許的,比如我們上面給forlinx.example.app增加的執(zhí)行腳本的權(quán)限圈驼,報錯如下:

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)默認的安全策略的路徑為system/sepolicy/人芽,根據(jù)報錯的提示,我們可以修改默認的配置绩脆,修改system/sepolicy/private/system_app.te和system/sepolicy/private/shell.te萤厅,從而完成權(quán)限的賦予。

12.安卓中快速編譯sepolicy并驗證(需要本地代碼整編過一次靴迫,已經(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惕味,并刷機

$ make systemimage
$ adb reboot bootloader
$ fastboot flash system ./system.img
$ fastboot reboot

13.如何應(yīng)對neverallow? 繞過CTS認證

??在system/sepolicy/private/logpersist.te與system/sepolicy/prebuilts/api/29.0/private/logpersist.te中配置以下allow語句并編譯,會報neverallow的錯玉锌。如下聲明allow:

allow logpersist system_data_file:dir write;

這表示谷歌不允許我們使用allow語句名挥,解除限制的最暴力方法就是將報錯處的neverallow語句刪掉,這樣確實可行主守,但是會過不了cts禀倔。

??由于我們要訪問的目錄path為/data/syslog,將該目錄定義成自己的Type参淫,可以自定義Type救湖,如下:

在file.te中自定義一個type為file_type,data_file_type黄刚,core_data_file_type:

  • type log_data_file, file_type, data_file_type, core_data_file_type;

??在file_contexts中定義安全上下文:

  • /data/syslog(/.*)? u:object_r:log_data_file:s0

??在logpersist.te將allow語句改為:

  • allow logpersist log_data_file write;

??然后在logpersist.te中單獨將自定義的log_data_file減去即可捎谨。(這里最好的是自定義一個service代替logpersist,那就要新建一個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 };

14.如何新增domian域?(一般在平臺相關(guān)目錄下添加)

例子如下:

(1)在device/平臺名/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隨便取业扒。

(2)在device/平臺名/system/public/file.te 中添加

type wxl_cabc, fs_type,sysfs_type;

(3)在 device/平臺名/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。

15.添加設(shè)備文件節(jié)點權(quán)限(sysfs gpio管腳節(jié)點權(quán)限)?

/sys/class/leds/green/brightness //快捷方式
/sys/devices/soc.0/gpio-leds.66/leds/green/brightness //實際節(jié)點

操作LED燈的設(shè)備文件節(jié)點為APP層system app進程開放該節(jié)點訪問權(quán)限(讀或?qū)?章鲤,權(quán)限配置主要修改(一般在/device/平臺/sepolicy/common)目錄下的file.te摊灭、file_contexts和system_app.te三個文件。

(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é)點帚呼,需要到/system/core/rootdir/init.rc里面配置如下:

(1)修改設(shè)備節(jié)點用戶所有者和所屬用戶組,以及它們所對應(yīng)的權(quán)限

  • chown system system 設(shè)備文件結(jié)點

  • chmod 777 設(shè)備文件結(jié)點

16.修改selinux沒有生效皱蹦?煤杀??

??將SELinux Policy文件存放在下面目錄

(1) Google 原生目錄 /system/sepolicy

(2) 廠商配置目錄 /device/廠商平臺/sepolicy/

android將SELinux Policy 文件存放的te一般都是在device/平臺/sepolicy 和 /system/sepolicy兩個目錄下沪哺。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末沈自,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子辜妓,更是在濱河造成了極大的恐慌枯途,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件籍滴,死亡現(xiàn)場離奇詭異酪夷,居然都是意外死亡,警方通過查閱死者的電腦和手機异逐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進店門捶索,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人灰瞻,你說我怎么就攤上這事腥例。” “怎么了酝润?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵燎竖,是天一觀的道長。 經(jīng)常有香客問我要销,道長构回,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任疏咐,我火速辦了婚禮纤掸,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘浑塞。我一直安慰自己借跪,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布酌壕。 她就那樣靜靜地躺著掏愁,像睡著了一般歇由。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上果港,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天沦泌,我揣著相機與錄音,去河邊找鬼辛掠。 笑死谢谦,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的公浪。 我是一名探鬼主播他宛,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼欠气!你這毒婦竟也來了厅各?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤预柒,失蹤者是張志新(化名)和其女友劉穎队塘,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體宜鸯,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡憔古,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了淋袖。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鸿市。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖即碗,靈堂內(nèi)的尸體忽然破棺而出焰情,到底是詐尸還是另有隱情,我是刑警寧澤剥懒,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布内舟,位于F島的核電站,受9級特大地震影響初橘,放射性物質(zhì)發(fā)生泄漏验游。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一保檐、第九天 我趴在偏房一處隱蔽的房頂上張望耕蝉。 院中可真熱鬧,春花似錦夜只、人聲如沸赔硫。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽爪膊。三九已至,卻和暖如春砸王,著一層夾襖步出監(jiān)牢的瞬間推盛,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工谦铃, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留耘成,地道東北人。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓驹闰,卻偏偏與公主長得像瘪菌,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子嘹朗,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內(nèi)容