CVE-2018-12794类型混淆漏洞详细分析
字数 1830 2025-08-29 08:32:00
CVE-2018-12794 Adobe Reader类型混淆漏洞深度分析
漏洞概述
CVE-2018-12794是Adobe Reader中的一个类型混淆漏洞,通过精心构造的XML数据包(XDP)模板并对XFA对象执行特定JavaScript操作,攻击者可以强制Reader从Template对象的边界读取数据。该漏洞最终可在沙盒渲染器进程中执行任意代码。
漏洞本质是程序在处理Template对象时错误地使用了Form对象的函数进行处理,导致越界数据读取,属于典型的类型混淆(Type Confusion)漏洞。
技术背景
XDP (XML Data Package)
XDP是Adobe Systems创建的XML文件格式,特点包括:
- 允许将PDF内容或XFA资源打包在XML容器中
- 符合XML 1.0规范
- 可作为独立文档或在PDF文档中携带
- 提供在XML容器中打包表单组件的机制
- 可打包PDF文件以及XML表单和模板数据
XFA (XML Forms Architecture)
XFA是一系列专有XML规范,用于增强Web表单处理:
- 提供基于模板的语法和处理规则集
- 允许构建交互式表单
- 基于模板的语法定义用户提供数据的字段
- 提供描述交互式表单的通用XML语法
漏洞细节分析
POC工作机制
- PDF文件中包含XML Data Package结构(位于第5个object流)
- 第1个object流中的XFA对象执行恶意JavaScript代码:
- 操作sub1和sub2对象
- 将sub1添加为xfa.template对象
- 将sub2添加为xfa.form对象
- 将sub2附加到sub1
- 最后执行JavaScript将o2的presence属性设置为inactive(隐藏对象并将其从事件处理中排除),触发crash
漏洞触发流程
- 程序在处理Template对象时错误地使用了Form对象的处理函数
- 导致从Template对象边界读取数据(越界读取)
- 由于Template对象(0x140字节)小于Form对象(0x270字节)
- 访问[edi+1d4]时超出Template对象分配的内存范围
- 将不可控的内存数据当作指针使用,最终导致程序崩溃
深入调试分析
崩溃现场分析
- 异常发生在AcroForm.api模块
- ecx寄存器值异常导致崩溃
- 通过栈回溯定位到崩溃上层函数:AcroForm!PlugInMain+0x979f1
- 反汇编分析发现:
- ecx = [eax+esi*8] (esi为0,所以ecx = [eax])
- eax = [edi+1d4]
- [edi+1d4]实际上是PDF主程序路径字符串的一部分被错误当作指针
内存布局分析
- edi所在内存区域大小为0x140字节
- edi是该区域首地址(0x68e5c98 + 0x8字节头)
- [edi+1d4]位于0x68e5de0,超出分配的内存范围
- 使用gflags工具开启堆检查可验证越界访问
对象类型识别
- 使用
uf poi(poi(0x068e5ca0)+8)命令显示Type-ID为0x7C00 - 0x7C00对应XFATemplateModelImpl::Type
- 说明该内存块保存的是xfa.template对象
对象大小差异
- Template对象(XFATemplateModelImpl)大小:0x140字节
- Form对象(XFAFormModelImpl)大小:0x270字节
- 漏洞根源:使用Form处理函数访问Template对象时,[edi+1d4]超出Template对象分配范围
根本原因
程序在处理Template对象时错误地使用了Form对象的函数,而Template对象(0x140)小于Form对象(0x270),导致访问[edi+1d4]时发生越界读取,造成类型混淆漏洞。
修复建议
- 在处理对象前严格检查对象类型
- 确保使用与对象类型匹配的处理函数
- 对内存访问进行边界检查
- 更新到Adobe官方发布的安全补丁
参考资料
- https://github.com/siberas/arpwn
- SyScan3602016-_Pwning_Adobe_Reader_with_XFA.pdf
- http://blogs.adobe.com/formfeed/2009/03/xfa_30_presenceinactive.html