macOS/iOS漏洞之CVE-2019-6231详细分析
字数 2092 2025-08-29 08:31:47

CVE-2019-6231漏洞分析与利用教学文档

漏洞概述

CVE-2019-6231是Apple macOS和iOS系统中QuartzCore(又称CoreAnimation)框架中的一个安全漏洞,于2019年1月22日在macOS Mojave 10.14.3和iOS 12.1.3版本中被修复。该漏洞是一个整数溢出漏洞,可能导致恶意应用程序读取受限制的内存。

受影响系统

  • macOS Sierra 10.12.6
  • macOS High Sierra 10.13.6
  • macOS Mojave 10.14.2
  • iPhone 5s及更高版本
  • iPad Air及更高版本
  • iPod touch第6代

技术背景

QuartzCore框架

QuartzCore(也称为CoreAnimation)是macOS和iOS用来创建动画场景图形的框架。其特点包括:

  • 使用独特的渲染模型,图形操作单独运行
  • 在macOS上,该过程类似于WindowServer
  • 在iOS上,该过程在后台运行

CARenderServer服务

QuartzCore中名为com.apple.CARenderServer的服务通常被称为CARenderServer:

  • 存在于macOS和iOS中
  • 普通用户可以从Safari Sandbox访问
  • 通过Mach消息进行通信

漏洞分析

漏洞位置

漏洞存在于QuartzCore处理图像对象时的函数CA::Render::Image::decode()中,具体是一个整数溢出问题。

崩溃分析

崩溃日志显示问题发生在WindowServer进程的com.apple.coreanimation.render-server线程中:

Exception Type: EXC_BAD_ACCESS (SIGSEGV)
Exception Codes: KERN_INVALID_ADDRESS at 0x0000008000000018

调用栈回溯显示崩溃发生在CFRetain函数调用时,原因是尝试访问无效内存地址。

漏洞触发流程

  1. 客户端通过Mach消息与CARenderServer服务通信
  2. 服务处理命令流时调用CA::Render::Server::ReceivedMessage::run_command_stream()
  3. 解码Layer对象时调用CA::Render::Layer::Layer()
  4. Layer对象包含Image对象,调用CA::Render::Image::decode()
  5. Image解码时存在整数溢出漏洞
  6. 导致后续CA::Render::Texture::decode()CA::Render::Decoder::decode_colorspace()处理异常
  7. 最终在CFRetain调用时访问无效内存导致崩溃

关键漏洞点

CA::Render::validate_rowbytes函数中:

// 伪代码
bool validate_rowbytes(int a1, size_t a2, size_t *a3) {
    for(int v4 = 0; v4 < a1; ++v4) {
        size_t v6 = a2 * a3[v4];  // 整数溢出点
        if(v6 > 0x7FFFFFFF)
            return false;
    }
    return true;
}

a2为0x24,a3[v4]为0x8000000000000300时,乘法运算会导致整数溢出,使函数返回0而非1,改变了正常执行流程。

漏洞利用

PoC代码结构

PoC主要分为两部分:

  1. 注册客户端:发送msgh_id为40202的Mach消息(_XRegisterClient)
  2. 发送恶意消息:发送精心构造的msgh_id为40002的Mach消息触发漏洞

关键步骤

  1. 获取CARenderServer服务端口:
bootstrap_look_up(bs_port, "com.apple.CARenderServer", &p);
  1. 注册客户端获取连接ID:
quartz_register_client_t msg_register;
// 设置msg_register结构体
mach_msg(&msg_register.header, MACH_SEND_MSG | MACH_RCV_MSG, ...);
  1. 构造并发送恶意消息:
quartzcore_mach_msg_t qc_mach_msg = {0};
// 设置消息头
*(uint32_t *)(qc_mach_msg.msg_body + 4 + 12 + 4) = conn_id; // 设置连接ID
mach_msg(&qc_mach_msg.header, MACH_SEND_MSG, ...);

消息构造技巧

通过二进制diff工具分析,只需将偏移量0x142处的一个字节从0x00修改为0x80即可触发漏洞:

  • 修改前:00 03 00 00 00 00 00 00
  • 修改后:00 03 00 00 00 00 00 80

调试方法

动态调试WindowServer

需要通过SSH模式调试WindowServer进程:

  1. 设置条件断点:
br s -n CA::Render::Server::ReceivedMessage::run_command_stream
br mod -c '*(int*)($r13+0x2c) == [conn_id]'
  1. 获取连接ID:
(lldb) p/x conn_id
  1. 检查消息缓冲区:
(lldb) x -c 0x2e0 0x000070000cc51ca0

关键函数断点

  • CA::Render::Server::ReceivedMessage::run_command_stream()
  • CA::Render::Image::decode()
  • CA::Render::validate_rowbytes
  • CA::Render::Decoder::decode_colorspace

漏洞修复

Apple在macOS Mojave 10.14.3和iOS 12.1.3中修复了此漏洞,主要修复点包括:

  1. CA::Render::validate_rowbytes中添加了更严格的边界检查
  2. 改进了CA::Render::Image::decode()中的整数处理
  3. 增加了对颜色空间索引的有效性验证

参考链接

  1. Apple安全更新说明
  2. Apple安全更新说明(iOS)
  3. Fortinet原始分析报告

总结

CVE-2019-6231是一个典型的整数溢出漏洞,通过精心构造的Mach消息触发,最终导致内存读取越界。该漏洞展示了:

  1. Mach服务在系统安全中的重要性
  2. 整数溢出可能导致的严重后果
  3. 复杂对象解码过程中的安全隐患
  4. 系统服务崩溃可能导致的安全问题

理解此类漏洞有助于提高对系统级安全问题的认识,并在开发中避免类似错误。

CVE-2019-6231漏洞分析与利用教学文档 漏洞概述 CVE-2019-6231是Apple macOS和iOS系统中QuartzCore(又称CoreAnimation)框架中的一个安全漏洞,于2019年1月22日在macOS Mojave 10.14.3和iOS 12.1.3版本中被修复。该漏洞是一个整数溢出漏洞,可能导致恶意应用程序读取受限制的内存。 受影响系统 macOS Sierra 10.12.6 macOS High Sierra 10.13.6 macOS Mojave 10.14.2 iPhone 5s及更高版本 iPad Air及更高版本 iPod touch第6代 技术背景 QuartzCore框架 QuartzCore(也称为CoreAnimation)是macOS和iOS用来创建动画场景图形的框架。其特点包括: 使用独特的渲染模型,图形操作单独运行 在macOS上,该过程类似于WindowServer 在iOS上,该过程在后台运行 CARenderServer服务 QuartzCore中名为 com.apple.CARenderServer 的服务通常被称为CARenderServer: 存在于macOS和iOS中 普通用户可以从Safari Sandbox访问 通过Mach消息进行通信 漏洞分析 漏洞位置 漏洞存在于QuartzCore处理图像对象时的函数 CA::Render::Image::decode() 中,具体是一个整数溢出问题。 崩溃分析 崩溃日志显示问题发生在WindowServer进程的 com.apple.coreanimation.render-server 线程中: 调用栈回溯显示崩溃发生在 CFRetain 函数调用时,原因是尝试访问无效内存地址。 漏洞触发流程 客户端通过Mach消息与CARenderServer服务通信 服务处理命令流时调用 CA::Render::Server::ReceivedMessage::run_command_stream() 解码Layer对象时调用 CA::Render::Layer::Layer() Layer对象包含Image对象,调用 CA::Render::Image::decode() Image解码时存在整数溢出漏洞 导致后续 CA::Render::Texture::decode() 和 CA::Render::Decoder::decode_colorspace() 处理异常 最终在 CFRetain 调用时访问无效内存导致崩溃 关键漏洞点 在 CA::Render::validate_rowbytes 函数中: 当 a2 为0x24, a3[v4] 为0x8000000000000300时,乘法运算会导致整数溢出,使函数返回0而非1,改变了正常执行流程。 漏洞利用 PoC代码结构 PoC主要分为两部分: 注册客户端:发送msgh_ id为40202的Mach消息(_ XRegisterClient) 发送恶意消息:发送精心构造的msgh_ id为40002的Mach消息触发漏洞 关键步骤 获取CARenderServer服务端口: 注册客户端获取连接ID: 构造并发送恶意消息: 消息构造技巧 通过二进制diff工具分析,只需将偏移量0x142处的一个字节从0x00修改为0x80即可触发漏洞: 修改前: 00 03 00 00 00 00 00 00 修改后: 00 03 00 00 00 00 00 80 调试方法 动态调试WindowServer 需要通过SSH模式调试WindowServer进程: 设置条件断点: 获取连接ID: 检查消息缓冲区: 关键函数断点 CA::Render::Server::ReceivedMessage::run_command_stream() CA::Render::Image::decode() CA::Render::validate_rowbytes CA::Render::Decoder::decode_colorspace 漏洞修复 Apple在macOS Mojave 10.14.3和iOS 12.1.3中修复了此漏洞,主要修复点包括: 在 CA::Render::validate_rowbytes 中添加了更严格的边界检查 改进了 CA::Render::Image::decode() 中的整数处理 增加了对颜色空间索引的有效性验证 参考链接 Apple安全更新说明 Apple安全更新说明(iOS) Fortinet原始分析报告 总结 CVE-2019-6231是一个典型的整数溢出漏洞,通过精心构造的Mach消息触发,最终导致内存读取越界。该漏洞展示了: Mach服务在系统安全中的重要性 整数溢出可能导致的严重后果 复杂对象解码过程中的安全隐患 系统服务崩溃可能导致的安全问题 理解此类漏洞有助于提高对系统级安全问题的认识,并在开发中避免类似错误。