<devsite-heading text="驗證 SELinux" for="%E9%AA%8C%E8%AF%81-selinux" level="h1" class="devsite-page-title"># 驗證 SELinux</devsite-heading>
Android 強烈建議 OEM 全面測試其 SELinux 實現(xiàn)。制造商在實現(xiàn) SELinux 時,應(yīng)先在一組測試設(shè)備上實施新政策。
實施新政策后澎蛛,您可以通過執(zhí)行 getenforce
命令來確認(rèn) SELinux 在設(shè)備上的運行模式是否正確。
該命令會輸出全局 SELinux 模式:強制或?qū)捜荨R_定每個域的 SELinux 模式杆煞,您必須檢查相應(yīng)的文件,或運行帶有相應(yīng) (-p
) 標(biāo)記的最新版 sepolicy-analyze
(位于 /platform/system/sepolicy/tools/
中)腐泻。
<devsite-heading text="閱讀拒絕事件" for="reading_denials" level="h2" link="" toc="" class="" back-to-top="">## 閱讀拒絕事件</devsite-heading>
<devsite-heading text="閱讀拒絕事件" for="reading_denials" level="h2" link="" toc="" class="" back-to-top=""></devsite-heading>
檢查是否有錯誤决乎,錯誤會以事件日志的形式傳給 dmesg
和 logcat
,并可在設(shè)備上從本地查看派桩。制造商應(yīng)先檢查這些設(shè)備上傳給 dmesg
的 SELinux 輸出并優(yōu)化設(shè)置构诚,然后再在寬容模式下公開發(fā)布,最后切換到強制模式铆惑。SELinux 日志消息中包含“avc:
”字樣范嘱,因此可使用 grep
輕松找到。您可以通過運行 cat /proc/kmsg
來獲取當(dāng)前的拒絕事件日志员魏,也可以通過運行 cat /sys/fs/pstore/console-ramoops
來獲取上次啟動時的拒絕事件日志丑蛤。
根據(jù)這些輸出內(nèi)容,制造商可以輕松發(fā)現(xiàn)系統(tǒng)用戶或組件違反 SELinux 政策的行為撕阎。然后受裹,制造商便可更改相應(yīng)軟件和/或 SELinux 政策,以防范此類惡意行為虏束。
具體來說名斟,這些日志消息會指明在強制模式下哪些進(jìn)程會失敗以及失敗原因。示例如下:
<devsite-code><pre is-upgraded="">avc: denied { connectto } for pid=2671 comm="ping" path="/dev/socket/dnsproxyd"
scontext=u:r:shell:s0 tcontext=u:r:netd:s0 tclass=unix_stream_socket
</pre></devsite-code>
該輸出的解讀如下:
- 上方的
{ connectto }
表示執(zhí)行的操作魄眉。根據(jù)它和末尾的tclass
(unix_stream_socket
)砰盐,您可以大致了解是對什么對象執(zhí)行什么操作。在此例中坑律,是操作方正在試圖連接到 UNIX 信息流套接字岩梳。 -
scontext (u:r:shell:s0)
表示發(fā)起相應(yīng)操作的環(huán)境囊骤,在此例中是 shell 中運行的某個程序。 -
tcontext (u:r:netd:s0)
表示操作目標(biāo)的環(huán)境冀值,在此例中是歸netd
所有的某個 unix_stream_socket也物。 - 頂部的
comm="ping"
可幫助您了解拒絕事件發(fā)生時正在運行的程序。在此示例中列疗,給出的信息非常清晰明了滑蚯。
我們再看看另一個示例:
<devsite-code><pre class="devsite-terminal" is-upgraded="">adb shell su root dmesg | grep 'avc: '</pre></devsite-code>
輸出:
<devsite-code><pre is-upgraded=""><5> type=1400 audit: avc: denied { read write } for pid=177
comm="rmt_storage" name="mem" dev="tmpfs" ino=6004 scontext=u:r:rmt:s0
tcontext=u:object_r:kmem_device:s0 tclass=chr_file
</pre></devsite-code>
以下是此拒絕事件的關(guān)鍵元素:
- 操作 - 試圖進(jìn)行的操作會使用括號突出顯示:
read write
或setenforce
。 - 操作方 -
scontext
(來源上下文)條目表示操作方抵栈;在此例中為rmt_storage
守護(hù)進(jìn)程告材。 - 對象 -
tcontext
(目標(biāo)上下文)條目表示對哪個對象執(zhí)行操作;在此例中為 kmem古劲。 - 結(jié)果 -
tclass
(目標(biāo)類別)條目表示操作對象的類型斥赋;在此例中為chr_file
(字符設(shè)備)。
<devsite-heading text="切換到寬容模式" for="switching_to_permissive" level="h2" link="" toc="" class="" back-to-top="">## 切換到寬容模式</devsite-heading> <devsite-heading text="切換到寬容模式" for="switching_to_permissive" level="h2" link="" toc="" class="" back-to-top=""></devsite-heading>
重要提示:生產(chǎn)設(shè)備不支持寬容模式产艾。CTS 測試會確認(rèn)是否已啟用強制模式疤剑。
SELinux 強制模式可以在 userdebug 或 eng 版本中通過 ADB 停用。為此闷堡,請先運行 adb root
以將 ADB 切換為 root 權(quán)限隘膘。然后,要停用 SELinux 強制模式杠览,請運行以下命令:
<devsite-code><pre class="devsite-terminal" is-upgraded="">adb shell setenforce 0
</pre></devsite-code>
或在內(nèi)核命令行中輸入以下命令(適用于設(shè)備開發(fā)初期):
<devsite-code>```
androidboot.selinux=permissive
`selinux/policycoreutils/audit2allow` 工具可以獲取 `dmesg` 拒絕事件并將其轉(zhuǎn)換成相應(yīng)的 SELinux 政策聲明弯菊。因此,該工具有助于大幅加快 SELinux 開發(fā)速度倦零。 `audit2allow` 包含在 Android 源代碼樹中,會在您基于源代碼編譯 Android 時自動編譯吨悍。
要使用該工具扫茅,請運行以下命令:
<devsite-code>```
adb pull /sys/fs/selinux/policy
```</devsite-code>
**注意**:運行這些命令不會更改 bugreport.txt,因為所有日志都已經(jīng)存在育瓜,包括上次重新啟動之前存在的日志葫隙。在設(shè)備進(jìn)行 OTA 更新或向設(shè)備刷入開發(fā)版系統(tǒng)時,新舊違規(guī)行為會混雜在一起躏仇,直到下一次重新啟動為止恋脚。要解決此問題,請重新啟動設(shè)備焰手,或者從您的錯誤報告中濾除 console-ramoops 和 LAST_LOGCAT糟描。
不過,請務(wù)必仔細(xì)審核要添加到政策中的條目书妻,以免出現(xiàn)權(quán)限過寬的情況船响。例如,如果將上面的 `rmt_storage` 拒絕事件輸入到 audit2allow 中,會生成以下 SELinux 政策聲明建議:
<devsite-code><pre is-upgraded="">#============= shell ==============
allow shell kernel:security setenforce;
#============= rmt ==============
allow rmt kmem_device:chr_file { read write };
</pre></devsite-code>
這會授予 `rmt` 向內(nèi)核內(nèi)存寫入內(nèi)容的權(quán)限见间,從而形成明顯的安全漏洞聊闯。通常情況下,`audit2allow` 給出的聲明建議只是一個大致的基礎(chǔ)米诉。在添加這些聲明后菱蔬,您可能需要更改來源域和目標(biāo)標(biāo)簽,并納入適當(dāng)?shù)暮晔仿拢拍軐崿F(xiàn)良好的政策配置拴泌。有時,應(yīng)對拒絕事件的合理方式不是更改政策抵窒,而是更改違規(guī)的應(yīng)用弛针。