在 macOS 中安全扩展内核
自 macOS 11 起,如果第三方内核扩展 (Kext) 启用,就不能按需将其载入内核中。Kext 会转而合并到启动过程中载入的辅助内核集 (AuxKC) 中。在搭载 Apple 芯片的 Mac 上,AuxKC 的测量值会签名到 LocalPolicy 中(在之前的硬件中,AuxKC 位于数据宗卷上)。重建 AuxKC 需要用户批准、重新启动 macOS 以将更改载入内核,以及将安全启动配置为“降低安全性”。
【重要事项】macOS 中不再推荐使用 Kext。Kext 会威胁到操作系统的完整性和可靠性,Apple 建议用户选择不需要扩展内核的解决方案。
搭载 Apple 芯片的 Mac 中的内核扩展
在搭载 Apple 芯片的 Mac 上,必须通过在启动时按住电源按钮进入“第一真正 recoveryOS” (1TR) 模式,然后降级到“降低安全性”并勾选启用内核扩展的复选框,才能明确启用 Kext。此操作还需要输入管理员密码以授权降级。1TR 和密码要求的结合使从 macOS 内部开始的仅软件层面攻击者难以将 Kext 插入 macOS,然后也就无法利用这些 KEXT 来获取内核特权。
用户授权 Kext 载入后,以上“用户批准的内核扩展载入”流程将用于授权 Kext 安装。用于以上流程的授权还用于捕捉 LocalPolicy 中用户授权 Kext 列表 (UAKL) 的 SHA384 哈希值。然后,内核管理监控程序 (kmd
) 负责验证 Kext(仅限 UAKL 中找到的 Kext),以将其包括在 AuxKC 中。
如果系统完整性保护 (SIP) 已启用,在将每个 Kext 包括在 AuxKC 中前还会验证其签名。
如果 SIP 停用,Kext 签名不会实施。
此方法可让不是 Apple 开发者计划成员的开发者或用户在“宽松安全性”流程中测试 Kext,然后再为其签名。
AuxKC 创建后,其测量值会发送到安全隔区进行签名,并添加到启动时可由 iBoot 进行评估的 Image4 数据结构中。生成 Kext 接收项也是 AuxKC 构建的一部分。此接收项内含实际包括在 AuxKC 中的 Kext 列表,因为如果遇到了被禁止的 Kext,这一组 Kext 可能是 UAKL 的子集。LocalPolicy 中包括 AuxKC Image4 数据结构的 SHA384 哈希值和 Kext 接收项。iBoot 使用 AuxKC Image4 哈希值在启动时进行额外验证,以帮助确保不可能通过较新的 LocalPolicy 来启动由安全隔区签名的 AuxKC Image4 文件较旧版本。Apple Pay 等子系统使用 Kext 接收项确定当前是否载入了可能干扰 macOS 可信度的任何 Kext。如果存在此类 Kext,Apple Pay 功能可能会停用。
系统扩展
macOS 10.15 允许开发者通过安装和管理在用户空间而非内核层面运行的系统扩展来扩展 macOS 的功能。让系统扩展运行在用户空间提高了 macOS 的稳定性和安全性。尽管 Kext 本身拥有对整个操作系统的完全访问权限,但运行在用户空间的扩展只拥有执行其特定功能所需的权限。
开发者可以使用各种框架(包括 DriverKit、EndpointSecurity 和 NetworkExtension)来写入 USB 和人机界面驱动程序、端点安全工具(如数据丢失预防或其他端点代理)以及 VPN 和网络工具,这一切都不需要编写 Kext。只有当第三方安全代理使用了这些 API 或者拥有过渡到这些 API 并不再使用内核扩展的清晰路线图,才应当使用这些第三方安全代理。
用户批准的内核扩展载入
为了提高安全性,需要得到用户同意才能载入随 macOS 10.13 安装或在其后安装的内核扩展。此过程称为用户批准的内核扩展载入。批准内核扩展需要管理员授权。满足以下条件的内核扩展不需要授权:
在 Mac 运行 macOS 10.12 或更低版本时安装
替换之前批准的扩展
允许无需用户同意便可载入(通过使用 Mac 从 recoveryOS 启动时提供的
spctl
命令行工具实现)被允许使用移动设备管理 (MDM) 配置载入
从 macOS 10.13.2 开始,用户可以使用 MDM 来指定无需用户同意便可载入的内核扩展列表。此选项要求 Mac 运行 macOS 10.13.2,且通过“Apple 校园教务管理”或“Apple 商务管理”在 MDM 中注册,或者由用户自行在 MDM 中注册。