日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
HackingTeam攻擊代碼分析Part2:Pwn2Own漏洞

前一篇文章我們分析了HackingTeam泄露數(shù)據(jù)中的Flash 0day (bytearray 0day)。而在泄露數(shù)據(jù)中我們其實(shí)還看到了另外一個(gè)名為convolution_filter的flash exploit。

明溪網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián)公司,明溪網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為明溪近1000家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\成都外貿(mào)網(wǎng)站建設(shè)公司要多少錢(qián),請(qǐng)找那個(gè)售后服務(wù)好的明溪做網(wǎng)站的公司定做!

看了一下這個(gè)flash exploit,我很快意識(shí)到這個(gè)漏洞是一個(gè)已經(jīng)修補(bǔ)的漏洞cve-2015-0329,在今年4月份被修補(bǔ),這也解釋了readme文檔中,flash后面加了“(April 2015)”,意思是這個(gè)洞只能用到今年4月之前的flash版本中:

(https://helpx.adobe.com/cn/security/products/flash-player/apsb15-06.html)

我個(gè)人對(duì)這個(gè)漏洞印象比較深,看似平凡的它有個(gè)不平凡的故事,今年的pwn2own大賽中,前Vupen主力Nicolas Joly正是用這個(gè)漏洞拿下了64位Flash插件:

 

 

 

 

所以事情就變得很有趣了,一邊是Nico用這個(gè)漏洞打 Pwn2Own,另一邊HackingTeam(從常理推測(cè),應(yīng)該是通過(guò)其它渠道,和Nico無(wú)關(guān))也掌握了這個(gè)漏洞并將其用于自己的Exploit工具包中。

CVE-2015-0349原理分析

再回頭看一下CVE-2015-0349這個(gè)漏洞,這是一個(gè)ActionScript 3中ConvolutionFilter類的內(nèi)部matrix數(shù)組的一個(gè)Use After Free漏洞,這是個(gè)非常好用的漏洞,在32位和64位上都可以輕松實(shí)現(xiàn)穩(wěn)定利用。

我們來(lái)看一下HackingTeam泄露的exploit代碼,關(guān)鍵部分如下:

創(chuàng)建ConvolutionFilter對(duì)象:

// try to allocate two sequential pages of memory: [ matrix ][ MyClass2 ]
for(i=20; i < alen; i+=6){
a[i] = new Class2(i);
for(j=i+1; j < i+5; j++)
a[j] = new ConvolutionFilter(14,15);
a[i+5] = new Class2(i+5);
}

設(shè)置matrix

var m:Array = new Array(bLen);
m[0] = new Clasz;
m[1] = m[0];
try { filter.matrix = m; } catch (e:Error){}

這里有一個(gè)關(guān)鍵點(diǎn),filter.matrix被賦值為m(類型是 Array),而Array m的第一個(gè)元素是一個(gè)Clasz類,而Clasz類定義了valueOf方法,這個(gè)valueOf是漏洞觸發(fā)的關(guān)鍵點(diǎn):

public class Clasz
{
…
public function Clasz() { }
prototype.valueOf = function()
{
…
}

在Clasz的valueOf函數(shù)中,設(shè)置matrixX:

prototype.valueOf = function()
{
if (filter.matrixX > 14) throw new Error(“”); // check for the second valueOf() call
ref = new Array(5);
collect.push(ref); // protect from GC // for RnD
filter.matrixX = 15; // reallocate filter matrix
// reuse freed memory
for(var i:int; i < ref.length; i++) {
ref[i] = new Vector.
 ;
ref[i].length = bLen;
}
// return value for vector length overwriting
return 2; // = 0x40000000 as single precision
}

事實(shí)上filter.matrixX = 15執(zhí)行完畢之后,ConvolutionFilter內(nèi)部的一個(gè)float數(shù)組(我們叫他matrixArray)就會(huì)被釋放,而從valueOf返回之后,已經(jīng)釋放的matrixArray還會(huì)繼續(xù)被使用,并且往里面寫(xiě)入數(shù)據(jù),從而造成了Use-After-Free。我們可以看到valueOf函數(shù)中,在設(shè)置了filter.matrixX之后,分配了一系列的vector ,這些vector就是用來(lái)占用釋放后的matrixArray的內(nèi)存的。這樣當(dāng)程序繼續(xù)往被釋放后的matrixArray里寫(xiě)數(shù)據(jù)時(shí),實(shí)際上是在往vector對(duì)象里面寫(xiě)數(shù)據(jù),從而達(dá)到修改vector長(zhǎng)度字段的目的,便于進(jìn)一步exploit。

細(xì)節(jié)分析

我們首先先介紹一下ConvolutionFilter的關(guān)鍵結(jié)構(gòu):

ConvolutionFilterObject {
+10 ConvolutionFilter {
+14 int matrixX;
+18 int matrixY;
+1C float *matrixArray;
+20 int matrixLength;
}
}

ConvolutionFilter里面有成員存放matrix矩陣,matrixX和matrixY代表矩陣的x和y,matrixArray是動(dòng)態(tài)分配的數(shù)組,其大小是由matrixX和matrixY決定的,關(guān)系如下:

matrixArray = alloc( matrixX * matrix * sizeof(float) )

當(dāng)matrixX和matrixY改變時(shí),如果原來(lái)的matrixArray大小不足以容納現(xiàn)在的容量,則舊的matrixArray會(huì)被釋放,然后分配新的matrixArray (UAF就是這么來(lái)的)

當(dāng)exploit代碼創(chuàng)建ConvolutionFilter時(shí),傳入的參數(shù)是matrixX=14,matrix=15:

a[j] = new ConvolutionFilter(14,15);

因此matrixArray初始大小為 14 * 15 * 4 = 840,然后我們看一下第二步,執(zhí)行

try { filter.matrix = m; } catch (e:Error){}

時(shí)發(fā)生了什么:

ConvolutionFilter::set_matrix基本上是直接調(diào)用了另外一個(gè)函數(shù),我們叫他set_matrix_internal:

.text:102E9604 loc_102E9604: ; CODE XREF: sub_102E95ED+Aj
.text:102E9604 push 14h
.text:102E9606 lea eax, [esi+24h]
.text:102E9609 push eax
.text:102E960A mov eax, [esi+8]
.text:102E960D mov ecx, [eax+4]
.text:102E9610 or edi, 1
.text:102E9613 push edi
.text:102E9614 call set_matrix_internal

調(diào)用該函數(shù)時(shí)參數(shù)如下:

set_matrix_internal( paramArray, matrixArray, matrixLength )

這里的關(guān)鍵點(diǎn)是:matrixArray直接作為參數(shù)被傳入。我們來(lái)看一下set_matrix_internal函數(shù),該函數(shù)的功能可以描述為:將paramArray(在exploit里面就是m這個(gè)數(shù)組)里面的每一項(xiàng)賦值給matrixArray中對(duì)應(yīng)的項(xiàng),由于matrixArray的類型為float *,因此如果有必要的話得把paramArray中的元素轉(zhuǎn)換成float,對(duì)應(yīng)邏輯的偽代碼如下:

for ( i = 0; I < matrixLength; ++ i ) {
matrixArray[i] = (float)ConvertToNumber(paramArray.get(i));
}

還記得我們的m[0]被設(shè)置成一個(gè)Clasz對(duì)象了嗎?

m[0] = new Clasz;

將Clasz對(duì)象轉(zhuǎn)換成Number的過(guò)程中,會(huì)調(diào)用Clasz對(duì)象的valueOf函數(shù),而前面已經(jīng)講過(guò),valueOf函數(shù)會(huì)設(shè)置filter.matrixX=15(原來(lái)的matrixX為14),此時(shí)由于matrixArray大小不夠,于是舊的matrixArray被釋放,新的matrixArray被分配。然后從valueOf返回到set_matrix_internal以后,程序繼續(xù)向matrixArray里面寫(xiě)入值,注意這里用的還是舊的 matrixArray,于是UAF漏洞就這樣產(chǎn)生了。

又是valueOf

如果你看過(guò)我們前一篇分析bytearray 0day的文章,你可能對(duì)valueOf這個(gè)函數(shù)依然印象深刻。事實(shí)上這兩個(gè)洞無(wú)論是從產(chǎn)生原理,還是利用方式來(lái)講都非常的相近。背后隱藏的邏輯是腳本語(yǔ)言從native code回調(diào)到腳本層(通過(guò)toString, valueOf, event等等),還是很容易出現(xiàn)沒(méi)處理好而造成UAF等情況的發(fā)生。類似case已經(jīng)在chrome, IE, flash, java等等軟件中多次出現(xiàn),有心的讀者可以去留意一下。事實(shí)上這也是腳本語(yǔ)言漏洞挖掘中的一個(gè)值得切入的點(diǎn)。

漏洞防范

由于Adobe官方已針對(duì)此漏洞發(fā)布了安全更新,用戶只要及時(shí)升級(jí)就可避免受此漏洞影響。


新聞名稱:HackingTeam攻擊代碼分析Part2:Pwn2Own漏洞
當(dāng)前URL:http://www.5511xx.com/article/coesgdc.html