為配合主幹穩定開發模型,並確保生態系統的平台穩定性,我們將於 2026 年起,在第 2 季和第 4 季將原始碼發布至 AOSP。如要建構及貢獻 AOSP,建議使用 android-latest-release,而非 aosp-main。android-latest-release 資訊清單分支版本一律會參照推送至 AOSP 的最新版本。詳情請參閱「Android 開放原始碼計畫變更」一文。
Google uses AI technology to translate content into your preferred language. AI translations can contain errors.
核心中的控制流程完整性
透過集合功能整理內容
你可以依據偏好儲存及分類內容。
控制流程完整性 (CFI) 是一種安全機制,可禁止變更已編譯二進位檔的原始控制流程圖,大幅提高這類攻擊的難度。
從 Android 9 開始,您可以在核心中啟用 CFI。
Linux 核心有兩種不同的 CFI 實作方式:
- 適用於 Linux 6.0 以下版本,Clang CFI 依賴 Clang LTO
- 適用於 Linux 6.1 以上版本,Clang KCFI
Clang CFI 必須使用連結時間最佳化 (LTO) 編譯。LTO 會保留物件檔案的 LLVM 中間碼表示法,直到連結時間為止,讓編譯器能更妥善地判斷可執行的最佳化作業。在 Android 測試中,LTO 和 CFI 的組合對程式碼大小和效能造成的負擔微乎其微。不過,啟用 LTO 會大幅增加核心建構時間。
Clang KCFI 不需要 LTO,因此較新的 Android 核心可享有 CFI 的優點,且不會產生 LTO 的建構時間負擔。
導入作業
CFI 由 CONFIG_CFI_CLANG 選項控制,可啟用 Clang CFI 或 Clang KCFI。
如要進一步瞭解 CFI 和其他轉送控制項檢查的處理方式,請參閱 LLVM 設計文件。在該處,KCFI 稱為 -fsanitize=kcfi。
疑難排解
啟用後,請解決驅動程式可能存在的任何類型不符錯誤。透過不相容的函式指標進行間接函式呼叫時,會觸發 CFI。偵測到 CFI 失敗時,核心會列印警告,其中包含呼叫的函式和導致失敗的堆疊追蹤。如要修正這個問題,請確保函式指標一律與所呼叫的函式類型相同。
如要協助偵錯 CFI 失敗情形,請啟用 CONFIG_CFI_PERMISSIVE,這會列印警告訊息,而不是導致核心錯誤。正式環境不得使用寬鬆模式。
驗證
目前沒有專為 CFI 設計的 CTS 測試。請務必確認 CTS 測試在啟用和未啟用 CFI 的情況下都能通過,以驗證 CFI 不會影響裝置。
這個頁面中的內容和程式碼範例均受《內容授權》中的授權所規範。Java 與 OpenJDK 是 Oracle 和/或其關係企業的商標或註冊商標。
上次更新時間:2026-05-27 (世界標準時間)。
[[["容易理解","easyToUnderstand","thumb-up"],["確實解決了我的問題","solvedMyProblem","thumb-up"],["其他","otherUp","thumb-up"]],[["缺少我需要的資訊","missingTheInformationINeed","thumb-down"],["過於複雜/步驟過多","tooComplicatedTooManySteps","thumb-down"],["過時","outOfDate","thumb-down"],["翻譯問題","translationIssue","thumb-down"],["示例/程式碼問題","samplesCodeIssue","thumb-down"],["其他","otherDown","thumb-down"]],["上次更新時間:2026-05-27 (世界標準時間)。"],[],[]]