导语:4月14日,一个自称 Shadow Brokers的团体通过发布了一套武器化的攻击套件引起了安全界的关注。此后不久,其中一个漏洞被用来创建蠕虫恶意软件,我们现在将其称为WannaCrypt……
4月14日,一个自称 Shadow Brokers的团体通过发布了一套武器化的攻击套件引起了安全界的关注。此后不久,其中一个漏洞被用来创建蠕虫恶意软件,我们现在将其称为WannaCrypt,该恶意软件的目标是那些大量的过时的Windows系统,并掌握了需要赎金才能解密的加密文件。
尽管这些漏洞在较新的平台上无效,或是尝试在已经修补过该漏洞的系统中利用,但是它们仍然提供了一个机会来分析和评估在Windows 10系统上的创建者更新所使用的开发技术是否仍然可行。
在Windows 10中,使用Device Guard提供的关键安全增强功能(如内核地址空间布局随机化(kASLR)),内核数据执行保护(DEP)和基于虚拟化的安全性(VBS)的功能都有助于打破野外发现的漏洞利用技术。通过VBS使用CPU管理程序功能,启用Device Guard的系统可以验证和强制映射到内核地址空间中的代码的完整性。Device Guard是一个与Windows 10 Creators Update一起推出的新内核Control Flow Guard(kCFG)。kCFG可以防止许多依赖于破坏函数指针的开发技术来实现代码执行。
在本文中,我们对Shadow Brokers发布的两个漏洞进行了深入的分析。这两个漏洞都允许通过服务器消息块(SMBv1)文件共享服务器实现中的漏洞进行任意代码执行。
我们会继续讨论Device Guard和kCFG是如何防止这些漏洞(以及许多其他漏洞)从内核内存中安装后门的。
漏洞套件
该工具包的目录结构显示了一个模块化的开发框架,其中有效负载与漏洞利用程序是分开放的。
图1. Exploit工具包目录结构
套件中的所有二进制文件都包含了描述其目的的多个字符串。此外,该工具包将通用功能导出到了DLL文件,通过引用的函数名称显示其他信息。虽然字符串和函数的调用对我们检查该工具包来说是没有必要的,但是这两块的分析有助于加快们的初步分析过程。
有关针对Microsoft产品的工具包中的各个漏洞的更多信息,请参阅Microsoft安全响应中心的博客文章。
ETERNALROMANCE SMB漏洞利用
我们先来挖一下套件中的一个漏洞的内脏。
ETERNALROMANCE是针对传统SMBv1文件共享协议的远程代码执行(RCE)漏洞。它利用了已经使用MS17-010安全公告修补的CVE-2017-0145。可能大家会注意到,SMB上的文件共享通常仅在本地网络中使用,并且SMB端口通常在防火墙上是从阻止与互联网连通的。然而,如果攻击者可以访问到运行着有漏洞的SMB的端点,那么从远程位置在内核上下文中运行任意代码的能力将是一个严重的安全问题。
这个漏洞是为了远程安装和启动SMB后门。这个漏洞的核心是一种类型混淆的漏洞,导致攻击者的偏移可以控制任意堆的写入。与几乎任何heap corruption 漏洞利用一样,攻击者必须知道或控制堆的布局,以便始终如一地能够成功利用漏洞。在SMB中,大多数对象都在非分页的池中分配的。
获得可靠的堆布局
该漏洞开始通过启动多个并发的SMB_ COM_TRANSACTION实例来进行堆喷射。漏洞利用二进制文件支持三种不同的堆喷射方法,可以在Windows版本之间处理不同的池的行为。除了前几个分配(确切的数量取决于池的状态)之外,事务对象被分配到具有彼此固定的,可预测的位移中。喷射完成后,该漏洞又利用了TRANS_PEEK_NMPIPE事务中的信息泄漏。它使用信息泄漏来确定目标是运行着32位还是64位版本的Windows,并获取各种SMB对象的内核指针。
网络跟踪可以快速的展示到底发生了什么:
图2.包含了泄露的池的内存的网络数据包
从heap corruption中构建原语
喷射的过程将许多TRANSACTION对象放在堆上的彼此已知的位移中。而且因为漏洞利用了指针的大小,所以它知道TRANSACTION对象中所有字段的偏移量。现在就可以使用精心构造的偏移量 —— 从一个对象使用类型混淆越界写入来损坏相邻的对象来进一步进行漏洞利用。
通过使用硬编码的数字(零)覆盖与受损对象相关联的ID,现在可以在不知道原始ID的情况下引用该对象。
图3.喷射后的堆布局
漏洞利用各种方式破坏事务结构,构建任意的读写(RW)原语。它写入其他字段以防止在消费时释放事务,从而允许漏洞利用多个请求重新使用相同的事务,而无需选择新的目标对象进行破坏。
图4.在WinDbg中观察到的InData指针被堆越界写入
安装内存后门
此时,漏洞利用代码试图在SMB驱动程序中生成后门代码。此步骤包括将shellcode复制到非分页池中,破坏函数指针以指向shellcode并执行该函数指针。请注意,从Windows 8开始,SMB已经转移到使用非可执行的池,使得此方法在较新的平台上无效。
为了找到一个不错的函数指针,漏洞利用了一个指向堆的指针来达到数据段。扫描数据段时,它继续查找用于将不同的SMB_COM_TRANSACTION2 子命令分派到不同功能的函数指针表中。
当它找到函数指针表时,该漏洞将覆盖此表上的第14个条目,该条目对应于TRANS2_SESSION_SETUP子命令。MSDN文档将此子命令描述为保留位,使其成为触发后门的理想选择,因为它几乎不存在于SMB流量中。
每当一个SMB数据包被发送到目标设备的这个子命令ID时,函数指针就会被执行,从而触发shellcode的执行。这种机制和后门代码并不是持久的 – 他们需要一个持久的第二阶段的组件来重新启动。
图5.用于种植后门的反编译代码
ETERNALBLUE SMB漏洞利用
WannaCrypt恶意软件通过使用适配版本的ETERNALBLUE漏洞利用进行传播。这个针对不同的SMBv1漏洞的错误是池中的线性缓冲区溢出导致的。
当将扩展属性(EA)的列表从一种格式转换为另一种格式时,该特殊情况就会发生。如果列表包含了超出包缓冲区的EA条目,则列表将被截断,就好像只包含了最后一个有效条目一样。
当更新列表的长度时,大小会被写入,就像它是一个16位的ushort类型,但它实际上是一个32位的ulong类型。这意味着当列表被截断时,高16位是不会被更新的:
图6.扩展属性(EA)列表的大小
代码分配了一个缓冲区,其大小被计算为所有EA条目到截断的大小。但是随着列表大小的增加,这导致了攻击者控制数据的线性堆就发生了溢出。
与上述之前类似的方式一样,发生了堆喷射,但这次使用了SMBv2协议中使用的srvnet!SRVBUFFER对象。该对象包含两个目标指针:一个接收网络数据包有效负载的MDL指针和一个指向srvnet!SRVNET_CONNECTION对象的指针。这两个指针都被覆盖了,以便它们可以指向HAL区域中的固定地址(由硬件抽象层使用)。
由于MDL指针已经损坏,下一个数据包有效负载将被写入到HAL区域。这个有效载荷包含了shellcode并初始化了一个假的srvnet!SRVNET_CONNECTION对象的内存结构。连接对象有一个指向srvnet的指针!SRVNET_CLIENT_CONNECTION_DISPATCH的结构包含了函数指针。
收到数据包有效载荷后,SRVNET_RECEIVE_HANDLER函数指针从攻击者控制的srvnet执行!SRVNET_CLIENT_CONNECTION_DISPATCH结构,最后跳转到shellcode。
Windows 7是攻击目标的主要系统,HAL区域被映射为可读,可写和可执行。在较新的系统上,HAL区域不再是可执行的,这意味着在尝试执行shellcode时CPU会出错。此外,HAL区域和其他内核区域(如页表)已经在最新的64位版本的Windows 10上进行了随机化,从而打破了ETERNALBLUE漏洞在64位版本中利用的假设。
图7.使用假的srvnet!SRVNET_CONNECTION对象注释HAL区域的内容
使用基于虚拟化的安全性进行缓解
Windows 10提供的基于虚拟化的安全性(VBS)和带有创建者更新功能的kCFG增强功能阻止了常见的利用技术,包括ETERNALROMANCE和ETERNALBLUE所使用的技术。
停止使用强制W ^ X的shellcode的执行
在启用了Device Guard VBS的系统上,由于管理程序中的W ^ X强制策略,因此无法在内核中写入并执行shellcode(例如ETERNALROMANCE后门)。这些策略确保内核内存页面在任何给定的时间都不会是可写和可执行的。
即使攻击者试图攻击页表,管理程序仍然可以通过扩展页表(EPT)强制执行禁用标志位。这反过来迫使攻击者依赖代码重用方法,如返回语句编程(ROP)。因此,Shadow Brokers版本中的shellcode植入库与VBS保护的系统基本不兼容。
防止使用带kCFG的损坏函数指针
在Windows 10 Creators Update中,我们在支持VBS的系统的内核空间中引入了新的安全缓解措施。内核现在使用Control Flow Guard(CFG)进行编译- 控制流完整性解决方案旨在防止依赖于损坏函数指针或C ++虚拟方法表的常见堆栈转换技术。
编译内核(也称为kCFG)中的Control Flow Guard 的目的是在调用它们之前验证所有间接的调用目标。这使得攻击者更难以通过滥用函数指针或其他间接调用来执行代码。
在ETERNALROMANCE利用的情况下,破坏的函数指针将在调用时导致安全性错误,从而使漏洞在利用其当前形式时不起作用。这同样适用于ETERNALBLUE,它也依赖于损坏的函数指针来实现代码执行。
图8.启用kCFG后,函数指针现在由__guard_dispatch_icall_ptr验证
在早期的Windows 10系统上,在创建者更新之前以及没有Device Guard时,可以攻击HAL区域的页表,使其可执行,并使用ETERNALBLUE漏洞利用技术获取代码执行。
使用Windows 10创建者更新进行安全计算
虽然我们积极的为诸如SMBv1之类的服务中的漏洞提供了修补程序,但我们力求提供越来越多的全系统缓解措施,主动保护用户免受当前以及未来的漏洞利用和攻击。
运行Windows 10 Creators Update的客户将受益于Device Guard和安全增强功能,如kCFG和W ^ X。他们还受益于Windows 10创新者更新加强了许多其他安全功能,其中包括:
1. Windows Defender Antivirus端点反恶意软件保护,由 Microsoft Intelligent Security Graph提供支持,Intelligent Security Graph可从全球数十亿台设备中进行学习。
2. Windows Defender高级威胁防护(Windows Defender ATP)使企业能够及早发现违规活动并快速响应; 使用Windows 10 Enterprise可以免费试用。
3. Microsoft Edge是通过虚拟化和Windows Defender SmartScreen保护的经过验证的快速浏览器。
减少对旧版平台上的SMBv1漏洞的利用
Microsoft强烈建议客户及时应用所有可用的安全更新。要减少网络上的攻击面,请阻止防火墙上的入站SMB流量,如果可能,禁用SMBv1兼容性驱动程序。
Viktor Brange
Windows防御安全研究团队