iOS 系统安全设计解析(一):系统安全

iOS 系统安全性在行业中的口碑一直不错。本系列文章讨论 iOS 是如何在技术层面保证用户数据的安全。苹果 2019 年更新了安全设计公开资料,广泛涉及系统安全,加解密,App,网络,付款,Apple ID 等各方面。本文目的不是对它进行翻译,而是提取主要信息并以个人理解希望简明易懂地介绍 iOS 操作系统的安全设计。如果需要更详细的信息,可以阅读原文。

系统安全

系统安全的设计目标是保障操作系统本身的安全。运行的操作系统和软件必须是经过验证,没有被篡改。

Secure boot chain

iOS 从系统启动开始,每一步都会用数字签名算法验证下一步的代码完整性,校验通过后才会继续运行。

CPU 启动时执行的第一段代码只能是默认被信任的,所以这个 (Boot ROM) 是只读的,Apple 在芯片制造 (chip fabrication) 过程中就写入了这段代码。Boot ROM 中还包含了 Apple Root CA,其中包括它的 public key,以便用于验证下一步 (iBoot) 的代码签名。只读保证了 Boot ROM 不会被篡改,但是也不能被更新。所以当 Boot ROM 有 bug 的时候 (通常是导致允许没有签名的代码运行的 bug),会导致硬件永久可越狱。当 iBoot 完成任务后,它会验证 iOS 内核 (kernel) 的代码签名,然后启动 kernel。涉及 secure boot chain 的 bug 一直是 Apple 的 bug bounty program 中奖金最高的项目之一。

启动过程:

Boot ROM (含 Root CA) -> iBoot -> Kernel

iOS 设备的基带启动过程也有独立的一套的类似的验证。

System Software Authorization

Apple 的系统更新会修复安全缺陷,为了防止通过降级设备暴露旧版本的漏洞导致数据窃取,苹果设计了一套验证系统。当用户尝试安装 iOS 系统时(升级或降级),设备会发送要安装的组件的信息,一个随机数和一个芯片唯一标识符 (ECID) 到苹果的服务器,服务器验证后对这些数据进行签名然后发回设备,设备的 secure boot chain 验证签名后才会继续安装。

A4 和以前芯片的设备 (iPhone 4) 可以通过截取,保存和重放 SHSH blob 来降级。A5 在验证过程中加入了随机数之后这个方法就不可行了。

Secure Enclave

Secure Enclave 是 SoC 内的一个协处理器,它有加密 RAM 和一个硬件随机数生成器,用来协助密码学计算。它还有一个只有它能访问的非易失性存储器,用来存放一些计数,帮助防止重放攻击 (replay attack)。这个协处理器会在以后介绍的设计里用到。它还用于 Touch ID 和 Face ID 的匹配和数据存储。

Kernel Integrity Protection

iOS 设备利用内存控制器来保护加载到内存特定区域中的内核和驱动代码,系统启动完成后会拒绝以后的写入操作 (处理器 A10+)。协处理器有更严格的保护措施 (A12+)。A12 以上的处理器还支持 Pointer Authentication Codes,防止修改函数指针和返回指针,用于阻止例如 ROP attack。

Face ID / Touch ID 如何保护设备数据安全

iOS 上的所有文件都是加密存储的。每个文件都由多个不同的加密密钥 (key) 加密 (后面章节会详细介绍)。当 Touch ID / Face ID 启用之后,设备锁定时,Secure Enclave 会把最高级别数据保护的 class key 先用 Touch ID / Face ID 子系统提供的 wrapping key 加密,并把 class key 删除。当成功解锁时,Touch ID / Face ID 子系统会提供这个 wrapping key,Secure Enclave 用它解密 class key,然后数据就可以访问。这些 key 都存储在内存中,设备重启后,必须提供 passcode 才能重新获取 class key。

下一章是关于 iOS 文件系统加密,数据保护,passcode 的设计细节。欢迎在订阅号留言提问或建议。