selinux-驗證

驗證 SELinux

Android 強烈建議原始設備製造商 (OEM) 全面測試其 SELinux 實現。製造商在實現 SELinux 時,應先爲設備上需要測試的所有內容應用新政策。

應用新政策後,可以通過執行 getenforce 命令來確認 SELinux 在設備上的運行模式是否正確

該命令將會顯示全局 SELinux 模式:強制或寬容。請注意,該命令只會顯示全局 SELinux 模式。要確定每個域的 SELinux 模式,您必須查看相應的文件,或運行帶有適當 (-p) 標記的最新版 sepolicy-analyze(位於 /platform/system/sepolicy/tools/ 中)。

讀取拒絕事件

接下來是檢查是否存在錯誤。錯誤會以事件日誌的形式路由到 dmesg 和 logcat,並可在設備上從本地查看。製造商應先檢查這些設備上路由到 dmesg 的 SELinux 輸出並優化設置,然後再在寬容模式下公開發布,最後切換到強制模式。SELinux 日誌消息中包含“avc:”,因此可以通過 grep 輕鬆找到。可以通過運行 cat /proc/kmsg 來獲取當前的拒絕事件日誌,也可以通過運行 cat /proc/last_kmsg 來獲取上次啓動時的拒絕事件日誌。

藉助這種輸出,製造商可以輕鬆發現系統用戶或組件違反 SELinux 政策的行爲。然後,製造商便可以通過對相應軟件和/或 SELinux 政策進行更改來防範這種惡意行爲。

具體來說就是,這些日誌消息會指明在強制模式下哪些進行會失敗以及失敗原因。示例如下:

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

該輸出的解讀如下:

  • 上方的 { connectto } 表示正在執行的操作。通過它和末尾的 tclass (unix_stream_socket),您可以大致瞭解正在對什麼對象執行什麼操作,在該示例中是某個操作方正在試圖連接到 UNIX 信息流套接字。
  • scontext (u:r:shell:s0) 旨在告訴您發起相應操作的環境,在該示例中是某個作爲 shell 運行的操作方。
  • tcontext (u:r:netd:s0) 旨在告訴您操作目標的環境,在該示例中是某個歸 netd 所有的 unix_stream_socket。
  • 頂部的 comm="ping" 旨在爲您提供更多提示,讓您瞭解拒絕事件發生時正在運行的操作。在該示例中,這是一個非常實用的提示。

下面是另一個示例:

$ adb shell su root dmesg | grep 'avc: ' <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

以下是此拒絕事件的關鍵元素:

  • 操作 - 試圖進行的操作使用括號突出顯示:read write 或 setenforce
  • 操作方 - scontext(來源環境)條目表示操作方,在該示例中是 rmt_storage 守護進程。
  • 對象 - tcontext(目標環境)條目表示正在對哪個對象執行操作,在該示例中是 kmem。
  • 結果 - tclass(目標類別)條目表示操作對象的類型,在該示例中是 chr_file(字符設備)。

切換到寬容模式

重要提示:生產設備不支持寬容模式。CTS 測試可確認是否已啓用強制模式。

要通過 ADB 將設備的 SELinux 執行模式切換到全局寬容模式,請以根用戶的身份執行以下命令:

$ adb shell su root setenforce 0

或在內核命令行中輸入以下命令(在設備啓動初期):

androidboot.selinux=permissive androidboot.selinux=enforcing

使用 audit2allow

selinux/policycoreutils/audit2allow 工具可以獲取 dmesg 拒絕事件並將其轉換成相應的 SELinux 政策聲明。因此,該工具有助於大幅加快 SELinux 開發速度。audit2allow 會作爲 Android 源代碼樹的一部分被移植到設備上,並會在您基於源代碼編譯 Android 時自動進行編譯。

要使用該工具,請運行以下命令:

$ adb shell su root dmesg | audit2allow -p $OUT/root/sepolicy

不過,在檢查各種潛在增加項是否存在越界權限時務必要謹慎。例如,爲 audit2allow 饋送之前顯示的 rmt_storage 拒絕事件會導致以下建議的 SELinux 政策聲明:

#============= shell ============== allow shell kernel:security setenforce; #============= rmt ============== allow rmt kmem_device:chr_file { read write };

這會授予 rmt 向內核內存寫入內容的權限,從而形成明顯的安全漏洞。通常情況下,audit2allow 聲明只是一個起點,在這之後,可能還需要更改來源域以及目標的標籤,並納入適當的宏,才能獲得好的政策。有時,要解決正在檢查的拒絕事件,不應對政策進行任何更改,而是應更改違規的應用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章