自訂 SELinux

整合 SELinux 功能的基礎層級 仔細分析的結果,您可以加入自己的政策設定來涵蓋 自訂為 Android 作業系統此外,這些政策仍須 符合 Android 相容性計畫 不需要移除預設的 SELinux 設定。

製造商不得移除現有的 SELinux 政策。否則, Android SELinux 實作及其應用程式的風險 管理。這包括 確保符合規定且可以正常運作應用程式不得要求 以確保在支援 SELinux 的裝置上正常運作。

在自訂 SELinux 時進入閒置模式時,請記得:

  • 為所有新的 Daemon 寫入 SELinux 政策
  • 適時使用預先定義的網域
  • 將網域指派給任何以 init 服務產生的程序
  • 編寫政策前請先熟悉巨集
  • 將核心政策的異動提交至 Android 開放原始碼計畫

提醒你,請避免:

  • 建立不相容的政策
  • 允許自訂使用者政策
  • 允許自訂行動裝置管理 (MDM) 政策
  • 因違反政策而讓使用者感到不安
  • 新增後門程式

請參閱下文的「核心安全性功能」一節 Android 版 相容性定義說明文件

SELinux 採用白名單的方式,表示所有存取作業都必須明確 。從 Android 的預設 SELinux 後 政策已支援 Android 開放原始碼計畫,因此不一定要 以任何方式修改 SELinux 設定。如果您自訂 SELinux 設定, 務必要非常謹慎,避免破壞現有的應用程式做法如下:

  1. 使用 最新的 Android 核心
  2. 採用 原則 最低權限
  3. 只新增您自行在 Android 裝置上新增的項目。預設政策適用於 Android 開放原始碼計劃 Project 程式碼集。
  4. 將軟體元件分為單一模組 機器學習程式庫提供一系列預先編寫的程式碼 可用來執行機器學習工作
  5. 建立能區隔這些工作與不相關的 SELinux 政策 函式。
  6. 請將這些政策放入 *.te 檔案 (SELinux 的擴充功能) 政策來源檔案)。 /device/manufacturer/device-name/sepolicy 目錄,並使用 BOARD_SEPOLICY 變數 建構。
  7. 一開始最好使用允許的新網域。方法是使用許可的 。.te
  8. 分析結果並修正網域定義。
  9. 如果使用者偵錯功能中沒有進一步拒絕的情況,請移除許可宣告 建構應用程式

整合 SELinux 政策變更後,請在您的 確保日後的 SELinux 相容性理想 軟體開發程序,SELinux 政策只有在軟體 模型變更,而非實際實作。

開始自訂 SELinux 時,請先稽核您向 Android 新增的內容。如果 新增會執行新函式的元件 符合 Android 的安全性政策以及 Google 然後再啟用強制執行模式

為避免不必要的問題,建議過度廣泛 過度相容於限制過多且不相容,因而導致 裝置功能相反地,如果您所做的更動對其他人有益,請 將預設 SELinux 政策的修改內容提交為 patch。如果修補程式 您就不會需要執行此變更 每個新的 Android 版本

政策陳述式範例

SELinux 是以 M4 電腦語言,因此支援各種巨集以節省時間。

在以下範例中,所有網域都會獲得讀取或寫入權限 寫入 /dev/null 以及讀取 /dev/zero

# Allow read / write access to /dev/null
allow domain null_device:chr_file { getattr open read ioctl lock append write};

# Allow read-only access to /dev/zero
allow domain zero_device:chr_file { getattr open read ioctl lock };

這個陳述式可以使用 SELinux *_file_perms 編寫 巨集 (簡寫):

# Allow read / write access to /dev/null
allow domain null_device:chr_file rw_file_perms;

# Allow read-only access to /dev/zero
allow domain zero_device:chr_file r_file_perms;

範例政策

以下提供完整的 DHCP 政策範例,詳情請見下文:

type dhcp, domain;
permissive dhcp;
type dhcp_exec, exec_type, file_type;
type dhcp_data_file, file_type, data_file_type;

init_daemon_domain(dhcp)
net_domain(dhcp)

allow dhcp self:capability { setgid setuid net_admin net_raw net_bind_service
};
allow dhcp self:packet_socket create_socket_perms;
allow dhcp self:netlink_route_socket { create_socket_perms nlmsg_write };
allow dhcp shell_exec:file rx_file_perms;
allow dhcp system_file:file rx_file_perms;
# For /proc/sys/net/ipv4/conf/*/promote_secondaries
allow dhcp proc_net:file write;
allow dhcp system_prop:property_service set ;
unix_socket_connect(dhcp, property, init)

type_transition dhcp system_data_file:{ dir file } dhcp_data_file;
allow dhcp dhcp_data_file:dir create_dir_perms;
allow dhcp dhcp_data_file:file create_file_perms;

allow dhcp netd:fd use;
allow dhcp netd:fifo_file rw_file_perms;
allow dhcp netd:{ dgram_socket_class_set unix_stream_socket } { read write };
allow dhcp netd:{ netlink_kobject_uevent_socket netlink_route_socket
netlink_nflog_socket } { read write };

讓我們來剖析範例:

在第一行的類型宣告中,DHCP Daemon 繼承 基本安全性政策 (domain)。來自上一句 DHCP 可以讀取及寫入 /dev/null

在第二行,系統會將 DHCP 識別為許可網域。

init_daemon_domain(dhcp) 行中,政策顯示 DHCP 為 產生自 init,可以與其通訊。

net_domain(dhcp) 行中,這項政策允許 DHCP 使用 net 網域的一般網路功能,例如讀取 與寫入 TCP 封包、透過通訊端通訊以及執行 DNS 要求。

allow dhcp proc_net:file write; 行中,政策狀態 DHCP 可以寫入 /proc 中的特定檔案。這一行會示範 SELinux 的細部檔案標籤服務。使用了 proc_net 標籤 ,限制只具備 /proc/sys/net 以下檔案的寫入權限。

這個範例的最後一個區塊,開頭為 allow dhcp netd:fd use; 用於說明應用程式可如何取得以下權限 互動。這項政策指出 DHCP 和 netd 可能會與 透過檔案描述元、FIFO 檔案、datagram 通訊端和 UNIX 串流 通訊端。DHCP 只能從 Datagram 通訊端和 UNIX 讀取和寫入 以及不建立或開啟串流通訊端。

可用的控制選項

類別 權限
檔案
ioctl read write create getattr setattr lock relabelfrom relabelto append
unlink link rename execute swapon quotaon mounton
目錄
add_name remove_name reparent search rmdir open audit_access execmod
通訊端
ioctl read write create getattr setattr lock relabelfrom relabelto append bind
connect listen accept getopt setopt shutdown recvfrom sendto recv_msg send_msg
name_bind
檔案系統
mount remount unmount getattr relabelfrom relabelto transition associate
quotamod quotaget
處理程序
fork transition sigchld sigkill sigstop signull signal ptrace getsched setsched
getsession getpgid setpgid getcap setcap share getattr setexec setfscreate
noatsecure siginh setrlimit rlimitinh dyntransition setcurrent execmem
execstack execheap setkeycreate setsockcreate
安全性
compute_av compute_create compute_member check_context load_policy
compute_relabel compute_user setenforce setbool setsecparam setcheckreqprot
read_policy
能力
chown dac_override dac_read_search fowner fsetid kill setgid setuid setpcap
linux_immutable net_bind_service net_broadcast net_admin net_raw ipc_lock
ipc_owner sys_module sys_rawio sys_chroot sys_ptrace sys_pacct sys_admin
sys_boot sys_nice sys_resource sys_time sys_tty_config mknod lease audit_write
audit_control setfcap

更多

及其他商家

永不允許規則

SELinux neverallow 規則禁止不應該出現的行為。 經過相容性測試 系統現在會在所有裝置上強制執行 SELinux neverallow 規則。

以下規範旨在協助製造商避免出錯 與 neverallow 規則有關。規則編號 這適用於 Android 5.1,且可能會隨版本變更。

規則 48:neverallow { domain -debuggerd -vold -dumpstate -system_server } self:capability sys_ptrace;
請參閱 ptrace 的手冊頁面。sys_ptrace 具備能力賦予 ptrace 任何程序的能力,因此交易可帶來可觀的 控制其他程序,且應該只屬於指定的系統 所列出的元件需要這項功能的需求通常表示 存在並非適用於面向使用者的版本 不需要的功能移除不必要的元件。

規則 76:neverallow { domain -appdomain -dumpstate -shell -system_server -zygote } { file_type -system_file -exec_type }:file execute;
這項規則旨在防止系統執行任何程式碼。 具體來說,它會斷言只有 /system 上的程式碼能執行。 ,透過驗證開機程序等機制來確保安全。 您在使用這個 API 遇到問題時,通常可以找到最佳解決方案 「neverallow」規則會將違規程式碼移至 /system 個分區。

在 Android 8.0 以上版本中自訂 SEPolicy

本節提供 Android 8.0 和 包括 Android 開放原始碼計畫 (AOSP) SEPolicy 詳細資料 SEPolicy 擴充功能。如要進一步瞭解如何保留 SELinux 政策 各個分區和 Android 版本都相容,詳情請參閱 相容性

政策擺放位置

在 Android 7.0 以下版本中,裝置製造商可以為 BOARD_SEPOLICY_DIRS,包括用來擴增 Android 開放原始碼計畫政策的政策 在不同裝置類型放送在 Android 8.0 以上版本中新增政策 BOARD_SEPOLICY_DIRS 只會將政策放在供應商中 圖片。

在 Android 8.0 以上版本中,Android 開放原始碼計畫的下列位置提供政策:

  • system/sepolicy/public。包含匯出供使用的政策 供應商專屬政策Android 8.0 應有盡有 相容性基礎架構。 公開政策應涵蓋各個發布版本,因此應納入 任何 /public 資訊。因此 可以刊登於 /public 的政策類型 受到限制。請將這個平台的已匯出政策 API 納入考量:任何會 交易 ID 介於 /system 和 「/vendor」屬於這裡。
  • system/sepolicy/private。包含 運作,但廠商映像檔政策 任何主題或累積的知識
  • system/sepolicy/vendor所含元件相關政策 位於 /vendor,但位於核心平台樹狀結構中 (而非 裝置專屬目錄)。這是建構系統的 區分裝置與全域元件;這是概念上 為下方說明的裝置專屬政策的一部分
  • device/manufacturer/device-name/sepolicy。 包括裝置專屬政策。這也包含裝置自訂 政策,在 Android 8.0 以上版本中對應至元件政策 。

在 Android 11 以上版本中,system_ext 和產品分區也可以包括 分區專屬政策system_ext 和產品政策也分為 公開和私人,且廠商可使用 system_ext 和產品的公開資料 例如系統政策

  • SYSTEM_EXT_PUBLIC_SEPOLICY_DIRS。納入匯出至以下政策的政策 用於供應商專屬政策已安裝至 system_ext 分區。
  • SYSTEM_EXT_PRIVATE_SEPOLICY_DIRS。需提供政策 因為系統映像檔運作情形 任何人都應瞭解到政策內容已安裝至 system_ext 分區。
  • PRODUCT_PUBLIC_SEPOLICY_DIRS。納入匯出至以下政策的政策 用於供應商專屬政策已安裝至產品分區。
  • PRODUCT_PRIVATE_SEPOLICY_DIRS。包含 運作的產品圖片,但是哪一項廠商圖片政策 任何人都不希望他們知道已安裝至產品分區。
注意:使用 GSI 時,原始設備製造商 (OEM) 的 system_ext 和產品分區不會 進行安裝。使用 OEM 的 system_ext 和 產品公開政策改為 NOP,因為 OEM 專屬類型定義
注意:使用 system_ext 和產品公開政策時,請格外小心。 公開政策就像 system_ext/產品與供應商之間的匯出 API。 合作夥伴應自己管理相容性問題。

支援的政策情境

在搭載 Android 8.0 以上版本的裝置上,供應商圖片必須正常運作 ,以及 Google 提供的參考 Android 開放原始碼計畫系統映像檔 (並傳遞這張參考圖片上的 CTS)。這些需求能確保 架構與供應商程式碼的區別。這類裝置支援 情境。

供應商專用圖片擴充功能

範例:將新服務新增至 vndservicemanager 以及支援廠商圖片的程序圖片

和搭載舊版 Android 的裝置一樣,新增裝置專用 自訂功能 device/manufacturer/device-name/sepolicy。 新政策用於規範供應商元件與其他供應商的互動方式 (僅限) 元件應涉及僅包含 device/manufacturer/device-name/sepolicy。 此處撰寫的政策允許供應商上的程式碼正常運作,因此並不會更新 ,且會列於裝置上的合併政策中 以及參考 Android 開放原始碼計畫系統映像檔

供應商圖片支援 透過 Android 開放原始碼計畫

範例:新增程序 (註冊 hwservicemanager),該元件會導入 AOSP 定義的 HAL。

和搭載較舊版本 Android 的裝置一樣,執行以下作業: 為裝置自訂功能 device/manufacturer/device-name/sepolicy。 可使用 system/sepolicy/public/ 中匯出的政策 配合供應商政策的規定出貨。類型和屬性 公開政策可用於新規則,也就是定義與新舊政策的互動 供應商專屬位元,取決於提供的 neverallow 以及與僅限供應商的情況相同,這裡的新政策將不會更新 為單一架構的 OTA 映像檔,並會列於 並顯示參考 Android 開放原始碼計畫系統映像檔的裝置。

系統映像檔專用擴充功能

範例:新增服務 (向 servicemanager 註冊) 僅由系統映像檔的其他程序存取。

system/sepolicy/private 中新增這項政策。您可以將額外的 程序或物件,以便在合作夥伴系統映像檔中啟用功能 不需要和廠商映像檔上的新元件互動 (具體來說,這類程序或物件必須在沒有政策規定的情況下 供應商映像檔)。「system/sepolicy/public」匯出的政策為 就如同廠商專用圖片額外資訊這項政策是 部分,且可在架構專用的 OTA 中更新,但 。

供應商圖片 可提供擴充 Android 開放原始碼計畫元件的擴充功能

範例:新的非 Android 開放原始碼計畫 HAL,供的擴充用戶端使用 也會顯示在 Android 開放原始碼計畫系統映像檔 (例如 Extended system_server) 中。

系統與供應商之間的互動政策必須包含 device/manufacturer/device-name/sepolicy 並提交到廠商分區 這與上述情況類似,新增供應商圖片支援功能, 並附上參考 Android 開放原始碼計畫映像檔。除了經過修改的 Android 開放原始碼計畫元件外, 需要額外的政策,才能與系統的其餘部分正確運作 分區 (只要仍保有公開 Android 開放原始碼計畫類型,就沒有問題 標籤)。

與僅系統映像檔互動的 Android 開放原始碼計畫元件互動政策 擴充功能應該位於 system/sepolicy/private

系統映像檔 僅存取 Android 開放原始碼計畫介面的擴充功能

範例:新的非 Android 開放原始碼系統程序必須存取 HAL: 也就是 Android 開放原始碼計畫所依賴的

這類似僅限系統映像檔 擴充功能範例,差別只在於新的系統元件可在 system/vendor 介面。新系統元件的政策必須 前往 system/sepolicy/private,但可以接受 經由 Android 開放原始碼計畫建立的介面 system/sepolicy/public (也就是 功能介紹)。這項政策可納入裝置專屬政策 政策,無法使用其他 system/sepolicy/private 造成任何影響。 更新。這項政策可能會在架構專用的 OTA 中變更,但不會在架構中變更 表示使用 Android 開放原始碼計畫系統映像檔 (沒有新系統時) 元件)。

供應商圖片 可提供新系統元件的擴充功能

範例:新增非 Android 開放原始碼計畫 HAL,供用戶端程序使用 沒有 Android 開放原始碼計畫的類比 (因此需要專屬的網域)。

Android 開放原始碼計畫擴充功能類似 例如,系統與供應商互動時須遵守的政策 device/manufacturer/device-name/sepolicy 並傳輸到 (這是為了確保系統政策不知道供應商專屬的詳細資料)。個人中心 即可新增擴充政策的公開類型 system/sepolicy/public;除了 請勿移除 Android 開放原始碼計畫公開政策。全新公開社群 則可用於 system/sepolicy/privatedevice/manufacturer/device-name/sepolicy

請注意,system/sepolicy/public 新增的每一個項目 提高複雜性,亦即公開必須追蹤到 並遵守其他限制。僅限新類型和 您可以在 system/sepolicy/public 中新增對應的允許規則; 不支援屬性和其他政策陳述式。此外,新的 公開類型無法用來 /vendor政策。

不支援的政策情境

搭載 Android 8.0 以上版本的裝置不支援下列功能 政策情境和示例

其他資訊 延伸至需要權限的系統映像檔 新的供應商映像檔元件 完成僅有架構的 OTA 解決方案之後

範例: 新的非 Android 開放原始碼系統程序, 網域」) 新增至下一個 Android 版本,因此需要 非 Android 開放原始碼計畫 HAL

風格類似 新品 (非 Android 開放原始碼計畫) 系統和供應商元件互動,但新系統除外 導入的 只有架構專屬的網路旅行社雖然這個新類型可以新增到 system/sepolicy/public,現有供應商政策沒有任何資訊 ,因為只會追蹤 Android 8.0 系統公開政策。 Android 開放原始碼計畫會透過屬性 (例如 hal_foo 屬性),但屬性合作夥伴額外資訊並未 system/sepolicy/public 中支援,但此方法不適用於 供應商政策。存取權必須由現有的公開類型提供。

範例: 變更系統程序 (Android 開放原始碼計畫或非 Android 開放原始碼計畫) 變更其與非 Android 開放原始碼計畫廠商元件互動的方式。

系統映像檔的政策必須不具具體性 自訂供應商設定。與 Android 開放原始碼計畫中特定介面相關的政策,因此 透過系統/sepolicy/public 中的屬性公開,以便廠商政策 選擇啟用日後使用這些屬性的系統政策。不過 system/sepolicy/public 中的屬性額外資訊 支援,因此所有定義系統元件互動方式的政策 含有新的供應商元件 (且該屬性不會由 (在 Android 開放原始碼計畫 system/sepolicy/public 中找到) 必須位於 device/manufacturer/device-name/sepolicy。 這表示系統類型無法變更 針對供應商類型,進行了僅限架構的 OTA 存取。