
配備 Apple 晶片的 Mac 之 LocalPolicy 檔案內容
LocalPolicy是一個由「安全隔離區」簽署的 Image4 檔案。Image4 為 ASN.1(抽象語法記法 1)DER 編碼資料結構格式,用於描述 Apple 平台上安全啟動鏈物件的相關資料。在 Image4 安全啟動模式中,安裝軟件時會要求藉由向 Apple 簽署伺服器傳送簽署要求來啟用保安規則。如果規則可接受,簽署伺服器會傳回已簽署的 Image4 檔案,其中包含各種 4 字元代碼(4CC)序號。開機時 Boot 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 雜湊值,儲存在「安全儲存元件」中,且可使用「安全隔離區 Boot ROM」或「安全隔離區」存取。原始反重播值永不會向「應用程式處理器」顯示,僅會對 sepOS 顯示。攻擊者如想説服 LLB 他們先前截取的 LocalPolicy 為有效,需將一個值放入「安全儲存元件」,而這個值必須雜湊值為與他們想重播的 LocalPolicy 中的lpnh
值相同。通常系統上會有一個有效的 LPN(軟件更新期間除外,同時會有兩個有效的 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
是用户授權 kext 列表(UAKL)規則的 SHA384 雜湊值。這用於產生 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 的作業系統版本。此版本是在 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 School Manager 或 Apple Business Manager 選擇加入作業系統的 MDM 控制。此欄位的存在讓控制「安全隔離區」應用程式的 LocalPolicy 接受 MDM 認證,而非要求本機用户認證。MDM 解決方案偵測到裝置的序號出現在這些服務的任何一項時,此欄位會更改。
系統完整保護(sip0)
類型:64 位元未簽署整數
可變環境:1TR
説明:
sip0
值包含現有「系統完整保護」(SIP)規則位元(先前儲存在 NVRAM 中)。新的 SIP 規則位元如果只用於 macOS 而沒有用於 LLB,便會在此處加入(而非使用如下所示的幾個 LocalPolicy 欄位)。用户可以從 1TR 使用csrutil
來更改此欄位以停用 SIP 和降級為「寬鬆保安」。
系統完整保護 (sip1)
類型:布林值
可變環境:1TR
説明:如果
sip1
存在且為 true,LLB 將允許失敗以驗證 SSV 卷宗根雜湊。用户可以從 1TR 使用csrutil
或bputil
來更改此欄位。
系統完整保護(sip2)
類型:布林值
可變環境:1TR
説明:如果 sip2 存在且為 true,則 iBoot 不鎖定會將核心記憶體標示為非可寫的可設定文字唯讀區域(CTRR)硬件暫存器。用户可以從 1TR 使用
csrutil
或bputil
來更改此欄位。
系統完整保護(sip3)
類型:布林值
可變環境:1TR
説明:如果
sip3
存在且為 true,LLB 將不會強制執行其 boot-args NVRAM 變數的內置允許列表(強制執行時會過濾傳送至核心的選項)。用户可以從 1TR 使用csrutil
或bputil
來更改此欄位。
憑證和 RemotePolicy
如 LocalPolicy 簽署密鑰的建立與管理中所述,LocalPolicy Image4 也包含「擁有人身份憑證」(OIC)和內嵌 RemotePolicy。