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函数调用时,原因是尝试访问无效内存地址。
漏洞触发流程
- 客户端通过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函数中:
// 伪代码
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主要分为两部分:
- 注册客户端:发送msgh_id为40202的Mach消息(_XRegisterClient)
- 发送恶意消息:发送精心构造的msgh_id为40002的Mach消息触发漏洞
关键步骤
- 获取CARenderServer服务端口:
bootstrap_look_up(bs_port, "com.apple.CARenderServer", &p);
- 注册客户端获取连接ID:
quartz_register_client_t msg_register;
// 设置msg_register结构体
mach_msg(&msg_register.header, MACH_SEND_MSG | MACH_RCV_MSG, ...);
- 构造并发送恶意消息:
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进程:
- 设置条件断点:
br s -n CA::Render::Server::ReceivedMessage::run_command_stream
br mod -c '*(int*)($r13+0x2c) == [conn_id]'
- 获取连接ID:
(lldb) p/x conn_id
- 检查消息缓冲区:
(lldb) x -c 0x2e0 0x000070000cc51ca0
关键函数断点
CA::Render::Server::ReceivedMessage::run_command_stream()CA::Render::Image::decode()CA::Render::validate_rowbytesCA::Render::Decoder::decode_colorspace
漏洞修复
Apple在macOS Mojave 10.14.3和iOS 12.1.3中修复了此漏洞,主要修复点包括:
- 在
CA::Render::validate_rowbytes中添加了更严格的边界检查 - 改进了
CA::Render::Image::decode()中的整数处理 - 增加了对颜色空间索引的有效性验证
参考链接
总结
CVE-2019-6231是一个典型的整数溢出漏洞,通过精心构造的Mach消息触发,最终导致内存读取越界。该漏洞展示了:
- Mach服务在系统安全中的重要性
- 整数溢出可能导致的严重后果
- 复杂对象解码过程中的安全隐患
- 系统服务崩溃可能导致的安全问题
理解此类漏洞有助于提高对系统级安全问题的认识,并在开发中避免类似错误。