配備 Apple 晶片的 Mac 上的 LocalPolicy 檔案內容
LocalPolicy是一個由「安全隔離區」簽署的 Image4 檔案。Image4 為 ASN.1(抽象語法記法 1)DER 編碼資料結構格式,用於描述 Apple 平台上安全開機鏈物件的相關資訊。在 Image4 安全開機模式中,安裝軟體時要求藉由向 Apple 簽署伺服器傳送簽署要求來啟用安全性規則。如果規則可接受,簽署伺服器會傳回已簽署的 Image4 檔案,其中包含各種 4 字元代碼(4CC)序號。開機時「開機 ROM」或 LLB 這類軟體會評估這些已簽署的 Image4 檔案和 4CC。
作業系統間的所有權接力
對「所有者身分密鑰」(OIK)的取用權限稱為「所有權」。需有所有權才能允許使用者在更改規則或軟體後退出 LocalPolicy。OIK 受到與「密封密鑰保護」(SKP)中所述相同的密鑰階層保護,同時 OIK 受到與「卷宗加密密鑰」(VEK)相同的「密鑰加密密鑰」(KEK)保護。這意味著它通常受使用者密碼以及作業系統和規則測量值的保護。Mac 上的所有作業系統只有一個 OIK。因此,在安裝第二個作業系統時,需要第一個作業系統上的使用者明確同意,才能將所有權移交給第二個作業系統上的使用者。但是,當安裝程式從第一個作業系統執行時,第二個作業系統的使用者尚不存在。在啟動作業系統並執行「設定輔助程式」前,通常不會產生作業系統中的使用者。因此,在配備 Apple 晶片的 Mac 上安裝第二個作業系統時,需要執行兩個新動作:
為第二個作業系統建立 LocalPolicy
準備「安裝使用者」以移交所有權
當執行「安裝輔助程式」並針對第二個空白卷宗鎖定安裝時,提示會詢問使用者是否要將目前卷宗中的使用者複製為第二個卷宗的第一個使用者。如果使用者說「好」,則建立的「安裝使用者」實際上是從所選使用者的密碼和硬體密鑰衍生的 KEK,其接著會在傳遞給第二個作業系統時,用來對 OIK 進行加密。然後,從第二個作業系統「安裝輔助程式」中,提示輸入該使用者的密碼,以允許其取用「安全隔離區」中針對新作業系統的 OIK。如果使用者選擇不拷貝使用者,則仍以相同的方式建立「安裝使用者」,但是會使用空密碼,而非使用者密碼。對於某些系統管理方案,則會有第二個流程。但是,想要進行多卷宗安裝並以最安全的方式執行所有權切換的使用者,應一律選擇將使用者從第一個作業系統拷貝到第二個作業系統。
配備 Apple 晶片之 Mac 上的 LocalPolicy
在配備 Apple 晶片的 Mac 上,本機安全性規則控制權已委派給在「安全隔離區」中執行的一個應用程式。這個軟體可利用使用者的憑證和主要 CPU 的開機模式,判斷誰可以更改安全性規則,以及從哪個開機環境更改。這有助於防止惡意軟體將規則降級以取得更多權限,進而利用安全性規則控制來影響使用者。
LocalPolicy 資訊檔屬性
LocalPolicy 檔案包含一些架構 4CC,這幾乎在所有 Image4 檔案中都會出現,例如主機板或機型 ID(BORD)、用來表示特定 Apple 晶片的資訊(CHIP)或唯一晶片識別碼(ECID)。但是 4CC 只著重於使用者可設定的安全性規則。
【注意】Apple 使用已配對 One True RecoveryOS(1TR)一詞來表示開機進入配對 RecoveryOS(使用按壓實體電源按鈕(按一下並按住))。這與一般的 RecoveryOS 開機不一樣,一般的 RecoveryOS 開機可使用 NVRAM 或按兩下並按住實體電源按鈕進行,或可能在開機出現錯誤時發生。按下特定種類的實體按鈕會增強信任,讓侵入 macOS 的純軟體攻擊者無法達到開機環境。
LocalPolicy 隨機數雜湊(lpnh)
類型:OctetString (48)
可變環境:1TR、RecoveryOS、macOS
說明:
lpnh
用於 LocalPolicy 的反重播機制。這是 LocalPolicy 隨機數(LPN)的 SHA384 雜湊,儲存在「安全儲存元件」中,且可使用「安全隔離區開機 ROM」或「安全隔離區」存取。原始反重放值永遠不會讓「應用程式處理器」得知,僅會讓 sepOS 得知。攻擊者若想說服 LLB 他們先前擷取的 LocalPolicy 為有效,需將一個值放入「安全儲存元件」,而這個值必須雜湊為與他們想重播的 LocalPolicy 中的lpnh
值相同。通常系統上會有一個有效的 LPN,但軟體更新期間除外,同時會有兩個有效,以便在發生更新錯誤時回復以啟動舊版軟體。當任何作業系統的任何 LocalPolicy 更改時,所有規則都會以對應「安全儲存元件」中新 LPN 的新 lpnh 值重新簽署。當使用者更改安全設定或分別使用不同的新 LocalPolicy 來建立新的作業系統時,就會發生此更動。
「遠端規則」隨機數雜湊(rpnh)
類型:OctetString (48)
可變環境:1TR、RecoveryOS、macOS
說明:
rpnh
的行為與lpnh
相同,但是只會在遠端規則更新時隨之更新,例如更改「尋找」註冊狀態時。使用者在其 Mac 上更改「尋找」狀態時,便會發生此更動。
RecoveryOS 隨機數雜湊(ronh)
類型:OctetString (48)
可變環境:1TR、RecoveryOS、macOS
說明:此
ronh
的行為與 lpnh 相同,但是只存在於 RecoveryOS 的 LocalPolicy 中。當系統 RecoveryOS 更新時會隨之更新,例如軟體更新時。使用獨立於lpnh
和rpnh
的反重放值,因此當「尋找」將裝置設為停用狀態時,可停用現有的作業系統(藉由移除其「安全儲存元件」中的 LPN 和 RPN),同時仍讓系統 RecoveryOS 保持可啟動狀態。以此方式,當系統擁有者證明其擁有系統的控制權(透過輸入其用於「尋找」帳號的 iCloud 密碼)時,可重新啟用作業系統。當使用者更新系統 RecoveryOS 或建立新的作業系統時,便會發生此更動。
下一階段 Image4 資訊檔雜湊(nsih)
類型:OctetString (48)
可變環境:1TR、RecoveryOS、macOS
說明:此 nsih 欄位代表 Image4 資訊檔資料結構的 SHA384 雜湊,描述已啟動的 macOS。macOS Image4 資訊檔包含所有開機物件(例如 iBoot、靜態信任快取、裝置樹狀結構、開機核心集合和簽署系統卷宗(SSV)根雜湊)的測量。當系統指示 LLB 啟動指定的 macOS 時,其設計會確保 macOS Image4 資訊檔的雜湊附加至在 LocalPolicy 的
nsih
欄位中擷取到的 iBoot 相符項目。如此一來,nsih
便能知道使用者是為了哪個作業系統製作 LocalPolicy。因此使用者可在執行軟體更新時,間接更改nsih
值。
Cryptex1 Image4 資訊檔雜湊(spih)
類型:OctetString (48)
可變環境:1TR、RecoveryOS、macOS
說明:
spih
欄位代表 Cryptex1 Image4 資訊檔資料結構的 SHA384 雜湊。Cryptex1 Image4 資訊檔包含其 Cryptex 的測量值、檔案系統密封以及相關的信任快取。macOS 啟動時,XNU 核心和「頁面保護層」會確保 Cryptex1 Image4 資訊檔的雜湊與 iBoot 從 LocalPolicy 的spih
欄位發佈的相符。使用者可在安裝「快速安全回應」或執行軟體更新時,間接更改spih
值。Cryptex1 Image4 資訊檔雜湊可獨立於下一階段 Image4 資訊檔雜湊進行更新。
Cryptex1 世代(stng)
類型:64 位元未簽署整數
可變環境:1TR、RecoveryOS、macOS
說明:
stng
欄位是計數值,代表上次在 LocalPolicy 中更新 Cryptex1 Image4 資訊檔雜湊的時間。在「頁面保護層」評估本機政策以套用傳入的 Cryptex 期間,會提供反重放值以取代lpnh
。使用者可在安裝「快速安全回應」(RSR)或軟體更新時,間接提高stng
值。
輔助核心集合(AuxKC)規則雜湊(auxp)
類型:OctetString (48)
可變環境:macOS
說明:
auxp
是一種 SHA384 雜湊,是來自「使用者授權 kext 列表」(UAKL)的規則。這用於產生 AuxKC 時,以協助確保只有使用者授權的 kext 包含在 AuxKC 中。smb2
是設定此欄位的先決條件。使用者從「系統設定」中的「隱私權與安全性」(macOS 13 或以上版本)或「系統偏好設定」中的「安全性與隱私權」面板(macOS 12 或較早版本)核准 kext 來更改 UAKL 時,會間接更改auxp
值。
輔助核心集合(AuxKC)Image4 資訊檔雜湊(auxi)
類型:OctetString (48)
可變環境:macOS
說明:在系統檢查 UAKL 雜湊與 LocalPolicy 中的
auxp
欄位並確認兩者相符後,會要求由負責 LocalPolicy 簽署作業的「安全隔離區」處理器應用程式簽署 AuxKC。接著,AuxKC Image4 資訊檔簽章的 SHA384 雜湊會放入 LocalPolicy 中,以避免在開機時將先前簽署的 AuxKC 與作業系統混合搭配。如果 iBoot 在 LocalPolicy 中發現auxi
欄位,它會嘗試從儲存空間載入 AuxKC 並驗證簽章。它也會驗證附加至 AuxKC 的 Image4 資訊檔雜湊與auxi
欄位是否相符。如果 AuxKC 因任何理由無法載入,系統會在沒有這個開機物件的情況下繼續開機,因此不會載入任何第三方 kext。auxp
欄位是設定 LocalPolicy 中 auxi 欄位的先決條件。使用者從「系統設定」中的「隱私權與安全性」(macOS 13 或以上版本)或「系統偏好設定」中的「安全性與隱私權」面板(macOS 12 或較早版本)核准 kext 來更改 UAKL 時,會間接更改auxi
值。
輔助核心集合(AuxKC)收據雜湊(auxr)
類型:OctetString (48)
可變環境:macOS
說明:
auxr
是 AuxKC 收據的 SHA384 雜湊,表示 AuxKC 中所包含的確切一組 kext。AuxKC 收據可以是 UAKL 的子集,因為如果已知攻擊者使用過的 kext,可將其排除在 AuxKC 之外,就算使用者已授權也一樣。此外,某些可用來破壞使用者核心邊界的 kext 可能導致功能降低,例如無法使用 Apple Pay 或播放 4K 和 HDR 內容。使用者若想要這些功能,可選擇加入限制性更高的 AuxKC 包含項目。auxp
欄位是設定 LocalPolicy 中auxr
欄位的先決條件。使用者從「系統設定」中的「隱私權與安全性」(macOS 13 或以上版本)或「系統偏好設定」中的「安全性與隱私權」面板(macOS 12 或較早版本)建立新的 AuxKC 時,會間接更改auxr
值。
CustomOS Image4 資訊檔雜湊(coih)
類型:OctetString (48)
可變環境:1TR
說明:
coih
是 CustomOS Image4 資訊檔的 SHA384 雜湊。該資訊檔的承載資料是由 iBoot(而非 XNU 核心)用來移轉控制權。當使用者在 1TR 中使用kmutil configure-boot
命令列工具時,會間接地更改coih
值。
APFS 卷宗群組 UUID(vuid)
類型:OctetString (16)
可變環境:1TR、RecoveryOS、macOS
說明:
vuid
表示一個卷宗群組,該群組應由核心當作根群組來使用。此欄位主要作用是提供資訊,並不會用於安全性限制。此vuid
是在使用者製作新的作業系統安裝時間接設定。
密鑰加密密鑰(KEK)群組 UUID(kuid)
類型:OctetString (16)
可變環境:1TR、RecoveryOS、macOS
說明:
kuid
表示開機的卷宗。密鑰加密密鑰通常用於「資料保護」。對於每個 LocalPolicy,其是用來保護 LocalPolicy 簽署密鑰。在使用者安裝一份新的作業系統時,kuid
會被間接設定。
配對 RecoveryOS 受信任開機規則測量(prot)
類型:OctetString (48)
可變環境:1TR、RecoveryOS、macOS
說明:配對 RecoveryOS 受信任開機規則測量(TBPM)是對 LocalPolicy 的 Image4 資訊檔進行的特殊反覆 SHA384 雜湊計算,排除反重放值,藉此得出不隨時間變動的一致測量(因為
lpnh
這類反重放值會經常更新)。prot
欄位只存在於每個 macOS LocalPolicy 中,提供配對以指出對應到 macOS LocalPolicy 的 RecoveryOS LocalPolicy。
有安全隔離區簽署 RecoveryOS LocalPolicy(hrlp)
類型:布林值
可變環境:1TR、RecoveryOS、macOS
說明:
hrlp
指出prot
值(上述)是否為「安全隔離區」所簽署 RecoveryOS LocalPolicy 的測量值。若否,那麼 RecoveryOS LocalPolicy 是由負責簽署 macOS Image4 檔案這類項目的 Apple 線上簽署伺服器所簽署。
本機作業系統版本(love)
類型:布林值
可變環境:1TR、RecoveryOS、macOS
說明:
love
表示為其建立 LocalPolicy 的 OS 版本。此版本是在 LocalPolicy 建立期間從下一個階段資訊檔取得的,用於強制執行 RecoveryOS 配對限制。
安全多重開機(smb0)
類型:布林值
可變環境:1TR、RecoveryOS
說明:若
smb0
存在且為 true,LLB 會允許全域簽署下一階段 Image4 資訊檔,而非要求個人化簽章。使用者可透過「開機安全性工具程式」或bputil
來更改此欄位以降級為「較低安全性」。
安全多重開機(smb1)
類型:布林值
可變環境:1TR
說明:如果
smb1
存在且為 true,iBoot 會允許使用與 LocalPolicy 相同的密鑰以「安全隔離區」簽署物件(例如自訂核心集合)。smb0
存在是smb1
存在的先決條件。使用者可以使用指令行工具(例如csrutil
或bputil
)來更改此欄位以降級為「較低安全性」。
安全多重開機(smb2)
類型:布林值
可變環境:1TR
說明:如果
smb2
存在且為 true,iBoot 會允許使用與 LocalPolicy 相同的密鑰以「安全隔離區」簽署輔助核心集合(AuxKC)。smb0
存在是smb2
存在的先決條件。使用者可使用「開機安全性工具程式」或bputil
來更改此欄位以降級為「較低安全性」和啟用第三方 kext。
安全多重開機(smb3)
類型:布林值
可變環境:1TR
說明:如果
smb3
存在且為 true,表示操作裝置的使用者已選擇加入其系統的行動裝置管理(MDM)控制。此欄位的存在讓控制「安全隔離區」處理器應用程式的 LocalPolicy 接受 MDM 認證,而非要求本機使用者認證。使用者可使用「開機安全性工具程式」或bputil
來更改此欄位以啟用第三方 kext 和軟體更新的管理式控制。(在 macOS 11.2 或以上版本中,如果目前安全性模式為「完整完全性」,則 MDM 也可以啟動對最新 macOS 版本的更新作業。)
安全多重開機(smb4)
類型:布林值
可變環境:macOS
說明:如果
smb4
存在且為 true,表示裝置已使用「Apple 校務管理」、「Apple 商務管理」或「Apple 商務必備」選擇加入作業系統的 MDM 控制。此欄位的存在讓控制「安全隔離區」應用程式的 LocalPolicy 接受 MDM 認證,而非要求本機使用者認證。MDM 解決方案偵測到裝置的序號出現在這些服務的任何一項時,此欄位會更改。
系統完整保護(sip0)
類型:64 位元未簽署整數
可變環境:1TR
說明:
sip0
值包含現有「系統完整保護」(SIP)規則位元(先前儲存在 NVRAM 中)。新的 SIP 規則位元如果只用於 macOS 而沒有用於 LLB,便會在這裡加入(而非使用如下所示的幾個 LocalPolicy 欄位)。使用者可以從 1TR 使用csrutil
來更改此欄位以停用 SIP 和降級為「寬鬆安全性」。
系統完整保護(sip1)
類型:布林值
可變環境:1TR
說明:如果
sip1
存在且為 true,iBoot 會允許失敗以驗證 SSV 卷宗根雜湊。使用者可以從 1TR 使用csrutil
或bputil
來更改此欄位。
系統完整保護(sip2)
類型:布林值
可變環境:1TR
說明:如果 sip2 存在且為 true,則 iBoot 不鎖定會將核心記憶體標示為非可寫的可設定文字唯讀區域(CTRR)硬體暫存器。使用者可以從 1TR 使用
csrutil
或bputil
來更改此欄位。
系統完整保護(sip3)
類型:布林值
可變環境:1TR
說明:如果
sip3
存在且為 true,iBoot 將不會強制執行其 boot-args NVRAM 變數的內建允許列表(強制執行時會過濾傳送至核心的選項)。使用者可以從 1TR 使用csrutil
或bputil
來更改此欄位。
憑證和 RemotePolicy
如 LocalPolicy 簽署密鑰的建立與管理中所述,LocalPolicy Image4 也包含「所有人身分憑證」(OIC)和內嵌 RemotePolicy。