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工作机制

  1. PDF文件中包含XML Data Package结构(位于第5个object流)
  2. 第1个object流中的XFA对象执行恶意JavaScript代码:
    • 操作sub1和sub2对象
    • 将sub1添加为xfa.template对象
    • 将sub2添加为xfa.form对象
    • 将sub2附加到sub1
  3. 最后执行JavaScript将o2的presence属性设置为inactive(隐藏对象并将其从事件处理中排除),触发crash

漏洞触发流程

  1. 程序在处理Template对象时错误地使用了Form对象的处理函数
  2. 导致从Template对象边界读取数据(越界读取)
  3. 由于Template对象(0x140字节)小于Form对象(0x270字节)
  4. 访问[edi+1d4]时超出Template对象分配的内存范围
  5. 将不可控的内存数据当作指针使用,最终导致程序崩溃

深入调试分析

崩溃现场分析

  1. 异常发生在AcroForm.api模块
  2. ecx寄存器值异常导致崩溃
  3. 通过栈回溯定位到崩溃上层函数:AcroForm!PlugInMain+0x979f1
  4. 反汇编分析发现:
    • ecx = [eax+esi*8] (esi为0,所以ecx = [eax])
    • eax = [edi+1d4]
    • [edi+1d4]实际上是PDF主程序路径字符串的一部分被错误当作指针

内存布局分析

  1. edi所在内存区域大小为0x140字节
  2. edi是该区域首地址(0x68e5c98 + 0x8字节头)
  3. [edi+1d4]位于0x68e5de0,超出分配的内存范围
  4. 使用gflags工具开启堆检查可验证越界访问

对象类型识别

  1. 使用uf poi(poi(0x068e5ca0)+8)命令显示Type-ID为0x7C00
  2. 0x7C00对应XFATemplateModelImpl::Type
  3. 说明该内存块保存的是xfa.template对象

对象大小差异

  1. Template对象(XFATemplateModelImpl)大小:0x140字节
  2. Form对象(XFAFormModelImpl)大小:0x270字节
  3. 漏洞根源:使用Form处理函数访问Template对象时,[edi+1d4]超出Template对象分配范围

根本原因

程序在处理Template对象时错误地使用了Form对象的函数,而Template对象(0x140)小于Form对象(0x270),导致访问[edi+1d4]时发生越界读取,造成类型混淆漏洞。

修复建议

  1. 在处理对象前严格检查对象类型
  2. 确保使用与对象类型匹配的处理函数
  3. 对内存访问进行边界检查
  4. 更新到Adobe官方发布的安全补丁

参考资料

  1. https://github.com/siberas/arpwn
  2. SyScan3602016-_Pwning_Adobe_Reader_with_XFA.pdf
  3. http://blogs.adobe.com/formfeed/2009/03/xfa_30_presenceinactive.html
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