Android SELinux 實現(xiàn) (轉(zhuǎn)自官網(wǎng))

實現(xiàn) SELinux

SELinux 被設(shè)置為“默認(rèn)拒絕”模式墨闲,這表示,對于在內(nèi)核中存在鉤子的每一次訪問郑口,都必須獲得政策的明確許可鸳碧。這意味著政策文件中包含規(guī)則盾鳞、類型、類瞻离、權(quán)限等方面的大量信息腾仅。關(guān)于 SELinux 的完整注意事項不在本文檔的討論范圍之內(nèi),現(xiàn)在您必須要了解的是在啟動新的 Android 設(shè)備時如何編寫政策規(guī)則套利。目前有大量關(guān)于 SELinux 的信息可供您參考推励。關(guān)于建議的資源,請參閱支持文檔日裙。

關(guān)鍵文件

要啟用 SELinux吹艇,請集成最新的 Android 內(nèi)核惰蜜,然后整合 system/sepolicy 目錄中的文件昂拂。這些文件在編譯后會包含 SELinux 內(nèi)核安全政策,并涵蓋上游 Android 操作系統(tǒng)抛猖。

通常情況下格侯,您不能直接修改 system/sepolicy 文件,但您可以添加或修改自己的設(shè)備專用政策文件(位于 /device/<var>manufacturer</var>/<var>device-name</var>/sepolicy 目錄中)财著。在 Android 8.0 及更高版本中联四,您對這些文件所做的更改只會影響供應(yīng)商目錄中的政策。要詳細(xì)了解 Android 8.0 及更高版本中的公共 sepolicy 分離撑教,請參閱在 Android 8.0 及更高版本中自定義 SEPolicy朝墩。無論是哪個 Android 版本,您都仍需要修改以下文件:

政策文件

以 *.te 結(jié)尾的文件是 SELinux 政策源代碼文件伟姐,用于定義域及其標(biāo)簽收苏。您可能需要在 /device/manufacturer/device-name/sepolicy 中創(chuàng)建新的政策文件,但您應(yīng)盡可能嘗試更新現(xiàn)有文件愤兵。

上下文的描述文件

您可以在上下文的描述文件中為您的對象指定標(biāo)簽鹿霸。

  • file_contexts 用于為文件分配標(biāo)簽,并且可供多種用戶空間組件使用秆乳。在創(chuàng)建新政策時懦鼠,請創(chuàng)建或更新該文件讨阻,以便為文件分配新標(biāo)簽伸眶。要應(yīng)用新的 file_contexts,請重新構(gòu)建文件系統(tǒng)映像突诬,或?qū)σ匦绿砑訕?biāo)簽的文件運行 restorecon扯键。在升級時睦袖,對 file_contexts 所做的更改會在升級過程中自動應(yīng)用于系統(tǒng)和用戶數(shù)據(jù)分區(qū)。此外忧陪,您還可以通過以下方式使這些更改在升級過程中自動應(yīng)用于其他分區(qū):在以允許讀寫的方式裝載相應(yīng)分區(qū)后扣泊,將 restorecon_recursive 調(diào)用添加到 init.board<var></var>.rc 文件中近范。
  • genfs_contexts 用于為不支持?jǐn)U展屬性的文件系統(tǒng)(例如,procvfat)分配標(biāo)簽延蟹。此配置會作為內(nèi)核政策的一部分進(jìn)行加載评矩,但更改可能對內(nèi)核 inode 無效。要全面應(yīng)用更改阱飘,您需要重新啟動設(shè)備斥杜,或卸載并重新裝載文件系統(tǒng)。此外沥匈,通過使用 context=mount 選項蔗喂,您還可以為裝載的特定系統(tǒng)文件(例如 vfat)分配特定標(biāo)簽。
  • property_contexts 用于為 Android 系統(tǒng)屬性分配標(biāo)簽高帖,以便控制哪些進(jìn)程可以設(shè)置這些屬性缰儿。在啟動期間,init 進(jìn)程會讀取此配置散址。
  • service_contexts 用于為 Android Binder 服務(wù)分配標(biāo)簽乖阵,以便控制哪些進(jìn)程可以為相應(yīng)服務(wù)添加(注冊)和查找(查詢)Binder 引用。在啟動期間预麸,servicemanager 進(jìn)程會讀取此配置瞪浸。
  • seapp_contexts 用于為應(yīng)用進(jìn)程和 /data/data 目錄分配標(biāo)簽。在每次應(yīng)用啟動時吏祸,zygote 進(jìn)程都會讀取此配置对蒲;在啟動期間,installd 會讀取此配置贡翘。
  • mac_permissions.xml 用于根據(jù)應(yīng)用簽名和應(yīng)用軟件包名稱(后者可選)為應(yīng)用分配 seinfo 標(biāo)記蹈矮。隨后,分配的 seinfo 標(biāo)記可在 seapp_contexts 文件中用作密鑰床估,以便為帶有該 seinfo 標(biāo)記的所有應(yīng)用分配特定標(biāo)簽含滴。在啟動期間,system_server 會讀取此配置丐巫。

BoardConfig.mk makefile

修改或添加政策文件和上下文的描述文件后谈况,請更新您的 /device/<var>manufacturer</var>/<var>device-name</var>/BoardConfig.mk makefile 以引用 sepolicy 子目錄和每個新的政策文件。 要詳細(xì)了解 BOARD_SEPOLICY 變量递胧,請參閱 system/sepolicy/README 文件碑韵。

BOARD_SEPOLICY_DIRS += \
        <root>/device/manufacturer/device-name/sepolicy

BOARD_SEPOLICY_UNION += \
        genfs_contexts \
        file_contexts \
        sepolicy.te

重新進(jìn)行編譯后,您的設(shè)備會啟用 SELinux《衅ⅲ現(xiàn)在祝闻,您可以根據(jù)自己向 Android 操作系統(tǒng)添加的內(nèi)容自定義 SELinux 政策(如自定義中所述),也可以驗證現(xiàn)有設(shè)置(如驗證中所述)遗菠。

在新政策文件和 BoardConfig.mk 更新部署到位后联喘,新政策設(shè)置會自動內(nèi)置到最終的內(nèi)核政策文件中华蜒。 要詳細(xì)了解如何在設(shè)備上編譯 sepolicy,請參閱編譯 sepolicy豁遭。

實現(xiàn)

要開始使用 SELinux叭喜,請執(zhí)行以下操作:

  1. 在內(nèi)核中啟用 SELinux: CONFIG_SECURITY_SELINUX=y
  2. 更改 kernel_cmdline 參數(shù),以便:
BOARD_KERNEL_CMDLINE := androidboot.selinux=permissive
  1. 這僅適用于初始制定設(shè)備政策的情況蓖谢。在擁有初始引導(dǎo)程序政策后捂蕴,請移除此參數(shù),以便將設(shè)備恢復(fù)強制模式闪幽,否則設(shè)備將無法通過 CTS 驗證啥辨。

  2. 以寬容模式啟動系統(tǒng),看看在啟動時會遇到哪些拒絕事件:
    在 Ubuntu 14.04 或更高版本中盯腌,請運行以下命令:

adb shell su -c dmesg | grep denied | audit2allow -p out/target/product/BOARD/root/sepolicy

在 Ubuntu 12.04 中溉知,請運行以下命令:

adb pull /sys/fs/selinux/policy
adb logcat -b all | audit2allow -p policy

評估與以下內(nèi)容類似的警告的輸出:init: Warning! Service name needs a SELinux domain defined; please fix! 如需查看相關(guān)說明和工具,請參閱驗證腊嗡。

  1. 標(biāo)識設(shè)備以及需要添加標(biāo)簽的其他新文件着倾。
  2. 為您的對象使用現(xiàn)有標(biāo)簽或新標(biāo)簽拾酝。查看 *_contexts 文件燕少,了解之前是如何為內(nèi)容添加標(biāo)簽的,然后根據(jù)對標(biāo)簽含義的了解分配一個新標(biāo)簽蒿囤。這個標(biāo)簽最好是能夠融入到政策中的現(xiàn)有標(biāo)簽客们,但有時也需要使用新標(biāo)簽,而且還需要提供關(guān)于訪問該標(biāo)簽的規(guī)則材诽。將您的標(biāo)簽添加到相應(yīng)的上下文的描述文件中底挫。
  3. 標(biāo)識那些應(yīng)擁有自己的安全域的域/進(jìn)程。 您可能需要為每一項分別編寫一個全新的政策脸侥。例如建邓,從 init 衍生的所有服務(wù)都應(yīng)該有自己的安全域。以下命令有助于查看保持運行的服務(wù)(不過所有服務(wù)都需要如此處理):
adb shell su -c ps -Z | grep init
adb shell su -c dmesg | grep 'avc: '
  1. 查看 init.<var>device</var>.rc 以發(fā)現(xiàn)任何沒有域類型的域睁枕。請在開發(fā)過程早期為其提供相應(yīng)的域官边,以避免向 init 添加規(guī)則或?qū)?init 訪問權(quán)限與其自身政策中的訪問權(quán)限混淆。
  2. BOARD_CONFIG.mk 設(shè)為使用 BOARD_SEPOLICY_* 變量外遇。如需關(guān)于如何進(jìn)行這項設(shè)置的詳細(xì)信息注簿,請參閱 system/sepolicy 中的 README
  3. 檢查 init.device<var></var>.rc 和 fstab.device<var></var> 文件跳仿,確保每一次使用“mount”都對應(yīng)一個添加了適當(dāng)標(biāo)簽的文件系統(tǒng)诡渴,或者指定了 context= mount 選項。
  4. 查看每個拒絕事件菲语,并創(chuàng)建 SELinux 政策來妥善處理每個拒絕事件妄辩。請參閱自定義中的示例惑灵。

您最好從 AOSP 中的政策入手,然后在這些政策的基礎(chǔ)上創(chuàng)建自己的自定義政策眼耀。要詳細(xì)了解政策策略以及其中一些步驟泣棋,請參閱編寫 SELinux 政策

用例

下面列舉了一些在開發(fā)軟件以及制定關(guān)聯(lián)的 SELinux 政策時需要注意的具體漏洞:

符號鏈接 - 由于符號鏈接以文件形式顯示畔塔,因此系統(tǒng)通常將其作為文件進(jìn)行讀取潭辈,而這可能會導(dǎo)致漏洞。例如澈吨,某些特權(quán)組件(例如 init)會更改某些文件的權(quán)限把敢,有時會使之極度開放。

這樣一來谅辣,攻擊者便可以將這些文件替換成指向其控制的代碼的符號鏈接修赞,從而重寫任意文件。但如果您知道自己的應(yīng)用絕不會遍歷符號鏈接桑阶,則可以通過 SELinux 來禁止您的應(yīng)用遍歷符號鏈接柏副。

系統(tǒng)文件 - 以應(yīng)該只有系統(tǒng)服務(wù)器可以修改的一系列系統(tǒng)文件為例。由于 netd蚣录、init 和 vold 是以 Root 身份運行的割择,因此它們也可以訪問這些系統(tǒng)文件。這樣一來萎河,如果 netd 遭到入侵荔泳,它將可以入侵這些文件,并可能會入侵系統(tǒng)服務(wù)器本身虐杯。

借助 SELinux玛歌,您可以將這些文件標(biāo)識為系統(tǒng)服務(wù)器數(shù)據(jù)文件。這樣一來擎椰,系統(tǒng)服務(wù)器就是唯一對這些文件具有讀寫權(quán)限的域支子。即使 netd 遭到入侵,它也無法將域切換到系統(tǒng)服務(wù)器域并訪問這些系統(tǒng)文件达舒,就算它是以 Root 身份運行的也是如此值朋。

應(yīng)用數(shù)據(jù) - 另一個示例是必須以 Root 身份運行但不應(yīng)獲得應(yīng)用數(shù)據(jù)訪問權(quán)限的一系列函數(shù)。這一項非常有用休弃,因為它可以做出廣泛的聲明吞歼,例如禁止與應(yīng)用數(shù)據(jù)無關(guān)的特定域訪問互聯(lián)網(wǎng)。

setattr - 對于 chmod塔猾、chown 等命令篙骡,您可以標(biāo)識關(guān)聯(lián)域可以在哪些文件中進(jìn)行 setattr 操作。這樣一來,便可以禁止對這些文件之外的任何文件進(jìn)行這類更改糯俗,即使以 Root 身份進(jìn)行也不例外尿褪。因此,應(yīng)用可以對帶 app_data_files 標(biāo)簽的文件運行 chmod 和 chown 命令得湘,但不能對帶 shell_data_files 或 system_data_files 標(biāo)簽的文件運行這些命令杖玲。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市淘正,隨后出現(xiàn)的幾起案子摆马,更是在濱河造成了極大的恐慌,老刑警劉巖鸿吆,帶你破解...
    沈念sama閱讀 211,561評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件囤采,死亡現(xiàn)場離奇詭異,居然都是意外死亡惩淳,警方通過查閱死者的電腦和手機(jī)蕉毯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來思犁,“玉大人代虾,你說我怎么就攤上這事〖ざ祝” “怎么了棉磨?”我有些...
    開封第一講書人閱讀 157,162評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長托呕。 經(jīng)常有香客問我含蓉,道長,這世上最難降的妖魔是什么项郊? 我笑而不...
    開封第一講書人閱讀 56,470評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮斟赚,結(jié)果婚禮上着降,老公的妹妹穿的比我還像新娘。我一直安慰自己拗军,他們只是感情好任洞,可當(dāng)我...
    茶點故事閱讀 65,550評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著发侵,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上见秽,一...
    開封第一講書人閱讀 49,806評論 1 290
  • 那天禀苦,我揣著相機(jī)與錄音伦忠,去河邊找鬼。 笑死赋咽,一個胖子當(dāng)著我的面吹牛宦赠,可吹牛的內(nèi)容都是我干的毡琉。 我是一名探鬼主播,決...
    沈念sama閱讀 38,951評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼号俐,長吁一口氣:“原來是場噩夢啊……” “哼踪危!你這毒婦竟也來了许布?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,712評論 0 266
  • 序言:老撾萬榮一對情侶失蹤擎勘,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后颖榜,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體棚饵,經(jīng)...
    沈念sama閱讀 44,166評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,510評論 2 327
  • 正文 我和宋清朗相戀三年掩完,在試婚紗的時候發(fā)現(xiàn)自己被綠了噪漾。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,643評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡且蓬,死狀恐怖欣硼,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情恶阴,我是刑警寧澤诈胜,帶...
    沈念sama閱讀 34,306評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站冯事,受9級特大地震影響焦匈,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜桅咆,卻給世界環(huán)境...
    茶點故事閱讀 39,930評論 3 313
  • 文/蒙蒙 一括授、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧岩饼,春花似錦、人聲如沸薛夜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,745評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽梯澜。三九已至寞冯,卻和暖如春渴析,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背吮龄。 一陣腳步聲響...
    開封第一講書人閱讀 31,983評論 1 266
  • 我被黑心中介騙來泰國打工俭茧, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人漓帚。 一個月前我還...
    沈念sama閱讀 46,351評論 2 360
  • 正文 我出身青樓母债,卻偏偏與公主長得像,于是被迫代替她去往敵國和親尝抖。 傳聞我的和親對象是個殘疾皇子毡们,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,509評論 2 348

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