
操作系统完整性
Apple 的操作系统软件在设计时以安全性为核心。此设计包括可实现安全启动的硬件信任根,以及快速且安全的安全软件更新过程。Apple 操作系统还使用为特定目的构建的基于芯片的硬件功能,在操作系统运行时协助阻止恶意利用。这些运行时功能可以保护受信任代码在执行时的完整性。Apple 操作系统软件可协助减少攻击和对技术的恶意利用,无论攻击和恶意利用是来自恶意 App、网页还是通过任何其他渠道。以下保护措施在运行 Apple 设计的受支持 SoC 的设备上可用,此类 SoC 包括 iOS、iPadOS、搭载 Apple 芯片的 Mac 上运行的 macOS、Apple tvOS、visionOS 和 watchOS。
功能 | A10 | A11、S3 | A12-A14 S4-S10 | A15-A18 | M1 | M2-M4 | A19 M5 |
|
|
|
|
|
|
| |
|
|
|
|
|
|
| |
|
|
|
|
|
|
| |
|
|
|
|
|
|
| |
|
|
|
1 |
2 |
|
| |
|
|
|
|
|
2 |
2 | |
|
|
|
|
|
|
|
1:安全页表监控器 (SPTM) 在 A15 或后续芯片和 M2 或后续芯片的 SOC 中受支持,并在支持的平台上替代了页面保护层。
2:页面保护层 (PPL) 和安全页表监控器 (SPTM) 会在 macOS 除外(因为 macOS 设计允许运行任何代码)的所有平台上强制执行受信任的签名代码。包括页表保护在内的所有其他安全属性均可用于所有受支持的平台。
内核完整性保护
操作系统内核初始化完成后,会启用内核完整性保护 (KIP) 来帮助防止对内核和驱动器代码进行修改。内存控制器提供了受保护的物理内存区域,供 iBoot 用于载入内核和内核扩展。启动完成后,内存控制器会拒绝对受保护的物理内存区域的写入。应用程序处理器的内存管理单元 (MMU) 被配置为帮助防止从受保护内存区域之外的物理内存中映射权限代码,并帮助防止对内核内存区域内的物理内存进行可写入映射。
为防止重新配置,用于启用 KIP 的硬件会在启动过程完成后锁定。
快速权限访问限制
自 Apple A11 仿生和 S3 后的 SoC 新增了硬件原语。此“快速权限访问限制”原语中包括可基于每个线程快速限制访问权限的 CPU 寄存器。通过快速权限访问限制(也称为 APRR 寄存器),支持的操作系统可从内存移除执行权限,无需通过系统调用和页表寻访或刷新。这些寄存器更进一步减少了来自网页的攻击,尤其是经过运行时编译(即时编译)的代码,因为内存无法在读写的同时有效执行。
系统协处理器完整性保护
协处理器固件会处理许多关键系统任务,例如安全隔区、图像感应处理器和运动协处理器,因此其安全性是整个系统安全性中的关键部分。Apple 使用一种叫做系统协处理器完整性保护 (SCIP) 的机制来阻止协处理器固件修改。
SCIP 的工作方式与 KIP 非常类似:启动时,iBoot 将每个协处理器的固件载入到独立于 KIP 区域并且受保护的保留内存区域。iBoot 会配置每个协处理器的内存单元,以帮助防止:
协处理器的受保护内存区域部分外的可执行映射
协处理器的受保护内存区域部分内的可写入映射
同时,在启动期间,安全隔区操作系统会用于为安全隔区配置 SCIP。启动过程完成后,用于启用 SCIP 的硬件会锁定。此设计旨在防止重新配置。
指针认证代码
指针认证代码 (PAC) 用来防止对内存损坏错误的利用。系统软件和内建 App 使用 PAC 来帮助防止修改函数指针和返回地址(代码指针)。PAC 使用五种 128 位密钥值来签名内核指令和数据,并且每个用户空间进程都有其自己的 B 类密钥。项目按照如下所示加盐和签名。
项目 | 键 | 加盐 |
|---|---|---|
函数返回地址 | IB | 存储地址 |
函数指针 | IA | 0 |
块调用函数 | IA | 存储地址 |
块描述符指针 | DA | 存储地址 + 0xC0BB |
Objective-C 方法缓存 | IB | 存储地址 + 类 + 选择器 |
Objective-C Isa 指针 | DA | 存储地址 + 0x6AE1 |
Objective-C Super 指针 | DA | 存储地址 + 0xB5AB |
选择器类型的 Objective-C 实例变量 | DB | 存储地址 + 0x57C2 |
Objective-C 只读类数据指针 | DA | 存储地址 + 0x61F8 |
C++ 虚函数表条目 | IA | 存储地址 + 哈希值(损坏的方法名称) |
C++ 虚函数表指针 | DA | 存储地址 + 哈希值(损坏的基类虚函数表名称) |
计算的 Goto 标签 | IA | 哈希值(函数名称) |
内核线程状态 | GA | • |
用户线程状态寄存器 | IA | 存储地址 |
签名值储存在 64 位指针顶部未使用的填充位中。在使用签名前会进行验证,且填充会恢复以帮助确保指针地址正常工作。验证失败会导致中止使用签名。这种验证提高了许多攻击的难度,如试图通过操纵储存在堆栈中的函数返回地址来欺骗设备恶意执行现有代码的面向返回编程 (ROP) 攻击。
页面保护层
iOS、iPadOS、visionOS 和 watchOS 中的页面保护层 (PPL) 旨在防止代码签名验证完成后对用户空间代码进行修改。PPL 以 KIP 和快速权限访问限制为基础,通过管理页表权限覆盖确保只有 PPL 才能修改包含用户代码和页表的受保护页面。系统支持实施系统层面代码完整性检查(即使在内核遭到入侵的情况下),从而大大减小了攻击面。此保护在 macOS 上不提供,因为 PPL 只在所有执行代码都必须签名的系统上适用。
安全页表监控器和可信执行监控器
iOS、iPadOS、macOS 和 visionOS 中的安全页表监控器 (SPTM) 和可信执行监控器 (TXM) 设计为协同工作以协助保护用户和内核进程的页表免遭修改,其中包括攻击者可写入内核和可绕过控制流程保护的情况。SPTM 通过使用比内核更高的权限级别,并利用权限相对较低的 TXM 来实际实施用于管理代码执行的政策,从而实现这一目标。该系统的设计由于这种权限分离和两者之间的信任管理,TXM 遭到入侵不会自动转化为绕过 SPTM。在 A15 或后续芯片和 M2 或后续芯片的 SoC 中,SPTM(与 TXM 结合使用)取代了 PPL,它提供了更小的攻击面,且不依赖内核信任,即使在启动初期也是如此。SPTM 依赖于新的芯片原语,它基于 PPL 所用的快速权限访问限制进行了改进,并仅在上表所列的处理器上可用。
内存完整性强制
内存完整性强制 (MIE) 是用于 Apple 平台的全面内存安全防护技术,在 A19 和 M5 及后续处理器上提供。MIE 基于 Apple 安全内存分配器提供的坚实基础构建,与同步模式下的增强型内存标记扩展 (EMTE) 相结合,且受综合标记保密性强制策略支持。MIE 内建于 Apple 芯片,为内核等关键攻击面提供了无与伦比且始终在线的内存安全保护,同时保持了用户期望的处理能力和性能。有关更多信息,请参阅 Apple Security Research 博客中的 Memory Integrity Enforcement: A complete vision for memory safety in Apple devices。
内存标记扩展
Arm 在 2019 年发布了内存标记扩展 (MTE) 规范,作为硬件协助查找内存损坏错误的工具。MTE 是一种内存标记和标记检查系统,每一次内存分配都会用一个密钥进行标记。硬件保证了仅在后续内存访问请求中包含正确密钥时,才会向该请求授予许可。如果密钥不匹配,App 会崩溃且该事件会被记录。这可让开发者在内存损坏错误发生时立即识别。
增强型内存标记扩展
EMTE 修复了导致 MTE 无法成为主动防护手段的漏洞,包括仅支持更安全的同步模式。此外,从已标记内存区域访问未标记内存需要已知该区域的标记,因此对于攻击者来说,通过直接修改未标记分配将动态标记内存中的越界错误作为一种规避 EMTE 手段的难度大大增加。
标记保密性强制
标记保密性强制会保护安全分配器实施免遭技术层面威胁,并保证 EMTE 标记的保密性,包括抵御侧信道和推测执行攻击。安全页表监控器会保护内核分配器后备存储区和标记存储区。系统还会确保当内核代表应用程序访问内存时,会受到与用户空间相同的标记检查规则约束。标记保密性强制还旨在减少由时序或推测攻击引起的标记泄露,甚至包括抵御 Spectre V1 的措施。