MTE 可在 Android 核心和 Android 系統中的任何程序中獨立啟用。Google 並未強制規定任何特定設定,而是希望為裝置建構人員提供最大的彈性。
本文將說明 MTE 設定和範圍,我們認為這可為 Android 使用者提供持續的安全漏洞緩解機制,在安全性和成本之間取得良好平衡。
核心
核心中的 MTE 會透過指令列設定。在同步模式中,預設為開啟。這項規定日後可能會因以下幾個原因而有所變動:
- 這項功能已證實會對效能造成重大影響,因此需要進行最佳化調整。
- 在業界普遍認為,核心程式碼品質不足以在強制 (也就是發生錯誤時會發生恐慌) 模式下運送 MTE。
目前建議在正式版裝置上停用核心 MTE。如要這樣做,請將 kasan=off
新增至核心指令列。
使用者空間
Google 提供預設的使用者空間二進位檔清單,可透過 MTE 進行保護。這份清單是由 Android 安全性團隊的輸入內容所組成,其中包含具備特殊權限和/或處理不受信任輸入內容的元件。如要查看建議搭配 MTE 使用的最新原生二進位檔清單,請前往 Android 建構系統中的 memtag-common.mk 檔案。此外,系統也會納入多個系統應用程式:目前有 NFC、藍牙和 SecureElement。這些二進位檔和應用程式預設為在非同步模式下啟用。
目前建議您使用預設目標清單 (無需變更)。此外,建議您評估核心系統的 BSP 和 OEM 新增項目,並在安全性敏感的項目上啟用 MTE。
應用程式
目前只有上述三個系統應用程式會使用 MTE。第三方應用程式必須使用 off
以外的值,才能指定 android:memtagMode
,啟用 MTE。AndroidManifest.xml
因此,Geekbench 或 AnTuTu 等常見基準測試套件不會透過 MTE 執行。如果也停用核心 MTE (請參閱上方的 kasan=off
),則基準測試應會顯示極少的效能影響 (如果有影響的話)。
至於其他應用程式,Chrome 正在積極開發 MTE 支援功能。目前的 Play 商店版本 Chrome 會在資訊清單中加入 memtagMode=async
設定。我們也預期 Android 生態系統中許多重視安全性的應用程式 (例如銀行應用程式) 最終也會採取相同做法。另一方面,我們預期部分需要 CPU 效能極致化的應用程式 (例如遊戲) 會選擇繼續停用 MTE。
其他模式
上述操作說明只會在所有地方使用非同步 MTE 模式。視硬體而定,其他模式的速度可能幾乎與此相同,甚至更快。也提供更完善的診斷功能,以及更強大的安全漏洞緩解屬性。
建議您測試一或兩種其他設定,看看是否能滿足效能/電源需求。您可以寫入 /sys/devices/system/cpu/cpu*/mte_tcf_preferred
,為系統中的每個 CPU 核心設定 MTE 模式。舉例來說,如果您寫入 sync
(或 asymm
),則會導致任何已要求使用非同步模式的使用者空間程序,在該核心上執行時,會自動升級為同步 (或非對稱) 模式。您可以在裝置啟動時,在 .rc 檔案中完成這項設定。
建議您評估一或兩個其他設定,檢查是否符合效能和電源需求。以下是一些值得探索的有趣設定:
- 所有核心皆為 Asymm。
- 在大型核心上使用 Asymm,在其他核心上使用 Sync。
如要確認程序是否要求非同步模式 (可能會自動升級),請確認下列行包含 PR_MTE_TCF_SYNC 和 PR_MTE_TCF_ASYNC:
debuggerd <PID> | head -30 | grep tagged_addr
很遺憾,目前沒有簡單的方法可以查看程序的有效模式;但任何顯示上述兩個值的程序都會受到自動升級行為的影響。