信任缓存
静态信任缓存是安全启动链中包括的一个对象,它是所有在签名系统宗卷中管理的 Mach-O 二进制文件的受信任记录。每个 Mach-O 由一个代码目录哈希值表示。为了进行高效搜索,这些哈希值会在插入信任缓存之前进行排序。代码目录是 codesign(1)
执行的签名操作的结果。若要执行信任缓存,SIP 必须保持启用。若要在搭载 Apple 芯片的 Mac 上停用信任缓存执行,安全启动必须配置为“宽松安全性”。
执行二进制文件时(无论是在生成新进程的过程中,还是在将可执行代码映射到现有进程的过程中),会提取其代码目录并计算哈希值。如果生成的哈希值可在信任缓存中找到,则为该二进制文件创建的可执行映射会被授予平台权限;也就是说,这些映射可能拥有任何授权,而且可在无需对签名的真实性进行进一步验证的情况下执行。与之相反,在基于 Intel 的 Mac 上,平台权限由为二进制文件签名的 Apple 证书传递给操作系统内容。(此证书不限制二进制文件可拥有的授权。)
非平台二进制文件(例如已公证的第三方代码)必须拥有有效的证书链才能执行,它们可拥有的授权受 Apple 开发者计划向开发者签发的签名描述文件限制。
macOS 中附带的所有二进制文件都使用平台标识符签名。在搭载 Apple 芯片的 Mac 上,此标识符用于指示即使二进制文件由 Apple 签名,但仅当其代码目录哈希值在信任缓存中存在时才能执行。在基于 Intel 的 Mac 上,平台标识符用于执行将二进制文件从较旧的 macOS 版本中定向撤销的操作;这种定向撤销有助于防止这些二进制文件在较新的版本上执行。
静态信任缓存将一组二进制文件完全锁定到给定的 macOS 版本中。此行为可帮助防止较旧版本操作系统中由 Apple 合法签名的二进制文件被引入较新版本的操作系统,进而被攻击者利用。
操作系统之外提供的平台代码
Apple 会提供一些未使用平台标识符签名的二进制文件,例如 Xcode 和开发工具堆栈。即便如此,搭载 Apple 芯片的 Mac 和搭载 T2 芯片的 Mac 上仍然允许这些二进制文件以平台权限执行。由于此平台软件独立于 macOS 提供,因此不受静态信任缓存实施的撤销行为的制约。
可载入信任缓存
Apple 会通过可载入信任缓存来提供某些软件包。这些缓存与静态信任缓存的数据结构相同。但是,虽然静态信任缓存只有一个,且其内容在内核早期初始化完成后就始终保证锁定到只读范围,系统中还增加了运行时的可载入信任缓存。
这些信任缓存通过与启动固件认证相同的机制进行认证(使用 Apple 信任的签名服务进行定制化),或者作为全局签名对象进行认证(这些信任缓存的签名不将其绑定到特定设备)。
定制化信任缓存的一个示例是随磁盘映像提供的缓存,用来在搭载 Apple 芯片的 Mac 上执行实地诊断。此信任缓存和磁盘映像经过定制,并在目标 Mac 电脑启动进入诊断模式时载入其内核中。该信任缓存允许磁盘映像内的软件以平台权限运行。
全局签名信任缓存的一个示例是 macOS 软件更新附带的信任缓存。此信任缓存允许软件更新内的一个代码块(更新主脑)以平台权限运行。该更新主脑负责任何主机系统无法在不同版本之间一致执行的软件更新规划工作。