【技术分析】如何检测及防护基于CVE-2017-0005漏洞的权限提升攻击

https://p5.ssl.qhimg.com/t01f5e96f0b88a43189.jpg

译者:興趣使然的小胃

预估稿费:200RMB

投稿方式:发送邮件至linwei#360.cn,或登陆网页版在线投稿


一、前言

2017年3月14日,微软公布了安全公告MS17-013,修复了CVE-2017-0005漏洞。CVE-2017-0005漏洞位于Windows Win32k组件中,攻击者利用该漏洞可能实现权限提升。根据合作伙伴的可信报告,我们发现了该漏洞的零日(zero-day)利用方法。漏洞利用的目标系统为老版本的Windows系统,攻击者可借此在目标系统上提升进程权限。

在本文中,我们详细分析了漏洞利用方法的技术细节,评估了Windows 10周年更新版(于2016年8月份发布)对漏洞的防御效果,同时也评估了一些缓解措施的效果,比如SMEP(Supervisor Mode Execution Prevention,管理模式执行保护)以及VBS(virtualization-based security,基于虚拟化的安全)。此外,我们也展示了Windows在创造者更新(Creators Update)中带来的Windows Defender ATP(Windows Defender Advanced Threat Protection)的增强功能,Windows Defender ATP可以检测攻击者实施的权限提升(elevation-of-privilege,EoP)攻击行为,自然也能检测与该漏洞有关的权限提升攻击行为。


二、权限提升攻击细节

经过对漏洞利用代码的审计分析后,我们发现此次EoP攻击的目标为运行Windows 7以及Windows 8的主机。攻击者精心构造了利用工具,避免其运行在较新的平台上。

漏洞利用工具的执行过程中的各个阶段以及对应的函数如图1所示。

https://p1.ssl.qhimg.com/t01af2df6aeaa0358c2.png

2.1 阶段1&2:解密器以及API解析器

为了保护主功能代码,攻击者使用AES-256算法对初始阶段的PE文件进行加密。为了加载下一阶段的代码,程序需要将某个密码作为参数传递给主入口函数。代码中使用了CryptHashData这个API,将传入的密码作为密钥来解密下一阶段的载荷。

第2阶段充当了一个中间阶段的角色,这个阶段用来解析API函数。这一阶段所做的API解析工作与shellcode或者位置无关(position-independent)代码的运行过程类似。

GetProcAddress API解析过程的部分代码如下所示。这部分代码似乎会混淆后续的载荷,阻止对其的安全分析。

https://p1.ssl.qhimg.com/t013f104476be4b3ef8.png

2.3 阶段3:避免在新平台上运行

在阶段3中,利用工具会执行一些环境检查过程,特别是会检查操作系统平台以及具体的版本信息。攻击者借此确保漏洞利用代码运行在存在漏洞的系统上(具体说来,这些系统为Windows 7以及Windows 8),它们较少启用对应的漏洞防护功能。

https://p0.ssl.qhimg.com/t01a7971558cc588bb9.png

从代码中我们可知,工具专门针对特定版本的Windows系统研发,具体版本为:

主版本号(Major release version)为5;

主版本号为6,次版本号(minor version)为0、1或者2。

这些版本对应的是Windows 2000以及Windows 8之间的Windows操作系统,其中不包含Windows 8.1以及Windows 10。此外,仔细研究其中的系统架构检查代码后,我们发现漏洞利用代码针对的是64位操作系统。

下一阶段的载荷通过DLL反射技术完成加载。

2.4 阶段4:漏洞利用程序

环境检查通过后,攻击代码开始真正利用CVE-2017-0005这个Windows内核漏洞,最终造成内存崩溃,实现代码权限提升目的。

通过破坏PALETTE.pfnGetNearestFromPalentry中的一个指针,程序可以实现内存空间中的代码执行。微软安全研究员一直在密切跟踪这种利用技术,这种技术可以通过精心构造的PALETTE对象实现在内核中执行代码。此前我们在Duqu安全事件的一个样本中观察到这种漏洞利用技术,并于Virus Bulletin 2015的演讲中介绍过这种技术。

如下代码片段中,我们可以看到PALETTE函数指针处于损坏状态:

https://p4.ssl.qhimg.com/t013ecb31cfaf545cbe.png

漏洞利用代码调用NtGdiEngBitBlt这个原生API来触发win32k!XLATEOBJ_iXlate函数,后者使用了已损坏的那个处理函数。这样一来,控制流就会传递给之前已分配的一段shellcode。相对比而言,Duqu 2.0中的漏洞利用代码使用了Gdi32.dll中的GetNearestPaletteIndex函数,以便将程序执行权传递给损坏的回调处理函数。虽然这两个漏洞利用代码在某些地方有些相似,但根据这个不同点,我们可以判定这两个漏洞利用代码并不相关,此类漏洞利用技术有非常翔实的参考文档,因此也能解释这两段利用代码的相似性。

漏洞利用代码使用动态创建的系统调用(syscall)代码片段来调用原生的Windows API,如下所示。

https://p1.ssl.qhimg.com/t01f78020f271084a4b.png

shellcode执行期间的调用栈如下所示:

https://p2.ssl.qhimg.com/t013b4d3776769a0492.png

shellcode执行后,利用程序会使用一种常见的令牌交换(token-swapping)技术来将当前进程的权限提升到SYSTEM权限。在类似的EoP漏洞利用中我们经常可以看到这种技术。

https://p4.ssl.qhimg.com/t01e97f2e6d4da00375.png

三、防护及检测方法

前面提到过,这个零日漏洞利用程序没有针对诸如Windows 10之类的较新的系统。如果环境检查过程通过,那么漏洞利用代码就会在目标系统中执行,根据我们的测试结果,我们发现如果系统部署了其他的防护机制,那么漏洞利用程序就无法执行全部代码。我们可以分析一下这两种防护技术,一种是中期的防护方法,也可以称之为战术级防护方法,旨在打破漏洞利用的执行过程,另一种是长期的防护方法,也可以称之为战略级防护方法,旨在完全消除漏洞,阻止漏洞利用。

3.1 战术级防护:阻止程序滥用pfnGetNearestFromPalentry

漏洞利用代码中利用PALETTE.pfnGetNearestFromPalentry作为控制权传送点,微软安全研究员对这种技术已经跟踪了一段时间。事实上,我们一直在研究针对这种技术的战术级防护方法。2016年8月,在发布Windows 10周年更新版的同时,微软公布了一种战术级防护机制,目的在于防止程序滥用pfnGetNearestFromPalentry。当PALETTE函数指针被调用时,这种防护机制会检查函数指针的有效性,确保只有预定义的一组函数会被调用,防止相应的结构体被滥用。

3.2 战略级防护

除了上面描述的战术级防护机制外,Windows 10在64位内核中引入了SMEP、ASLR增强特性,也引入了基于虚拟化的安全(virtualization-based security,VBS)机制,可以阻止漏洞利用过程。

3.2.1 管理模式执行保护

SMEP(Supervisor Mode Execution Prevention,管理模式执行保护)是一种战略级防护特性,新版的Intel CPU支持这一功能,自Windows 8以来,微软也引入了这种安全特性。

启用SMEP特性后,页表项(page table entry,PTE)中的标志位作为用户/管理员(U/S)标志,可以指定页面处于用户模式或者内核模式。如果内核模式代码调用了某个用户模式页面,SMEP就会产生访问冲突,系统会触发错误检查过程,停止代码执行过程并报告安全冲突。这种机制可以阻止利用用户模式分配的可执行页面来运行内核模式下的shellcode,而这种运行机制是EoP漏洞利用程序常用的方法。

t0129238f0cb12fb5c2.png

类似SMEP之类的战略级防护措施可以导致数以百计的EoP漏洞利用代码无效,从而显著提高攻击者的技术门槛,这类漏洞利用代码中不乏从内核态直接调用用户态shellcode的老式漏洞利用方法,如本文分析的CVE-2017-0005漏洞利用技术。

我们可以使用Coreinfo这个工具来判断主机是否支持SMEP特性。该工具使用CPUID指令,在输出结果中显示支持SMEP特性的CPU以及平台。如下图所示,从工具的执行结果中,我们可知正在测试的CPU支持SMEP。Windows 8以及更高版本的Windows系统支持SMEP特性。

https://p4.ssl.qhimg.com/t014ea40c90a438d979.png

3.2.2 Windows内核64位ASLR增强特性

启用SMEP后,虽然攻击者被迫使用更为复杂的漏洞利用代码才能实施攻击行为,但根据安全会议以及安全事件中分享的技术方法,我们的确了解到有多种方法可能绕过SMEP保护机制。如使用内核ROP工具或者通过读写(RW)方法直接修改PTE都可以实现绕过目的。为了应对漏洞利用中不断出现的新技术,微软在Windows 10周年更新版中提供了Windows内核64位ASLR增强特性,通过随机化的内核地址增强了SMEP功能,避免基于直接修改PTE实现的漏洞利用技术。

t01d8320311b0e4454e.png

3.2.3 基于虚拟化的安全

VBS(virtualization-based security,基于虚拟化的安全)增强特性可以从另一个角度来防止内核中执行恶意代码。比如,设备保护(Device Guard)会阻止执行内核内存未签名区域中的代码,当然也会阻止内核EoP代码的执行。设备保护中的增强功能也可以保护MSR、控制寄存器以及描述符表寄存器(descriptor table registers)。这样一来,对CR4控制寄存器(包括SMEP区域的数据)未授权的修改会被立即阻止。

3.3 Windows Defender ATP功能

在创造者更新版系统中,Windows Defender ATP可以检测通过修改CR4寄存器实现的SMEP攻击技术。Windows Defender ATP可以监控CR4.SMEP标志,一旦出现不一致就会报告相应情况。此外,Windows Defender ATP可以监控进程结构中的令牌区域状态,以检测令牌交换攻击。

t01575d9622b54f2719.png


四、总结

在较新的系统中,本文分析的CVE-2017-0005漏洞利用代码会直接停止工作,以避免引起用户警觉,因此这些系统不会受到该工具影响。攻击者没有特别去关注老版本的系统,但有意识地在规避新的硬件以及操作系统平台(如Windows 10周年更新版)中所使用的安全增强特性。虽然我们一直在针对特定的漏洞来发布特定的补丁,但从本文对攻击者行为的分析来看,系统内置的防御机制(如SMEP、ASLR增强机制以及VBS机制)可以提供一种弹性的防御屏障。

与创造者更新版一起发布的Windows Defender ATP(公众预览版)能够检测端点上的漏洞利用行为,进一步扩展了这种防御屏障。在即将发布的增强特性中,Windows Defender ATP可以发布安全警报,以便安全操作人员第一时间察觉EoP攻击行为,采取对应的响应动作。大家可以阅读我们之前发表的分析跨进程注入技术的文章,进一步了解Windows Defender ATP如何检测复杂的攻击行为。

除了加强对EoP利用技术的通用检测方法之外,微软安全研究员同时也在积极收集属于ZIRCONIUM的威胁情报以及特征信息,这一组织正是使用CVE-2017-0005漏洞利用技术的组织。我们会向Windows Defender ATP客户推送综合威胁情报,分析正在活跃的攻击组织以及他们的攻击方法。

Windows 10企业版中集成了Windows Defender ATP,大家可以免费试用

(完)