?

Sep 13 2016

Microsoft Windows內核提權漏洞原理分析與利用(CVE-2016-3308 / ZDI-16-453)

首頁 » 業界見聞 » Microsoft Windows內核提權漏洞原理分析與利用(CVE-2016-3308 / ZDI-16-453)   

1.jpg

 

漏洞簡介


漏洞公告相關信息:

ZDI-16-453  CVE-2016-3308

CloverSec Labs成員bear13oy在七月中旬也發現該內核漏洞,由于當時比較忙,本想在八月微軟的補丁周過后再對其進行分析和利用,不巧的是微軟八月份的補丁修復了該漏洞。再次撞洞!

附上當時精簡后的poc代碼截圖:

2.png

3.png

 

 

內核崩潰后棧回溯信息截圖:

4.png

 

漏洞原理


由于函數win32k!xxxInsertMenuItem在處理新增菜單插入時,獲得了錯誤的插入偏移,導致函數在計算MenuItem內核數據長度時發生錯誤,進而在調用memmove移動MenuItem數據時,發生越界操作。

win32k!xxxInsertMenuItem函數在調用memmove移動MenuItem內核數據前,兩次調用函數win32k!MNLookUpItem來獲取相關Item數據的內存地址。在此漏洞中,第一次調用win32k!MNLookUpItem時,由于傳入的wIndex不存在,函數會返回NULL,于是win32k!xxxInsertMenuItem會默認把新Item數據放到原Item數組的末尾,并把wIndex更新為新Item數據在原Item數組中的偏移。相關代碼如下所示:

7.png

在調用AppendMenuA函數后,Menu中的Item數據剛好達到了8個,而由下面的代碼可以看出,內核中Item數據的分配剛好是以8個Item為分配粒度的。于是如下代碼中的pMenu->cItems >= pMenu->cAlloced的條件正好成立,于是win32k!MNLookUpItem會被再次調用,在新分配的Item數據中通過wIndex偏移找到需要插入的內存地址并保存在pItem中。

8.png

然而win32k!MNLookUpItem函數會在所有的Item以及子菜單的Item中遞歸尋找,由于之前已經有7個Item數據存在,在調用InsertMenuA函數后wIndex被改寫為7,而此時由于notepad的第一個File的子菜單中的最后一個Item(Exit)的id正好是7,于是win32k!MNLookUpItem函數遍會把此Item的內核地址返回。之后在計算memmove移動長度時便會出現不可預料的情況,并在移動數據時發生訪問異常。

 

5.png

 

 

漏洞利用


 

漏洞利用主要用到兩個數據結構如下:

10.png

 

 

通過構造數據覆蓋tagPROPLIST中的cEntries和iFirstFree便可以實現對tagPROPLIST結構之后的一段數據進行控制。

漏洞觸發過程中tagPROPLIST在內存中的變化:

11.png

漏洞利用過程大概可以分為如下步驟:

1.  構造數據覆蓋tagPROPLIST中的cEntries和iFirstFree;

2.  通過SetProp函數對tagPROPLIST對分布在其后的tagMENU結構中的cItems和rgItems字段進行控制;

3.  通過SetMenuItemInfo實現對任意地址的寫操作;

4.  改寫內核HalDispatchTable+4的數據實現EIP控制。



漏洞演示


測試環境: Windows 7 SP1 x86 (更新于2016-07-16)

 

如果您喜歡本博客,歡迎點擊圖片定訂閱到郵箱填寫您的郵件地址,訂閱我們的精彩內容:

正文部分到此結束

文章標簽:這篇文章木有標簽

版權聲明:若無特殊注明,本文皆為( mOon )原創,轉載請保留文章出處。

也許喜歡: «SugarCRM 6.5.23 - REST PHP Object Injection漏洞分析 | CVE-2016-6662-MySQL ‘malloc_lib’變量重寫命令執行分析»

你腫么看?

你還可以輸入 250/250 個字

? 微笑 大笑 拽 大哭 親親 流汗 噴血 奸笑 囧 不爽 暈 示愛 害羞 吃驚 驚嘆 愛你 嚇死了 呵呵

評論信息框

這篇文章還沒有收到評論,趕緊來搶沙發吧~

?
?
河北11选5开奖