2017年3月14日,Microsoft发布了安全公告MS17-013,来解决CVE-2017-0005提权漏洞,这是Windows Win32k组件中一个允许提权的漏洞。CVE-2017-0005是一个0day
漏洞,该漏洞利用的目标是旧版本的Windows,并允许攻击者提升进程权限。
在本文中,我们将详细介绍CVE-2017-0005漏洞利用的技术细节,并对发布于2016年8月的Windows10的一周年更新版本中的漏洞防御效果进行评估,例如Supervisor Mode Execution Prevention(SMEP
)和 virtualization-based security(VBS
),这里我们还展示准备发布的Windows Defender Advanced Treat Protection
威胁防护(Windows Defender ATP
)中的Update
更新增强功能如何检测攻击者的特权提升(EoP)活动,,包括与漏洞利用相关的EoP
活动。
经过审查其代码后,我们发现这个oday
EoP
漏洞专门针对运行Windows 7和Windows 8的计算机,这里我们已经搭建好环境了。
攻击包分四个阶段展开:
图1.exploit包的执行阶段和相应的功能
为了保护主要的恶意利用代码,攻击者使用AES-256
算法加密了初始阶段的PE
文件。要加载下一阶段的代码,必须将密码作为参数传递给主输入函数。使用CryptHashData API
,该密码用作解密下一阶段加载程序的密钥。
阶段2作为执行API
解析的中间阶段。这个阶段的API
解析程序类似于shellcode
或position-independent
代码的工作原理。
以下代码显示了GetProcAddress API
解决方案的一部分,这些代码模糊了后续的有效载荷并阻止了分析。
图2.使用EAT遍历找到kernel32!GetProcAddress位置
在第3阶段,攻击包执行环境检查,特别是识别操作系统平台和版本号,攻击者要确保漏洞利用代码在内置缓解较少的系统上运行,特别是Windows 7和Windows 8设备。
图3 .执行环境检查的代码
我们分析漏洞利用代码,揭示了它只在特定的Windows系统版本上运行:
这些版本映射到Windows2000和Windows 8之间的Windows操作系统,除了Windows 8.1和Windows 10版本。此外,在对这些代码体系结构检查例程后,我们发现该漏洞的利用代码主要针对64位系统。
下一阶段的有效载荷通过DLL
反射加载。
对攻击环境检查后,攻击者开始实际利用Windows内核漏洞CVE-2017-0005的代码,导致任意内存损坏和特权代码执行。
PALETTE.pfnGetNearestFromPalentry变种
通过利用PALETTE.pfnGetNearestFromPalentry
函数中损坏的指针,可以在内核空间中执行代码。 Microsoft
安全研究人员一直密切关注这种利用技术,该技术的目的是在内核中执行代码,这些代码由一个格式不正确的PALETTE
对象提供,我们在Duqu
事件的“ Virus Bulletin 2015”演示文稿中也描述了这种相对较旧的漏洞利用技术。
以下代码显示了PALETTE
函数指针的损坏状态:
图4 .PALETTE.pfnGetNearestFromPalentry 变种
漏洞利用代码会调用本机API NtGdiEngBitBlt
来触发使用受损处理程序的win32k!XLATEOBJ_iXlate
函数调用,从而将控制流传递给先前分配的shellcode
。通过比较发现,Duqu 2.0
案例中的漏洞利用代码是使用Gdi32.dll
的GetNearestPaletteIndex
调用来执行传递给损坏的回调处理程序。这个差异清楚地表明,这两个漏洞是无关的,尽管它们的代码及其相似。
漏洞利用动态构建的系统调用代码片段来调用本机Windows API
。
图5.动态构造调用内核函数
在执行shellcode
期间,调用堆栈如下所示:
图6.使用损坏的函数处理程序传递控制流时调用堆栈的示例
一旦shellcode
被执行,漏洞会利用一个常见的令牌交换技术来获得当前进程提升的SYSTEM权限。我们可以经常在类似的EoP
漏洞中观察到这种技术。
图7.令牌交换shellcode
如上面所述,这个0day
攻击并不针对像Windows 10这样的最新系统。如果在Windows 10系统中执行漏洞利用代码来攻击,我们会发现漏洞根本无法运行,它有额外的防御层来防御。
微软安全研究人员已经对PALETTE.pfnGetNearestFromPalentry
作为控制转移点的使用进行了一段时间的跟踪,事实上,这种方法是我们一直在追求的战术缓解。2016年8月,随着Windows 10周年纪念更新,Microsoft发布了可以防止滥用pfnGetNearestFromPalentry
的战术缓解。当调用PALETTE
函数指针时,缓解会检查PALETTE
函数指针的有效性,确保仅调用一组预定义的函数,并防止对结构的任何滥用。
除了上面描述的暂时防御之外,这种漏洞也可以在Windows 10中由SMEP
停止,ASLR
可以在Windows内核64位的改进以及virtualization-based security (VBS
)中停止。
自Windows 8以来就采用了较新的SMEP
的Intel CPU
支持的Strategic
缓解功能。
使用SMEP
,页表项(PTE
)作为User/Superviso(U / S)标志,指定页面处于用户模式或内核模式。如果从内核模式代码调用用户模式页面,SMEP
将会访问冲突,并且系统触发错误检查,停止代码执行并报告安全冲突。这种机制大致上停止了使用用户模式分配的可执行页面在内核模式下运行shellcode的尝试,这是EoP
漏洞利用的常用方法。
图8.SMEP捕获攻击尝试
像SMEP
这样的预防技术可以立即使数百个EoP
漏洞利用无效,从而有效地提高攻击者的难度,包括直接从内核调用shellcode
的老式利用方法,例如CVE-2017-0005。
要检查计算机是否支持SMEP
,可以使用Coreinfo
工具。该工具会使用CPUID
指令来显示要支持该功能的处理器和平台。Windows 8及更高版本都支持SMEP
。下图显示被测CPU
支持SMEP
。
图9.Coreinfo显示是否启用了SMEP
虽然攻击者正在努力地绕过SMEP
来创建更复杂的攻击办法,但我们从安全会议上分享的研究和记录的事件中知道可能有绕过SMEP缓解的方法。这些旁路机制包括使用内核ROP
小配件或通过读写(RW)原语进行直接PTE
修改。为了回应这些可以预见的开发技术的发展,微软为Windows 10周年提供更新Windows内核64位ASLR改进,并让SMEP
拥有强大的随机内核地址,减轻了直接PTE
损坏导致的旁路向量。
图10.Windows内核64位ASLR改进
基于虚拟化的安全性(Virtualization Based Security,VBS)增强功能为内核中对执行恶意代码的尝试提供了另一层保护,例如,Device Guard阻止内核内存中非签名区域的代码执行,包括内核EoP
代码。Device Guard中的增强功能还可以保护关键的MSR
,控制寄存器和描述符表寄存器。CR4
控制寄存器位域的未经授权的修改,包括SMEP字段,将立即被阻止。
随着即将到来的Creators Update
版本,Windows Defender ATP将能够通过CR4
注册修改来检测SMEP
旁路的尝试。Windows Defender ATP将监视CR4.SMEP位的状态并报告它不一致的。除此之外,Windows Defender ATP将通过监视进程结构的令牌字段的状态来检测令牌交换尝试。
下图显示Windows Defender ATP捕获利用代码执行令牌交换技术来提升权限。
图11.在Windows Defender ATP上检测令牌交换技术
CVE-2017-0005的0day漏洞剥离了较新的系统,因为它被停止了,只能设法获得不必要的曝光。攻击者不太注重传统的系统,而是避免了现代硬件和Windows 10周年纪念更新等当前平台中的安全性增强。虽然修补程序继续为特定漏洞提供单点修复,但攻击者的行为强调了内置的漏洞利益减轻措施,如SMEP
,ASLR
改进和基于virtualization-based security(VBS)是如何提供弹性。
具有更新的Windows Defender ATP – 现在可用于公开预览,通过检测端点上的漏洞利用行为进一步防御。随着即将到来的增强功能,Windows Defender ATP可以提高警报,以便SecOps
人员立即意识到EoP
活动,并可以做出相应的响应。可以阅读我们上一篇关于发现跨进程注入的文章,以了解有关Windows Defender ATP如何检测复杂的违规活动的更多信息。
除了加强EoP
漏洞的通用检测之外,微软安全研究人员正在积极收集归属于ZIRCONIUM
的威胁情报和指标,ZIRCONIUM
是使用CVE-2017-0005
漏洞利用的活动组织。Windows Defender ATP内置于Windows 10 Enterprise的核心。
*参考:technet.microsoft,