Adobe X沙箱
一、Adobe X沙箱简介
Adobe Reader X自从引入沙箱以来,对其攻击的难度就提高了很多。Reader X的沙箱是基于Google的Chrome沙箱,Chrome是开源的,Reader X和Chrome的代码有很大程度上的相似。
Adobe Reader X以及后续版本,在启动的时候会有两个进程,这两个进程的名字都叫AcroRd32.exe,是一对父子进程。其中父进程一般称为Broker进程,子进程称为SandBox进程,二者其实是同一个可执行文件AcroRd32.exe,只不过启动参数不同(参考文章《PLAYING IN THE READER X SANDBOX》)
图1:父子进程Broker.exe和SandBox.exe
Broker进程启动SandBox进程时修改了SandBox进程中的一些关键API,以User32! GetClipboardFormatNameA函数为例
图2:修改前的User32! GetClipboardFormatNameA函数
图3:修改后的User32! GetClipboardFormatNameA函数
在 SandBox进程中调用一些系统API的时候,会跳转到Adobe Reader自己的函数中(如图4中的JMP 00990270),并通过IPC调用把要执行的指令传给Broker进程,Broker进程来决定API是否被调用,最终通过IPC把结果返回给SandBox进程。
当打开一个PDF文件时,SandBox进程作为PDF文件的解释器解析PDF文件格式及其中的JS脚本,就算利用漏洞绕过了SandBox进程执行shellcode,由于有Broker进程的缘故,shellcode的功能也十分有限,这给了Adobe Reader极大的安全保障。Reader X逻辑关系如图4。
图4:Reader X逻辑关系图
二、漏洞利用——CVE_2013_0640 + CVE_2031_0641
1. CVE_2013_0640
位置:作用于SandBox进程
成因:堆分配错误导致的可读写任意字节漏洞
效果:可在SandBox进程中执行shellcode
2. CVE_2013_0641
位置:作用于Broker进程
成因:SandBox与Broker进程IPC通信漏洞
效果:可在Broker进程中执行shellcode
二者结合可突破Adobe Reader X,效果如图5。
图5:CVE_2013_0640 + CVE_2031_0641 突破Adobe Reader X
三、Adobe X 漏洞挖掘简介
1. CVE-2013-0641简介
1) 前提假设:已获取SandBox进程控制权
2) 漏洞成因:IPC Call
SandBox和Broker进程是通过IPC Call通信的,其每个IPC Call都有一个TagID标识调用的函数名。Broker进程根据TagID确定调用的是什么函数,如TagID = 0×74则Broker进程认为当前要调用的是GetClipboardFormatNameA 函数,TagID = 0×73则Broker进程认为当前要调用的是GetClipboardFormatNameW 函数。
当我们用TagID = 0×73 调用GetClipboardFormatNameA时会导致Broker进程的堆溢出,在下次IPC Call时可获取Broker进程控制权,如图6,7,8。(详情可参考南京翰海源的分析http://blog.vulnhunt.com/index.php/2013/02/21/cve-2013-0641-analysis-of-acrobat-reader-sandbox-%20escape/)
图6:TagID=0×74 发起GetClipboardFormNameA调用
图7:TagID=0×73 发起GetClipboardFormNameW调用
图8:TagID=0×73 发起GetClipboardFormNameA调用
2. IPC Call 漏洞挖掘
Broker进程的逃逸是突破Adobe X的关键,Adobe的IPC Call可能还存在类似CVE-2013-0641的漏洞。若要对此类漏洞挖掘,则首先要获取Adobe所有的TagID,函数参数列表并把TagID对应到具体的Windows API上,可以通过静态分析AcroRd32.exe获取相应的信息(以下内容参考自 ADOBE SANDBOX WHEN THE BROKER IS BROKEN, CanSecWest 2013)。
1) 通过一已知API(InternetGetCookieA)的交叉引用表定位其TagID,如图9-13。
图9:从导出表查找函数InternetGetCookieA的地址
图10:定位InternetGetCookieA函数
图11:查看InternetGetCookieA的交叉引用表
图12:内存搜索交叉引用表中第一下地址,并获取到唯一值
图13:查看内存搜索结果附近数据
Broker进程对每一个可处理的API Call都要调用同一个函数初始化, 大括号中的数据结构A为初始化函数传入的参数。
由图可知InternetGetCookieA与48B190,0×68是一一对应的。
2) 获取所有TagID和函数参数列表,如图14-16。
图14:获取数据结构A的交叉引用表
图15:查看调用A的函数(Call _text_413DD0),此函数即为所有API Call都需调用的初始化函数
图16:查看Call _text_413DD0的交叉引用表
从Call _text_413DD0的交叉引用表中可以找到所有类似于A的数据结构,从而定位所有TagID,如图17-18。
图17:点击交叉引用表
图18:获取TagID的数据结构
3)将TagID对应到Windows API
Adobe中有个函数是用来开启API拦截的,此函数可对某个指定的API是否开启拦截。可通过InternetGetCookie函数找到此拦截函数,如图19,20。
图19:内存搜索InternetGetCookieA函数
图20:call _text_42A580即为开启API拦截的函数的地址
通过call _text_42A580定位函数名和TagID的关系,如图
图21:函数call _text_42A580
图22:Call _text_42A580的交叉引用表
图23:从交叉引用表中获取函数名与TagID对应关系
3. 自动化脚本测试
按上述思路可用脚本获取所有TagID,对应到函数名和相应参数,以便进一步的漏洞挖掘。
Adobe X沙箱的更多相关文章
- CVE-2013-3346:十全九美的 Adobe Reader ToolButton UAF 漏洞
0x01 "Epic Turla" 网络间谍行动 在 2014 年 8 月,被誉为 "世界十大最危险的网络攻击行动" 之一的 "Epic Turla& ...
- 开发Adobe AIR移动应用程序的考虑事项
http://www.adobe.com/cn/devnet/air/articles/considerations-air-apps-mobile.html Adobe AIR 经过发展演进,已经超 ...
- [ActionScript 3.0] AS3 深入理解Flash的安全沙箱Security Domains
简介 如果你还没有与复杂的的安全域(security domain)和应用程序域(application domain)问题打过交道,那么你真是个幸运的家伙.当你在加载外部内容(然后他们开始播放)的时 ...
- 关闭 Flash 沙箱安全模式,解决浏览器高占用
经常碰到 Firefox 因 Flash 插件崩溃,到卡饭翻了翻,发现是 Flash 沙箱的问题.原文附带了去沙箱保护的 Flash 插件,可惜版本有点旧,遂自己动手解决. 注意:办法一适用于 [ 安 ...
- 关于Adobe Flash 11.3 引起的火狐使用问题
Adobe Flash 更新到11.3之后,为火狐引入Flash沙盒安全模式,但同时,又造成了部分兼容性问题,导致 Windows vista及 Windows 7上部分火狐崩溃,并致使一些使用Fla ...
- 出现security ioError 安全沙箱问题
client安全沙箱 通配策略 crossdomain <?xml version="1.0" encoding="UTF-8"?> <!DO ...
- Flex报错Error #2048: 安全沙箱冲突
Flex+JPA架构,JPA程序迁移,从Aserver到B. 其它一切没变.唯一变的就是IP. 前端Flex也就是swf报错Error #2048: 安全沙箱冲突:http://xxx.swf 不能从 ...
- 解决“chrome提示adobe flash player 已经过期”的小问题
这个小问题也确实困扰我许久,后来看到chrome吧里面有人给出了解决方案: 安装install_flash_player_ppapi, 该软件下载地址:http://labs.adobe.com/do ...
- 基于Adobe Flash平台的3D页游技术剖析
写在前面 从黑暗之光,佛本是道,大战神的有插件3D页游.再到如今的魔龙之戒. 足以证明,3D无插件正在引领页游技术的潮流. 目前,要做到3D引擎,有以下几个选择. 说到这里,我们发现.这些都不重要. ...
随机推荐
- Spring之Method Injection
对于Spring的多数用户而言,主要的Bean存在形式都是单例,当一个单例需要结合另一个单例协作或者一个非单例与另一个非单例协作时,典型的做法是通过属性的形式注入,但是当两个Bean的声明周期不同时候 ...
- Thinkphp5.0分页和跳页
后台查询商品或者会员量需要用到分页展示列表,当页数比较多的时候为了体高用户体验度,需要添加一个跳页也就是手动输入页码数进行快速跳转指定页面.由于手动编写分页比较麻烦,又想使用TP5自带的分页,但是TP ...
- ethereumjs/ethereumjs-icap
https://github.com/ethereumjs/ethereumjs-icap ethereumjs-icap 安装: npm install ethereumjs-icap --save ...
- day3-作业及答案
作业:1.用python实现冒泡排序# [50,20,30,10]## 升序:谁大谁交换到后面# 降序:谁大谁交换到前面## 以升序为例# 第1趟:# [20,50,30,10]# [20,30,50 ...
- OpenCV——SIFT特征检测与匹配
SIFT特征和SURF特征比较 比较项目 SIFT SURF 尺度空间极值检测 使用高斯滤波器,根据不同尺度的高斯差(DOG)图像寻找局部极值 使用方形滤波器,利用海森矩阵的行列式值检测极值,并利用积 ...
- OpenCV——模板匹配
minMaxLoc函数: void minMaxLoc( const Mat& src, double* minVal, double* maxVal=0, Point* minLoc=0, ...
- 输入5个学生的信息(包括学号,姓名,英语成绩,计算机语言成绩和数据库成绩), 统计各学生的总分,然后将学生信息和统计结果存入test.txt文件中
题目分析: 1.首先想到的是数组存放数据,数组肯定是String类型. 2.String类型的数组,5行6列.要把从第0行第2列到第4行第4列的数据取出转换成数值型,再统计三科总分.最后把计算出的总分 ...
- 使用Tortoise结合Git比较两个版本的差异
1.右键项目,TortoiseGit -------> Diff with previous version 2.单击出分支选择弹窗,进行选择要比较的两个分支 3.比较同个分支的两个不同的版本 ...
- P3084 [USACO13OPEN]照片Photo
题目描述 农夫约翰决定给站在一条线上的N(1 <= N <= 200,000)头奶牛制作一张全家福照片,N头奶牛编号1到N. 于是约翰拍摄了M(1 <= M <= 100,00 ...
- 几个PHP读取整个文件的函数readfile()、fpassthru()和file()
2.7.4 读取整个文件:readfile().fpassthru()和file()除了可以每次读取文件一行外,还可以一次读取整个文件.PHP提供了4种不同的方式来读取整个文件.第一种方式是rea ...