速看!谷歌公开至少值500万美元的多个 iOS 漏洞详情和 PoC
字数 2483 2025-08-18 11:38:49

iOS无交互漏洞分析与防护指南

漏洞概述

2019年7月,谷歌Project Zero团队公开了6个影响iOS操作系统的"无交互"安全漏洞,其中5个提供了详细信息和PoC。这些漏洞可通过iMessage客户端利用,已在iOS 12.4版本中修复。这些漏洞在漏洞市场上的估值高达500万至2400万美元,因其无需用户交互即可远程执行代码的特性而极具价值。

漏洞详情

1. CVE-2019-8647 (高危)

  • 类型:释放后使用漏洞
  • 位置:Core Data框架
  • 影响:任意代码执行
  • 触发方式:通过iMessage客户端远程触发
  • 技术细节
    • 使用NSArray initWithCoder方法时发生不安全的反序列化
    • _PFArray作为NSArray的子类,在反序列化时通过[NSArray initWithCoder:]被反序列化
    • 最终调用[_PFArray initWithObjects:count:]方法时未保留对对象的引用
    • 当NSKeyedUnarchiver发布时,数组中的对象也被发布,即使这些对象仍在使用中

2. CVE-2019-8660 (中危)

  • 类型:内存损坏漏洞
  • 位置:Core Data框架和Siri组件
  • 影响:应用程序异常终止或任意代码执行
  • 技术细节
    • 解码类NSKnownKeysDictionary1的对象时产生内存损坏
    • 在解码键之前解码长度member,导致在检查长度之前使用映射策略
    • 分配缓冲区时未进行整数溢出检查
    • 解码值数组为null时,getObjects:range不执行任何操作,导致后续循环将values数组中的条目复制到缓冲区时越界

3. CVE-2019-8662 (高危)

  • 类型:释放后使用漏洞
  • 位置:QuickLook组件
  • 影响:任意代码执行
  • 技术细节
    • 使用NSArchiver API反序列化NSObject时,白名单中的类的子类也会被反序列化
    • OITSUIntDictionary继承自NSDictionary,其initWithCoder:在unarchiving期间被调用
    • 字典的后备存储设置为CFDictionaryCreateMutable的结果,未提供键值和值回调
    • 反序列化字典的元素后导致使用后释放的问题

4. CVE-2019-8646 (高危)

  • 类型:文件读取漏洞
  • 位置:Siri和Core Data组件
  • 影响:远程读取iOS设备上的文件内容
  • 技术细节
    • 可反序列化_NSDataFileBackedFuture类,该类是文件支持的NSData对象
    • 调用[NSDatabytes]选择器时将本地文件加载到内存中
    • 允许创建长度不同于字节数组长度的NSData对象,导致越界读取和可能的越界写入

5. CVE-2019-8624 (中危)

  • 类型:越界读取漏洞
  • 位置:watchOS的Digital Touch组件
  • 影响:Apple Watch Series 1及后续版本
  • 技术细节
    • 格式错误的Tap消息包含points阵列和delta阵列短的颜色数组
    • [ETTapMessage initWithArchiveData:]方法检查points数组的长度是增量数组的两倍
    • 但只检查colors数组的长度是否超过8个字节,即使每个point-delta对都需要一种颜色

漏洞复现方法

通用复现步骤

  1. 安装frida (pip3 install frida)
  2. 修改sendMessage.py中的目标设备电话号码或电子邮件
  3. 在injectMessage.js中用obj文件路径替换标记"PATH"
  4. 在本地目录运行: python3 sendMessage.py

各漏洞特定复现文件

漏洞发现方法

自动化检测技术

  1. 使用IDAPython脚本在加载了iOS dyld_shared_cache的IDA Pro中运行
  2. 枚举所有系统库并确定从白名单类继承的类
  3. 将允许通过NSKeyedUnarchiver反序列化的类写入磁盘
  4. 通过归档有效的父类并替换为子类名称进行测试
  5. 反序列化归档并调用常用方法观察是否崩溃

测试工具

  • archiveDict.m: 生成有效的NSDictionary存档
  • unarchiveDict.m: 将存档反序列化为NSDictionary实例

防护措施

  1. 立即更新系统:安装iOS 12.4或更高版本,这些版本已修复上述漏洞
  2. 禁用iMessage:对于高安全需求用户,可考虑暂时禁用iMessage功能
  3. 应用沙箱限制:确保应用运行在严格的沙箱环境中
  4. 输入验证:对所有反序列化操作实施严格的白名单控制
  5. 内存安全:使用现代编程语言特性或工具防止内存损坏问题
  6. 安全编码实践:遵循NSSecureCoding协议实现安全的反序列化

漏洞价值分析

这些无交互iOS漏洞在漏洞市场上的估值极高:

  • Zerodium: 每个漏洞超过100万美元
  • Crowdfense: 每个漏洞200万至400万美元
  • 总计估值: 500万至2400万美元

高价值原因:

  1. 无需用户交互即可触发
  2. 可远程执行代码
  3. 影响最新iOS版本
  4. 通过系统预装应用(iMessage)触发
  5. 可用于构建完整的攻击工具链

总结

这些漏洞展示了iOS系统中反序列化和内存处理机制的深层次安全问题。安全研究人员和开发人员应:

  1. 深入理解系统框架的安全机制
  2. 严格验证所有输入数据
  3. 实现安全的编码和解码实践
  4. 及时应用安全更新
  5. 关注Project Zero等安全团队的最新研究成果

通过分析这些高价值漏洞,我们可以更好地理解现代移动操作系统面临的威胁,并采取有效措施保护用户安全。

iOS无交互漏洞分析与防护指南 漏洞概述 2019年7月,谷歌Project Zero团队公开了6个影响iOS操作系统的"无交互"安全漏洞,其中5个提供了详细信息和PoC。这些漏洞可通过iMessage客户端利用,已在iOS 12.4版本中修复。这些漏洞在漏洞市场上的估值高达500万至2400万美元,因其无需用户交互即可远程执行代码的特性而极具价值。 漏洞详情 1. CVE-2019-8647 (高危) 类型 :释放后使用漏洞 位置 :Core Data框架 影响 :任意代码执行 触发方式 :通过iMessage客户端远程触发 技术细节 : 使用 NSArray initWithCoder 方法时发生不安全的反序列化 _PFArray 作为NSArray的子类,在反序列化时通过 [NSArray initWithCoder:] 被反序列化 最终调用 [_PFArray initWithObjects:count:] 方法时未保留对对象的引用 当NSKeyedUnarchiver发布时,数组中的对象也被发布,即使这些对象仍在使用中 2. CVE-2019-8660 (中危) 类型 :内存损坏漏洞 位置 :Core Data框架和Siri组件 影响 :应用程序异常终止或任意代码执行 技术细节 : 解码类 NSKnownKeysDictionary1 的对象时产生内存损坏 在解码键之前解码长度member,导致在检查长度之前使用映射策略 分配缓冲区时未进行整数溢出检查 解码值数组为null时,getObjects:range不执行任何操作,导致后续循环将values数组中的条目复制到缓冲区时越界 3. CVE-2019-8662 (高危) 类型 :释放后使用漏洞 位置 :QuickLook组件 影响 :任意代码执行 技术细节 : 使用NSArchiver API反序列化NSObject时,白名单中的类的子类也会被反序列化 OITSUIntDictionary 继承自NSDictionary,其initWithCoder:在unarchiving期间被调用 字典的后备存储设置为 CFDictionaryCreateMutable 的结果,未提供键值和值回调 反序列化字典的元素后导致使用后释放的问题 4. CVE-2019-8646 (高危) 类型 :文件读取漏洞 位置 :Siri和Core Data组件 影响 :远程读取iOS设备上的文件内容 技术细节 : 可反序列化 _NSDataFileBackedFuture 类,该类是文件支持的NSData对象 调用[ NSDatabytes ]选择器时将本地文件加载到内存中 允许创建长度不同于字节数组长度的NSData对象,导致越界读取和可能的越界写入 5. CVE-2019-8624 (中危) 类型 :越界读取漏洞 位置 :watchOS的Digital Touch组件 影响 :Apple Watch Series 1及后续版本 技术细节 : 格式错误的Tap消息包含points阵列和delta阵列短的颜色数组 [ETTapMessage initWithArchiveData:] 方法检查points数组的长度是增量数组的两倍 但只检查colors数组的长度是否超过8个字节,即使每个point-delta对都需要一种颜色 漏洞复现方法 通用复现步骤 安装frida ( pip3 install frida ) 修改sendMessage.py中的目标设备电话号码或电子邮件 在injectMessage.js中用obj文件路径替换标记"PATH" 在本地目录运行: python3 sendMessage.py 各漏洞特定复现文件 CVE-2019-8647: pfarray.zip CVE-2019-8660: knownkeydict CVE-2019-8662: 复现代码 CVE-2019-8646: filebacked.zip CVE-2019-8624: tapcrash.zip 漏洞发现方法 自动化检测技术 使用IDAPython脚本在加载了iOS dyld_ shared_ cache的IDA Pro中运行 枚举所有系统库并确定从白名单类继承的类 将允许通过NSKeyedUnarchiver反序列化的类写入磁盘 通过归档有效的父类并替换为子类名称进行测试 反序列化归档并调用常用方法观察是否崩溃 测试工具 archiveDict.m: 生成有效的NSDictionary存档 unarchiveDict.m: 将存档反序列化为NSDictionary实例 防护措施 立即更新系统 :安装iOS 12.4或更高版本,这些版本已修复上述漏洞 禁用iMessage :对于高安全需求用户,可考虑暂时禁用iMessage功能 应用沙箱限制 :确保应用运行在严格的沙箱环境中 输入验证 :对所有反序列化操作实施严格的白名单控制 内存安全 :使用现代编程语言特性或工具防止内存损坏问题 安全编码实践 :遵循NSSecureCoding协议实现安全的反序列化 漏洞价值分析 这些无交互iOS漏洞在漏洞市场上的估值极高: Zerodium: 每个漏洞超过100万美元 Crowdfense: 每个漏洞200万至400万美元 总计估值: 500万至2400万美元 高价值原因: 无需用户交互即可触发 可远程执行代码 影响最新iOS版本 通过系统预装应用(iMessage)触发 可用于构建完整的攻击工具链 总结 这些漏洞展示了iOS系统中反序列化和内存处理机制的深层次安全问题。安全研究人员和开发人员应: 深入理解系统框架的安全机制 严格验证所有输入数据 实现安全的编码和解码实践 及时应用安全更新 关注Project Zero等安全团队的最新研究成果 通过分析这些高价值漏洞,我们可以更好地理解现代移动操作系统面临的威胁,并采取有效措施保护用户安全。