Hacking Team 武器库研究(一):CVE-2015-0349 Flash ConvolutionFilter UAF

CVE-2015-0349 Flash ConvolutionFilter UAF 是今年Pwn2Own大赛上被用于攻破64位Flash的漏洞,在泄露的Hacking Team武器库中就包括了该漏洞的利用代码,以及利用本地提权漏洞作为shellcode,以绕过沙盒的保护。泄露的利用代码包含完整的工程文件,用Flash Develop打开项目即可编译。

【源码分析】

1、MyClass.TryExp1是漏洞利用的入口函数,它先创建ConvolutionFilter类,它是一个矩阵环绕滤镜,比如用于实现模糊、斜边、锐化等效果。它的2个参数分别为matrixX矩阵列数和matrixY矩阵行数,这里分别是14和15。

2、接下来程序将分配ConvolutionFilter的a(Array类型)赋值给_cf (ConvolutionFilter对象),并设置matrix值为m(Array类型),接着将matrix数组的第一个元素赋值给m0,当它不为0是则表示漏洞不存在,否则即存在UAF漏洞。为何如此?在第一点中,我们知道m[0]是MyClass类,该类里面定义有valueOf方法,在设置martix值时会调用到该方法,具体见第3点分析。

3、在valueOf 函数中,matrixX会被重新设置为15(原始值为14),导致原先有matrix数组被释放,然后重新分配矩阵滤镜的matrixX内存,但此时_cf.matrix依然保持着对已释放的matrix数组的引用,所以在第2点会会去判断matrix数组首个元素值是否为0(原初始值也是0),也就是判断已释放的数组是否还可被引用。

4、通过分配一堆Vector.对象去占用已释放的内存,长度刚好与matrix数组长度相同,也就是matrixX matrixY = 1415,每个vector.对象的实际大小就是14154=0x348(840),最后在从valueOf函数中返回2,2会被写入matrix数组首个元素中,但此时实际是向Vector对象写入数据,从而更改vector对象长度,实现任意内存读写。

5、再回头继续看MyClass.TryExp1函数,找到已经被篡改长度值的vector对象,再根据不同的系统平台执行不同的shellcode代码。

6、看下32位windows平台的shellcode执行相关的ShellWin32类,先看初始化函数init,它只是做一些全局变量赋值。

7、真正用于执行代码的是ShellWin32.Exec函数,先获取包含shellcode的_x32对象地址,然后在内存中搜索PE头,解析PE文件格式,从导入表中找到VirtualProtect函数地址,调用它对shellcode内存地址设置可执行权限,接着找到自定义的payload空函数对应的JIT函数指针,用shellcode地址去替换JIT指针,最后调用payload.call 以执行shellcode的。