
作業系統完整性
Apple 在設計作業系統軟體時,始終以安全性為核心。此設計包含硬體信任根,可支援安全開機與快速且安全的軟體更新程序。Apple 作業系統也採用其特製的晶片式硬體功能,可協助防止作業系統執行期間遭到惡意利用。這些執行階段功能可保護受信任程式碼在執行時的完整性。Apple 的作業系統軟體可協助緩解攻擊和利用技巧,無論源自於惡意 App、網路或經由任何其他管道都能應付。這些防護措施可於採用受支援 Apple 設計 SoC 的裝置上使用,包含 iOS、iPadOS、配備 Apple 晶片的 Mac 上的 macOS、tvOS、visionOS,以及 watchOS。
功能 | A10 | A11、S3 | A12-A14 S4-S10 | A15-A18 | M1 | M2-M4 | A19 M5 |
|
|
|
|
|
|
| |
|
|
|
|
|
|
| |
|
|
|
|
|
|
| |
|
|
|
|
|
|
| |
|
|
|
1 |
2 |
|
| |
|
|
|
|
|
2 |
2 | |
|
|
|
|
|
|
|
1:A15 或以上版本和 M2 或以上版本的 SoC 支援「安全頁表監視器(SPTM)」,並在支援的平台上取代了「頁面保護層」。
2:「頁面保護層(PPL)」和「安全頁表監視器(SPTM)」在所有平台上強制執行已簽章和受信任的程式碼,唯獨 macOS 例外(因為 macOS 設計上允許執行任何程式碼)。所有其他安全屬性,包括頁表的保護,都在所有受支援的平台上提供。
核心完整保護
作業系統核心完成初始化後,會啟用「核心完整保護」(KIP),以協助防止核心與驅動程式程式碼遭修改。記憶體控制器提供一個受保護的實體記憶體區域,iBoot 會用此區域來載入核心與核心延伸功能。啟動完成後,記憶體控制器會拒絕對受保護的實體記憶體區域進行寫入。「應用程式處理器」的「記憶體管理單元」(MMU)已設定為協助防止從受保護記憶體區域外的實體記憶體對應特權碼,以及協助防止核心記憶體區域內的實體記憶體可寫入對應。
為了防止重新設定,用於啟用 KIP 的硬體會在開機程序完成後被鎖定。
快速權限取用限制
自 Apple A11 仿生晶片和 S3 SoC 開始,引入了全新的硬體原型。這個原型(「快速權限取用限制」)包含一個 CPU 暫存器,可快速限制每個執行緒的權限。透過「快速權限取用限制」(又稱為 APRR 暫存器),支援的作業系統可以移除記憶體中的執行權限,而不會造成系統呼叫的額外負荷和分頁表清查或排清。這些暫存器提供了額外一層減緩機制,可應付來自網路的攻擊,尤其是任何即時編譯(just-in-time compiled)程式碼,因為記憶體在遭讀取和可寫入的同時無法有效執行。
系統副處理器完整保護
副處理器韌體處理許多重要系統任務,例如「安全隔離區」、影像感測器處理器以及動作副處理器。因此其安全性是整套系統安全性的關鍵所在。為避免副處理器韌體遭修改,Apple 採用系統副處理器完整保護(SCIP)機制。
SCIP 的運作方式與 KIP 類似:在開機時,iBoot 會將每個副處理器的韌體載入受保護的記憶體區域(此記憶體區域是預先保留且與 KIP 區域隔離)。iBoot 會設定每個副處理器的記憶體單元,以協助防止以下情況:
受保護的記憶體區域部分外的可執行對應
受保護的記憶體區域部分內的可寫入對應
同樣在開機時,為了針對「安全隔離區」設定 SCIP,會使用「安全隔離區」作業系統。開機程序完成後,用於啟用 SCIP 的硬體會遭鎖定。這樣的設計是為了防止重新設定。
指標認證碼
指標認證碼(PAC)用於防止記憶體損毀錯誤遭惡意利用。系統軟體和內建 App 會使用 PAC 來協助防止修改函式指標和傳回位址(程式碼指標)。PAC 使用五個機密 128 位元值來簽署核心指示與資料,且所有使用者空間處理序都有各自專屬的 B 鍵。系統會對項目進行 Salt 處理和簽署,如下所示。
項目 | 索引鍵 | Salt |
|---|---|---|
函式傳回位址 | IB | 儲存位址 |
函式指標 | IA | 0 |
區塊叫用函式 | IA | 儲存位址 |
區塊描述指標 | DA | 儲存位址 + 0xC0BB |
Objective-C 方法快取 | IB | 儲存位址 + 類別 + 選取器 |
Objective-C Isa 指標 | DA | 儲存位址 + 0x6AE1 |
Objective-C Super 指標 | DA | 儲存位址 + 0xB5AB |
Selector 型別的 Objective-C ivar | DB | 儲存位址 + 0x57C2 |
唯讀 Objective-C 類別資料指標 | DA | 儲存位址 + 0x61F8 |
C++ 虛擬表格項目 | IA | 儲存位址 + 雜湊(混合方法名稱) |
C++ 虛擬表格指標 | DA | 儲存位址 + 雜湊(經混淆處理的基底 V-Table 名稱) |
運算 Goto 標籤 | IA | 雜湊(函式名稱) |
核心執行緒狀態 | GA | • |
使用者執行緒狀態暫存器 | IA | 儲存位址 |
簽章值儲存在 64 位元指標頂端未使用的填補位元中。使用前會先驗證簽章,且會儲存填補以協助確保函式指標位址運作中。驗證失敗會導致中止。這個驗證機制提高了許多攻擊的難度(例如返回導向程式設計(ROP)攻擊),這些攻擊會試圖操縱儲存在堆疊上的函式傳回位址,藉此惡意誘使裝置執行現有的程式碼。
頁面保護層
程式碼簽章驗證完成後,iOS、iPadOS、visionOS 和 watchOS 的「頁面保護層」(PPL)的設計會防止使用者空間程式碼遭修改。PPL 建置在 KIP 和「快速權限取用限制」之上,可管理分頁表權限覆蓋,以便確保只有 PPL 可變更包含使用者程式碼和分頁表的受保護頁面。系統可藉由支援全系統程式碼完整性之執行來大幅減少攻擊面積,即使是遭入侵的核心面積也適用。這個防護機制並未在 macOS 上提供,因為 PPL 僅適用於要求所有執行的程式碼都必須經過簽署的系統。
安全頁表監視器和受信任執行監視器
iOS、iPadOS、macOS 和 visionOS 上的安全頁表監視器(SPTM)和受信任執行監視器(TXM)經過精心設計,可以彼此搭配運作,用來協助保護使用者程序與核心程序的頁面表,避免遭到修改。這項保護機制同樣涵蓋攻擊者已具備核心寫入能力、且能繞過控制流程防護的情境。SPTM 落實此機制的方式,是使用比核心還高的權限層級,並採用權限較低的 TXM,以實際強制執行管控程式碼執行的規則。根據這套系統的設計,由於如此區隔權限及管控兩者間的信任,TXM 入侵不會自動轉譯為 SPTM 略過。在 A15 或以上版本和 M2 或以上版本的 SOC 中,SPTM(搭配 TXM)取代了 PPL,其縮小了攻擊面,且不仰賴核心的信任,即使在開機程序的早期階段也一樣。SPTM 仰賴於新的晶片基本元件,是 PPL 所使用的「快速權限取用限制」的革新技術,僅適用於上表中列出的處理器。
記憶體完整性強制機制
記憶體完整性強制機制(MIE)是一套全面性的記憶體安全防禦機制,適用於配備 A19 與 M5 或後續處理器的 Apple 平台。MIE 建立於 Apple 安全記憶體配置器所提供的穩固基礎之上,並結合在同步模式下運作的「強化記憶體標記延伸功能」(EMTE),同時由一系列完整的「標記機密性強制機制」規則加以支援。MIE 直接內建於 Apple 晶片中,能為包含核心在內的重要攻擊面提供持續啟用、且等級極高的記憶體安全防護,同時維持使用者所期望的效能與電力效率。如需更多資訊,請參閱 Apple Security Research 部落格文章 Memory Integrity Enforcement: A complete vision for memory safety in Apple devices。
記憶體標記延伸功能
Arm 於 2019 年發佈「記憶體標記延伸功能」(MTE)規格,作為一種由硬體協助偵測記憶體毀損錯誤的工具。MTE 是一套記憶體標記與標記檢查系統,其中每一筆記憶體配置都會被指派一個密鑰。硬體會確保後續對該記憶體的存取要求,只有在包含正確密鑰的情況下才會被允許。若密鑰不相符,App 會立即當機,且事件會被記錄下來。這讓開發者能在錯誤發生當下即時辨識記憶體毀損問題。
強化記憶體標記延伸功能
EMTE 補足了 MTE 無法作為主動防禦機制的缺口,包括僅支援較安全的同步模式。此外,從已標記的記憶體區域存取未標記的記憶體時,必須事先知道該區域的標記值,這使得攻擊者更難將動態標記記憶體中的越界錯誤,轉化為藉由直接修改未標記配置來繞過 EMTE 的手段。
標記機密性強制機制
標記機密性強制機制可保護安全記憶體配置器的實作,避免各類技術性威脅,並確保 EMTE 標記的機密性,包括防禦側通道攻擊與推測執行攻擊。安全頁表監視器會保護核心配置器的後端儲存空間與標記儲存區。系統同時確保,當核心代表應用程式存取記憶體時,仍需遵循與使用者空間相同的標記檢查規則。標記機密性強制機制亦被設計用來緩解因時間差或推測性攻擊導致的標記洩漏,甚至包含對 Spectre V1 的防護。