Windows 10 CVE-2020-0796 SMBv3错误曝光!远程代码执行漏洞分析与复现

天地和兴研究院 天地和兴 昨天



编者按


CVE-2020-0796是Windows 10 1903/1909的新SMB3压缩功能中的错误。SMB 3.1.1协议中处理压缩消息时,对其中数据没有经过安全检查,直接使用会引发内存破坏漏洞,可能导致系统崩溃、拒绝服务,或者可能被用于远程代码执行,未经防护的目标系统很有可能被入侵。在工控系统中,多数操作站、上位机乃至SCADA系统都运行着windows系统,一旦攻击者通过各种攻击手段接触到工控系统内部,多数系统与设备会受到威胁。


1 概述


微软SMBv3远程代码执行漏洞CVE-2020-0796[1](SMB 3.1.1协议中处理压缩消息时,对其中数据没有经过安全检查,直接使用会引发内存破坏漏洞,可能被攻击者利用远程执行任意代码)可被攻击者利用,实现无须权限即可执行远程代码,未经防护的目标系统很有可能被入侵。该漏洞严重程度接近永恒之蓝漏洞,攻击者可以对直接连接到Internet的工控设备与系统发动攻击;同时存在被WannaCry等勒索蠕虫利用的可能,即使是与外部网络隔离的工控网络也可能通过移动介质等渠道感染恶意代码并扩散


2 漏洞情况


CVE-2020-0796是Windows 10 1903/1909的新SMB3压缩功能中的错误。SMB协议版本3.1.1引入了一种功能,即客户端或服务器可以发布压缩功能,并有选择地压缩SMB3消息。为此,在协商SMB会话时,客户端和服务器都必须包含SMB2_COMPRESSION_CAPABILITIES参数[2]
使用此功能协商会话后,客户端或服务器可以选择压缩某些SMB消息。为此,整个SMB包会被压缩,并且生成的文件头会被前置[3]。此标头是一个小的(16字节)结构,具有魔术值,未压缩的数据大小,使用的压缩算法和偏移值。

CVE-2020-0796是由该偏移量大小中缺少边界检查导致的,该偏移量大小会被直接传递给多个子例程。传入较大的值将导致缓冲区溢出,并使内核崩溃。通过进一步的工作,可以将其开发为远程代码执行类型的漏洞利用程序。



图 2-1 CVSS 评分[4]



2.1 披露时间


  • 2020年3月10日是微软补丁日,我们注意到Microsoft发布并立即删除了有关CVE-2020-0796的信息;
  • 2020年3月11日早上,Microsoft发布了可纠正SMBv3协议如何处理特制请求的修补程序;
  • 2020年03月12日微软发布安全公告声称Microsoft 服务器消息块 3.1.1 (SMBv3) 协议处理某些请求的方式中存在远程执行代码漏洞,并发布了安全更新补丁。成功利用此漏洞的攻击者可以获取在目标服务器或客户端上执行代码的能力。要利用针对服务器的漏洞,未经身份验证的攻击者可以将特制数据包发送到目标 SMBv3 服务器。要利用针对客户端的漏洞,未经身份验证的攻击者将需要配置恶意的 SMBv3 服务器,并说服用户连接到该服务器。此安全更新通过更正 SMBv3 协议处理这些特制请求的方式来修复此漏洞;
  • 其后Kryptos Logic安全人员发布了DoS漏洞利用,之后又有许多研究人员发布了该漏洞LPE版本的PoC;
  • 2020年04月20日Ricerca Security研究人员发布了该漏洞的RCE利用视频,并宣布RCE利用程序将提供给其客户使用;
  • 目前暂无成功利用该漏洞的威胁情报信息。


2.2 漏洞影响版本


该漏洞不影响Windows7,而是影响Windows10 1903之后的32位、64位Windows版本,包括家用版、专业版、企业版、教育版。具体列表如下:
  • Windows 10 Version 1903 for 32-bit Systems
  • Windows 10 Version 1903 for x64-based Systems
  • Windows 10 Version 1903 for ARM64-based Systems
  • Windows Server, Version 1903 (Server Core installation)
  • Windows 10 Version 1909 for 32-bit Systems
  • Windows 10 Version 1909 for x64-based Systems
  • Windows 10 Version 1909 for ARM64-based Systems
  • Windows Server, Version 1909 (Server Core installation)


2.3 漏洞影响范围


在工控系统中,多数操作站、上位机乃至SCADA系统都运行着windows系统,一旦攻击者通过各种攻击手段接触到工控系统内部,多数系统与设备会受到威胁。


3 漏洞原理及复现过程


3.1 漏洞原理


srv2.sys中的Srv2DecompressData函数中存在一个整数溢出错误。当SMB服务器收到格式错误的SMB2_Compression_Transform_Header时,可以触发此漏洞[5]


3.2 复现过程




图 3-1 格式错误的数据包



首先,我们创建了格式错误的SMB2_Compression_Transform_Header,它的原大小(OriginalSize / OriginalCompressedSegmentSize) 值为0xFFFFFFFF(4294967295),偏移量为0x64(100),如图3-1。数据使用普通的LZ77算法进行了压缩。



图 3-2 IDA截图显示原大小与偏移量相加



图3-2显示了srv2.sys中Srv2DecompressData函数中整数溢出发生的位置。此函数创建一个缓冲区,用于保存解压缩的数据。该函数通过将原大小 (OriginalSize) 加上偏移量(Offset)来计算缓冲区大小,这会导致ECX寄存器中的整数溢出。一旦计算出缓冲区大小,它将数值传递给SrvNetAllocateBuffer函数来分配缓冲区。



图 3-3 整数溢出前后的寄存器



图3-3中,EAX(RAX的低8个字节)保存了原大小0xFFFFFFFF,而ECX(RCX的低8个字节)保存了偏移量0x64。缓冲区大小计算为0xFFFFFFFF + 0x64,溢出到0x63。然后该函数调用SrvNetAllocateBuffer来分配大小为0x63(99)字节的缓冲区。这种溢出导致内核分配的缓冲区比预期的要小得多。

攻击者可借助特制的请求,利用该漏洞造成基于堆的缓冲区溢出,攻击者通过与服务端建立连接,并请求分配内存,服务器响应攻击者并分配内存,攻击者发送特殊消息使服务端缓冲区溢出,导致Web Server发生崩溃。如下图所示:



图 3-4 解压时发生溢出



后来,内核调用了RtlDecompressBufferXpressLz函数来解压缩LZ77数据。图3-4显示,内核使用“ rep movs”指令将0x15f8f(89999)字节的数据复制到缓冲区中,该缓冲区的大小先前分配为0x63(99)字节。这会使小缓冲区溢出,从而导致内存损坏和内核崩溃。


4 漏洞危害及防护建议


4.1 漏洞危害


本次复现漏洞可能导致系统崩溃、拒绝服务,或者可能被用于远程代码执行。下面对有可能造成的危害进行详细说明:
  • 系统崩溃:在工业控制系统场景中多数操作站、上位机、SCADA系统运行在windows系统上,操作站崩溃会导致操作员无法与操控设备;上位机、SCADA崩溃可导致工控设备失去响应,直到被人工重启;
  • 远程代码执行:攻击者利用该缓冲区溢出漏洞可能导致工业控制系统数据泄露,如软件版本,系统信息、工艺参数等关键数据;也可直接获取操作权限,对工业控制系统正常运行、相关人员的生命财产安全带来严重威胁。

4.2 防护建议


根据该漏洞的原理及官网针对该漏洞的修复情况,给出以下建议。
  •  建议安装KB4551762安全更新补丁,修复该漏洞[6]
  • 如果无法及时更新,可以采取临时措施:运行regedit.exe,打开注册表编辑器,在HKLM\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters 下建立一个名为DisableCompression的DWORD,值为1,禁止SMB的压缩功能;
  • 对存在漏洞主机配置防火墙限制IP访问,仅允许指定IP访问,禁止外部IP访问,并进行相应的访问日志审计,防止系统信息泄露;
  • 禁止工业控制网络在无防护设备情况下与互联网连接,如必须连接互联网可采取安装工业防护设备(防火墙、网闸等)来限制攻击者的入侵。




参考资源 


[1] CVE:CVE-2020-0796

https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-0796

[2] Microsoft: MS-SMB2 2.2.3.1.3

https://docs.microsoft.com/zh-cn/openspecs/windows_protocols/ms-smb2/78e0c942-ab41-472b-b117-4a95ebe88271

[3] Microsoft: MS-SMB2 2.2.42

https://docs.microsoft.com/zh-cn/openspecs/windows_protocols/ms- smb2/1d435f21-9a21-4f4c-828e-624a176cf2a0

[4] NVD:CVE-2020-0796

https://nvd.nist.gov/vuln/detail/CVE-2020-0796

[5] Threat Research:CVE-2020-0796 Memory Corruption Vulnerability in Windows 10 SMB Server

https://www.fortinet.com/blog/threat-research/cve-2020-0796-memory-corruption-vulnerability-in-windows-10-smb-server.html

[6] Microsoft:KB4551762安全更新

https://www.catalog.update.microsoft.com/Search.aspx?q=KB4551762




往期精选

1

向劳动者致敬!没有从天而降的英雄,只有挺身而出的凡人 

2

@石油及天然气行业,天地和兴免费送上网络攻击动向及安全建议 

3

研华盛典,天盾绽放