导语:CVE-2017-0005是一个零日漏洞问题,目前正被滥用,使用Silverlight作为攻击向量的漏洞利用工具包可以很快将该漏洞引入。
2017年3月14日,Microsoft发布了安全公告MS17-013,旨在解决CVE-2017-0005提权漏洞,Qualys漏洞实验室主任Amol Sarwate表示:“CVE-2017-0005是一个零日漏洞问题,目前正被滥用,使用Silverlight作为攻击向量的漏洞利用工具包可以很快将该漏洞引入。”
在本文中,我们将详细介绍CVE-2017-0005漏洞利用的技术细节,并对2016年8月发布的Win10的一周年更新版中的漏洞防御效果进行评估,例如Supervisor Mode Execution Prevention(SMEP)和基于虚拟化的安全性(VBS),另外我们还展示了Windows Defender Advanced Treat Protection(高级威胁防护)对权限提升(EoP)漏洞的检测和防护。
零日权限漏洞攻击(Zero-day elevation-of-privilege exploit)
在查看其代码后,我们发现这个零日权限漏洞专门针对运行Windows 7和Windows 8的计算机。攻击包分四个阶段展开:
阶段1和阶段2的任务:解密和API解析
为了保护恶意代码的利用,攻击者使用AES-256算法加密了初始阶段的PE文件。要加载下一阶段的代码,必须将密码作为参数传递给主输入函数。使用CryptHashData API,该密码用作解密下一阶段加载程序的密钥。
阶段2作为执行API解析的中间阶段。这个阶段的API解析程序类似于shellcode或position-independent代码的工作原理。
以下代码显示了GetProcAddress API解决方案的一部分,这些代码似乎模糊了后续的有效载荷并阻止了相关的分析。
阶段3:寻找合适的攻击平台
在第3阶段,攻击包会执行环境检查,特别是识别操作系统平台和版本号,攻击者这样做是为了确保漏洞利用代码是在内置缓解较少且易受攻击的系统上运行,目前只有Windows 7和Windows 8符合对应的攻击条件。
通过对漏洞代码的分析,我们确定了这些代码只在特定的Windows系统版本上运行,目前符合这些代码的运行版本包括了Windows 2000到Windows 8之间的Windows操作系统,但是Windows 8.1和Windows 10除外,此外,在对这些代码的体系结构的检例程进行检查后,我们发现这些代码专门针对64位系统。下一阶段的有效载荷会通过DLL反射加载。
阶段4 :利用CVE-2017-0005漏洞开始攻击
在对攻击环境进行检查后,攻击者代码开始实际利用Windows内核漏洞CVE-2017-0005,实施任意内存损坏和特权代码执行。
PALETTE.pfnGetNearestFromPalentry开始变异,通过利用PALETTE.pfnGetNearestFromPalentry函数中损坏的指针,可以在内核空间中执行代码。 Microsoft安全研究人员一直密切关注这种利用技术,该技术的目的是在内核中执行代码,这些代码由一个格式错误的PALETTE对象提供,我们原来在对Duqu木马进行分析时也发现了类似的攻击技术。
下图显示了PALETTE函数指针的损坏状态:
恶意代码会调用本机API NtGdiEngBitBlt来触发使用受损处理程序的XLATEOBJ_iXlate函数调用,从而将控制流传递给先前分配的shellcode。我们通过比较发现,Duqu 2.0木马中的漏洞利用代码是使用Gdi32.dll的GetNearestPaletteIndex调用来执行传递给损坏的回调处理程序。这个差异清楚地表明,这两个漏洞是无关的,尽管它们的代码及其相似。
漏洞利用动态构建的系统调用代码片段来调用本机Windows API。
在执行shellcode期间,调用如下所示的堆栈:
一旦shellcode开始执行,漏洞就会利用一个常见的令牌交换技术来获得当前进程的SYSTEM提权权限,我们经常会在类似的EoP漏洞中观察到这种技术:
检测和缓解的解决方案
如前所述,这个零日攻击并不针对像Windows 10这样的最新系统。如果我们在Windows 10这样的系统中来模拟代码的攻击环境,则漏洞根本无法运行。
缓解漏洞有两个方案,一个是制定一种缓解措施来最大程度的减低攻击效果,另一种是研发一种消除所有漏洞的技术,从根本上来阻止。
我们先来看看第一种方案,预防pfnGetNearestFromPalentry滥用,微软安全研究人员已经对PALETTE.pfnGetNearestFromPalentry的使用进行了一段时间的跟踪。2016年8月,随着Windows 10更新版的发布,Microsoft发布了旨在防止滥用pfnGetNearestFromPalentry的漏洞预防方案。当调用PALETTE函数指针时,预防方案就会检查PALETTE函数指针的有效性,确保仅调用一组预定义的函数,并防止对结构的任何滥用。
我们再来看看第二种方案,这个零日漏洞也可以在Windows 10中被SMEP禁止而且Windows 10周年更新版64位中对ASLR也进行了对应的改进。
管理模式执行保护(SMEP):SMEP是Intel CPU自Windows 8以来,采用的最新的漏洞预防技术。
使用SMEP,页表项(PTE)中的R/W标志表示读/写,如果是0,页面就是只读的。U/S标志表示用户/管理员,如果是0,则这个页面只能被内核访问。这些标志用于实现只读内存和保护内核空间。如果从内核模式代码调用用户模式页面,SMEP将生成访问冲突,并且系统触发错误检查,停止代码执行并报告安全冲突。这种机制会中断可执行页面在内核模式下运行shellcode的尝试(这是EoP攻击的常用方法)。
像SMEP这样的预防技术可以立即使数百个EoP漏洞立马变得无效,从而有效地提高系统的安全性,这其中就包括直接从内核调用shellcode的老式攻击方法,例如CVE-2017-0005。
要检查计算机是否支持SMEP,可以使用Coreinfo工具。该工具会使用CPUID指令来显示应支持该功能的处理器和平台。下图就是一张测试结果图,不过要说明一下,Windows 8及更高版本都支持SMEP。
Windows 10周年更新版64位中对ASLR进行了改进:
虽然攻击者正在努力地研究绕过SMEP来寻求更复杂的攻击办法,但我们已经了解到Windows 10周年更新版中已经对这些攻击手段做了提前预防。比如有攻击者已经采用了内核ROP攻击技术来破坏PTE(页表入口点)来令SMEP失效,为此微软在Windows 10周年更新版64位中对ASLR进行了改进,并使SMEP具备了更加强大的随机内核地址,从而缓解了PTE被破坏而导致的攻击。
基于虚拟化的安全性(VBS):基于虚拟化的安全(Virtualization Based Security,VBS)是Microsoft Windows的主要安全特色,随Windows 10和Windows Server 2016一起提供。例如,DeviceGuard和CredentialGuard都依赖它。对于那些不知道Windows 10的这两个关键的安全创新,DeviceGuard允许系统阻止任何东西,包括受信任的应用。对于CredentialGuard,它允许系统隔离lsass.exe进程,以阻止密码收集器(如Mimikatz)的内存读取尝试。
这个新功能的主要思想是使用硬件虚拟化技术,如Intel VT-X,以便在两个虚拟机之间提供强大的隔离,并且,在将来可能会更多。这些技术允许虚拟机管理器使用扩展页表在物理页上设置不同的权限。换句话说,虚拟机可以在其页表项中设置物理页可写(+W),并且虚拟机管理器可以通过在其扩展页表中设置适当的访问权限来静默地授权或阻止这一点。
Windows Defender ATP检测:Windows Defender ATP在现有的Win10安全防护基础上,提供额外的保护层。通过深入内置在Win10系统和有力的云服务,帮助抵御更多威胁,为企业提供防护建议。
Windows Defender ATP将通过监控进程结构的令牌字段的状态来检测令牌交换尝试。下图显示了Windows Defender ATP所捕获的利用代码执行令牌交换技术来提升权限的恶意进程。