Hacking Team 武器库研究(二):CVE-2015-5119 Flash 0day

目前 Hacking Team 泄露的Flash 0Day已经修复,官方已提供补丁下载,与此同时Metasploit已经提供有漏洞利用代码。在HT泄露的源码目录里,已经包含有对漏洞的简要分析。

【源码分析】

1、在MyClass.TryExp1函数中触发漏洞,先分配一组ByteArray,长度为0xfa0,相当于0x1000大小的内存。

2、设置ByteArray值,在将MyClass类赋值给_ba[3]时,AVM会调用MyClass.valueOf函数试图将MyClass类型其转换成Byte类型。

3、在valueOf 函数中会重新设置更大长度的ByteArray,导致释放原有的ByteArray内存,再重新分配,但是valueOf函数返回后,依然保持着对已释放内存的引用,从而导致UAF漏洞的发生。紧接着分配一堆0x3f0大小的vector.对象,以占用已释放的内存,然后返回0x40值给ba[3],刚好覆盖vector对象头部的长度值,以实现读写任意内存地址。

4、后面的代码基本跟第一篇分析文章中介绍一样。再补充下上面调用valueOf转换类型的AVM伪代码:

1
2
3
4
5
void ByteArray.setObjInternal(int offset, obj)
{
byte* dest = this.getStorage(offset);
dest* = toInteger(obj); // call MyClass.valueOf()
}

将ba[3]的内存存储地址保存到本地定义的目标指针,然后对象类型转换成整数类型并赋值给目标指针,当ByteArray数组长度改变时,它会释放原有ba内存,目标指针就成为悬挂指针。