/中文/
/中文/
/中文/
/中文/
/中文/
/中文/
/中文/
/中文/
/中文/
/中文/
近期有人使用了最新的Flash 0day漏洞cve-2018-15982和带有自毁功能的专属木马程序进行攻击,Adobe官方及时响应进行了修复更新。Adobe Flash 0day漏洞补丁能够快速安全的修复此次国家级网络攻击,极大程度的保护了用户的安全。Adobe Flash 0day漏洞补丁安全可靠,如果你在使用Adobe Flash,那就快来进行Adobe Flash 0day漏洞修复吧!
通过分析我们发现此次的CVE-2018-15982 0day漏洞是flash包com.adobe.tvsdk.mediacore.metadata中的一个UAF漏洞。Metadata类的setObject在将String类型(属于RCObject)的对象保存到Metadata类对象的keySet成员时,没有使用DRCWB(Deferred Reference Counted, with Write Barrier)。攻击者利用这一点,通过强制GC获得一个垂悬指针,在此基础上通过多次UAF进行多次类型混淆,随后借助两个自定义类的交互操作实现任意地址读写,在此基础上泄露ByteArray的虚表指针,从而绕过ASLR,最后借助HackingTeam泄露代码中的方式绕过DEP/CFG,执行shellcode。
在漏洞的触发过程,flash中Metadata的实例化对象地址
循环调用Metadata的setObject方法后,Metadata对象的keySet成员
keySet成员的部分值
强制垃圾回收后keySet成员被释放的内存部分
在new Class5重用内存后,将导致类型混淆
后续攻击者还通过判断String对象的length属性是否为24来确定漏洞利用是否成功。(如果利用成功会造成类型混淆,此时通过获取String对象的length属性实际为获取Class5的第一个成员变量的值24)。
通过进一步反编译深入分析,我们可以发现Metadata类的setObject对应的Native函数,实际功能存在于setObject_impl里。
在Object_impl里,会直接将传入的键(String对象)保存到Metadata的keySet成员里。
Buffer结构体定义如下(keySet成员的结构体有一定差异)。
add_keySet中保存传入的键(String对象)
这个时候垃圾回收机制认为传入的键未被引用,从而回收相应内存,然而Metadata对象的keySet成员中仍保留着被回收的内存的指针,后续通过new Class5来重用被回收的内存,造成UAF漏洞。