1 什么是沙盒?
沙盒是一种分离运行程序的安全机制。经常用来执行未测试代码或者是来自第三方的未信任的程序。
2 沙盒工作原理
(1)不信任的代码可以运行,但只是给予低权限;
(2)任何请求高权限的操作时通过另外一个中介进程;
(3)调用Windows API经常被拦截。
3 adobe加了沙盒前后的区别
Adobe Reader X以前未加入沙盒,漏洞利用过程如图1。
图 1 Adobe Reader 9漏洞利用过程
Adobe Reader X开始加入沙盒,漏洞利用过程如图2。
图 2 加入沙盒后漏洞的利用过程
4 Adobe Sandbox 完整性级别
Windows对程序的信任程度有5个预定义的完整性级别:
1、非信任
2、低
3、中
4、高
5、系统
Adobe reader有两个进程,broker的级别为中,而沙盒进程的级别是低。
5 Broker Client(sandbox)通信
图 3工作原理
进程间通信所用的结构体和参数通过沙盒进程写到内存,Broker读取并装载它们,一些参数可以用来接收结果。漏洞就存在这部分进程中。
图4 进程间调用的参数结构
Sandbox与Broker 进程通信是通过共享内存机制实现的。Broker创建了一个2MB的共享内存用于IPC的初始化,共享内存的句柄发动到sandbox进程,所以的通信都会影响到这段共享内存。 Sandbox进程API的调用请求是存在一个IPC缓存中,也叫做CrossCallParams 或ActuallCallParams ,结构如图4。(from crosscall_params.h )
分析IPC缓存结构:
(1)Tag为调用函数的标签;
(2)IsOnOut描述参数数据是传出还是传入;
(3)Call return 是一段用来填充来自IPC server的返回数据的缓存区;
(4)Params count显示参数的数量;
(5)下面的是参数的详细情况;
(6)parameter type 是一个枚举类型:
图5 参数类型
6 负责定义Cross Calls(进程间调用)的函数
set_info是一个静态结构体,通过它设置IPC的信息,然后作为参数传入到ipc_calls_函数进行设置。set_info结果如图5所示。
图 5 IPC结构
7 CVE 2013-0641逃离sandbox
图6 exploit中IPC的内容
绿色的是GetClipboardFormatNameW 函数的调用tag,蓝色显示只有两个参数,黄色是是参数的类型,06表示 INOUTPTR_TYPE ,02表示 ULONG_TYPE 。红色表示参数大小,所以第一个参数是偏移0x64,大小为9c,则为整段的“BB……BB”数据段。
GetClipboardFormatNameW API 函数参数说明如图7。
图 7 GetClipboardFormatNameW API 函数参数说明图
漏洞就是出在这个函数的调用.根据上面的描述,该函数的调用情况是GetClipboardFormatNameW(0xc19a, “BBBBBBBBBB……”, 0x9c);
单纯这样看是没有任何恶意的行为。
1edb0028是HttpSendRequestA第四个参数的地址,它指向存放数据的buffer。