
搭载 Apple 芯片的 Mac 的 LocalPolicy 文件内容
LocalPolicy 是一个经过安全隔区签名的 Image4 文件。Image4 是经 ASN.1(抽象语法标记一)DER 编码的数据结构格式,用于描述 Apple 平台上有关安全启动链对象的信息。在基于 Image4 的安全启动模型中,当针对中央 Apple 签名服务器的签名请求发起软件安装时,会要求采用安全性策略。如果策略可接受,签名服务器会返回已签名的 Image4 文件,其中包含各种四字符代码 (4CC) 序列。这些已签名的 Image4 文件和 4CC 在启动时会经过 Boot ROM 或 LLB 等软件的评估。
操作系统之间的所有权交接
对所有者身份密钥 (OIK) 的访问权限称为“所有权”。进行策略或软件更改后,需要所有权才能允许用户丢弃 LocalPolicy。OIK 使用封装密钥保护 (SKP) 中所述的相同密钥层级进行保护,同时也受到与宗卷加密密钥 (VEK) 相同的密钥加密密钥 (KEK) 的保护。这意味着 OIK 通常同时受到用户密码以及操作系统和策略的测量值的保护。Mac 上所有操作系统只有一个 OIK。因此,安装第二个操作系统时,需要第一个操作系统上用户的明确同意才能将所有权交接给第二个操作系统上的用户。但是,从第一个操作系统上运行安装器时,第二个操作系统上尚不存在用户。通常情况下,直到操作系统启动且“设置助理”运行时,才会生成用户。因此,在搭载 Apple 芯片的 Mac 上安装第二个操作系统时,需要执行两项新操作:
为第二个操作系统创建 LocalPolicy
为所有权交接准备“安装用户”
运行“安装助理”并将安装指向次级空白宗卷时,一则提示会询问用户是否要拷贝当前宗卷的用户以作为第二个宗卷的首个用户。如果用户选择是,就会创建“安装用户”,它实际上是一个由所选用户的密码和硬件密钥派生的 KEK,然后该 KEK 会用于在 OIK 被转交给第二个操作系统时对其进行加密。之后,在第二个操作系统的“安装助理”中,系统会提示输入该用户的密码,以允许其访问安全隔区中新操作系统的 OIK。如果用户选择不拷贝用户,“安装用户”仍会以同样的方式创建,但会使用空密码而非用户的密码。这第二个流程存在于某些系统管理场景中。但是,如果用户想进行多宗卷安装并且以最安全的方式执行所有权交接,应当始终选择将用户从第一个操作系统拷贝到第二个操作系统。
搭载 Apple 芯片的 Mac 上的 LocalPolicy
在搭载 Apple 芯片的 Mac 上,本地安全性策略控制已委托给安全隔区中运行的一个应用程序。此软件可利用用户凭证和主 CPU 启动模式来确定谁可以更改安全性策略,以及从什么启动环境中更改。这有助于防范恶意软件通过降级安全性策略控制来获得更多权限,从而攻击用户。
LocalPolicy 清单属性
LocalPolicy 文件包含可在几乎所有 Image4 文件中找到的某些架构 4CC,如电路板或型号 ID (BORD),用于指示特定 Apple 芯片 (CHIP) 或专有芯片 ID (ECID)。但以下 4CC 只专注于用户可配置的安全性策略。
【注】Apple 使用术语第一真正配对 recoveryOS (1TR) 来表示通过按住一次实体电源按钮来启动进入配对 recoveryOS。它与普通 recoveryOS 启动不同,后者可通过 NVRAM 实现、通过按两下并按住电源按钮实现,或者可能发生在启动出错时。按照特定方式按实体按钮会提高信任,使已经攻入 macOS 的仅软件层面攻击者无法进入启动环境。
LocalPolicy 随机数哈希值 (lpnh)
类型:OctetString (48)
可变环境:1TR、recoveryOS、macOS
描述:
lpnh用于 LocalPolicy 反重放。这是 LocalPolicy 随机数 (LPN) 的 SHA384 哈希值,其中 LPN 储存在安全储存组件中,并可通过安全隔区 Boot ROM 或安全隔区访问。原始反重放值仅对 sepOS 可见,对应用程序处理器永不可见。如果攻击者想让 LLB 相信其捕获的某个之前的 LocalPolicy 有效,则需要将与希望重放的 LocalPolicy 中找到的lpnh值相同的一个哈希值放入安全储存组件。系统上通常只有一个 LPN 有效,除了在软件更新期间会有两个 LPN 同时有效,以在更新出错时允许回退并启动旧版本软件。任何操作系统的任何 LocalPolicy 更改时,所有策略会使用与安全储存组件中找到的新 LPN 对应的新 lpnh 值重新签名。用户更改安全性设置,或者创建多个新操作系统且每个操作系统都有一个新的 LocalPolicy 时,此值就会发生更改。
远程策略随机数哈希值 (rpnh)
类型:OctetString (48)
可变环境:1TR、recoveryOS、macOS
描述:
rpnh行为与lpnh相同,但 rpnh 只在远程策略更新时才更新,如更改“查找”注册的状态时。用户在其 Mac 上更改“查找”状态时,会发生此更改。
recoveryOS 随机数哈希值 (ronh)
类型:OctetString (48)
可变环境:1TR、recoveryOS、macOS
描述:
ronh行为与 lpnh 相同,但 ronh 只能在系统 recoveryOS 的 LocalPolicy 中找到。它在系统 recoveryOS 更新时更新,如在软件更新时。系统还会使用一个独立于lpnh和rpnh的反重放值,以便设备被“查找”置于停用状态时,现有操作系统可被停用(通过将其 LPN 和 RPN 从安全储存组件中移除)的同时仍保持系统 recoveryOS 可启动。通过这种方式,在系统所有者通过输入其用于“查找”账户的 iCloud 密码来证明对系统享有控制权时,这些操作系统可被重新启用。用户更新系统 recoveryOS 或者创建新操作系统时,此值就会发生更改。
下一阶段 Image4 清单哈希值 (nsih)
类型:OctetString (48)
可变环境:1TR、recoveryOS、macOS
描述:nsih 字段代表 Image4 清单数据结构(描述已启动的 macOS)的 SHA384 哈希值。macOS Image4 清单包含对 iBoot、静态信任缓存、设备树、启动内核集和签名系统宗卷 (SSV) 的宗卷根哈希值等所有启动对象的测量值。LLB 被要求启动给定的 macOS 时,其设计旨在确保附于 iBoot 的 macOS Image4 清单哈希值与 LocalPolicy 的
nsih字段中捕获的值匹配。通过这种方式,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。用户安装快速安全响应或软件更新时,就间接增加了stng值。
辅助内核集 (AuxKC) 策略哈希值 (auxp)
类型:OctetString (48)
可变环境:macOS
描述:
auxp是用户授权 Kext 列表 (UAKL) 策略的 SHA384 哈希值。在 AuxKC 生成期间,它用于帮助确保 AuxKC 中只包括用户授权的 Kext。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 并验证其签名。iBoot 还会验证附于 AuxKC 的 Image4 清单哈希值与auxi字段中找到的值匹配。如果 AuxKC 出于任何原因未能载入,系统会在没有此启动对象的情况下继续启动,因此也不载入任何第三方 Kext。auxp字段是设定 LocalPolicy 中 auxi 字段的先决条件。用户在“系统设置”的“隐私与安全性”(macOS 13 或更高版本)或“系统偏好设置”的“安全性与隐私”面板(macOS 12 或更低版本)中批准 Kext 以更改 UAKL 时,就间接更改了auxi值。
辅助内核集 (AuxKC) 接收项哈希值 (auxr)
类型:OctetString (48)
可变环境:macOS
描述:
auxr是 AuxKC 接收项的 SHA384 哈希值,AuxKC 接收项表示包括在 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 是由 Apple 在线签名服务器签名,该服务器为 macOS Image4 文件等内容签名。
本地操作系统版本 (love)
类型:布尔值
可变环境:1TR、recoveryOS、macOS
描述:
love表示为其创建 LocalPolicy 的操作系统版本。该版本在 LocalPolicy 创建期间从下一个状态清单中获取,用于强制执行 recoveryOS 配对访问限制。
安全 Multi-Boot (smb0)
类型:布尔值
可变环境:1TR、recoveryOS
描述:如果
smb0存在且为真,LLB 将允许对下一阶段 Image4 清单进行全局签名,而不是要求定制化签名。用户可通过“启动安全性实用工具”或bputil更改此字段,以降级到“降低安全性”。
安全 Multi-Boot (smb1)
类型:布尔值
可变环境:1TR
描述:如果
smb1存在且为真,iBoot 将允许安全隔区使用与 LocalPolicy 相同的密钥给自定义内核集等对象签名。smb0的存在是smb1存在的先决条件。用户可使用csrutil或bputil等命令行工具更改此字段,以降级到“宽松安全性”。
安全 Multi-Boot (smb2)
类型:布尔值
可变环境:1TR
描述:如果
smb2存在且为真,iBoot 将允许安全隔区使用与 LocalPolicy 相同的密钥给辅助内核集签名。smb0的存在是smb2存在的先决条件。用户可使用“启动安全性实用工具”或bputil更改此字段,以降级到“降低安全性”并启用第三方 Kext。
安全 Multi-Boot (smb3)
类型:布尔值
可变环境:1TR
描述:如果
smb3存在且为真,表示设备用户已选择为其系统启用移动设备管理 (MDM) 控制。此字段的存在使 LocalPolicy 控制安全隔区处理器应用程序接受 MDM 认证,而不是要求本地用户认证。用户可使用“启动安全性实用工具”或bputil更改此字段,以启用针对第三方 Kext 和软件更新的受管理控制。(在 macOS 11.2 或更高版本中,如果当前安全性模式设为“完整安全性”,MDM 还可以启动更新到最新版本的 macOS。)
安全 Multi-Boot (smb4)
类型:布尔值
可变环境:macOS
描述:如果
smb4存在且为真,表示设备已选择通过“Apple 校园教务管理”或“Apple 商务管理”为操作系统启用 MDM 控制。此字段的存在使 LocalPolicy 控制安全隔区应用程序接受 MDM 认证,而不是要求本地用户认证。此字段由 MDM 解决方案在检测到设备序列号出现在这三项服务中的任一项中时更改。
系统完整性保护 (sip0)
类型:64 位未签名整数
可变环境:1TR
描述:
sip0保存现有系统完整性保护 (SIP) 策略位,这些位之前储存在 NVRAM 中。新 SIP 策略位在此处添加(而不是使用如下 LocalPolicy 字段),前提是这些位只在 macOS 中使用,且不被 LLB 使用。用户可从 1TR 使用csrutil更改此字段以停用 SIP,并降级到“宽松安全性”。
系统完整性保护 (sip1)
类型:布尔值
可变环境:1TR
描述:如果
sip1存在且为真,iBoot 会允许 SSV 宗卷根哈希值验证失败。用户可从 1TR 使用csrutil或bputil更改此字段。
系统完整性保护 (sip2)
类型:布尔值
可变环境:1TR
描述:如果 sip2 存在且为真,iBoot 将不会锁定将内核内存标记为不可写入的可配置文本只读区域 (CTRR) 硬件寄存器。用户可从 1TR 使用
csrutil或bputil更改此字段。
系统完整性保护 (sip3)
类型:布尔值
可变环境:1TR
描述:如果
sip3存在且为真,iBoot 将不会为 boot-args NVRAM 变量实施其内建允许列表,否则该列表将过滤传递到内核的选项。用户可从 1TR 使用csrutil或bputil更改此字段。
证书和 RemotePolicy
如 LocalPolicy 签名密钥创建和管理中所述,LocalPolicy Image4 中还包含所有者身份证书 (OIC) 和嵌入的 RemotePolicy。