CVE-2020-0796 SMB 远程代码执行漏洞分析、验证及加固

本文分析了CVE-2020-0796,一个影响Windows系统的SMB蠕虫漏洞,允许远程、未经认证的攻击者执行任意代码。该漏洞存在于SMB 3.1.1协议中,因处理压缩消息时的缓冲区溢出导致。受影响的系统包括多个版本的Windows 10和Windows Server。目前,微软尚未发布补丁,但已有第三方提供初步信息。漏洞利用可能导致蠕虫式攻击,且无须权限即可触发。
摘要由CSDN通过智能技术生成

0x01漏洞描述
CVE-2020-0796是存在于微软服务器SMB协议中的一个“蠕虫化”漏洞,该漏洞未包含 在微软本月发布的补丁中,是在补丁的序言中泄露的。
目前微软尚未发布任何技术详情,思科Talos团队和Fortinet公司提供了简短概述,目前尚不清楚该漏洞的补丁何时发布。Fortinet公司指出,该漏洞是“微软 SMB 服务器中的一个缓冲区溢出漏洞”,严重等级为最高评分,“该漏洞由易受攻击的软件错误地处理恶意构造的压缩数据包而触发。
远程、未经认证的攻击者可利用该漏洞在该应用程序的上下文中执行任意代码。” 漏洞公告显示,SMB 3.1.1协议中处理压缩消息时,对其中数据没有经过安全检查,直接使用会引发内存破坏漏洞,可能被攻击者利用远程执行任意代码。攻击者利用该漏洞无须权限即可实现远程代码执行,受黑客攻击的目标系统只需开机在线即可能被入侵。
思科Talos博客文章也给出了类似描述,不过随后将其删除。思科指出,“利用该漏洞可导致系统遭蠕虫攻击,也就是说漏洞可轻易地在受害者之间传播。
”0x02漏洞编号CVE-2020-07960x03漏洞等级严重0x04影响范围Windows 10 Version 1903 for 32-bit SystemsWindows 10 Version 1903 for x64-based SystemsWindows 10 Version 1903 for ARM64-based SystemsWindows Server, version 1903 (Server Core installation)Windows 10 Version 1909 for 32-bit SystemsWindows 10 Version 1909 for x64-based SystemsWindows 10 Version 1909 for ARM64-based SystemsWindows Server, version 1909 (Server Core installation)
0x05漏洞原理
漏洞发生在srv2.sys中,由于SMB没有正确处理压缩的数据包,在解压数据包的时候使用客户端传过来的长度进行解压时,并没有检查长度是否合法.最终导致整数溢出。SMB v3中支持数据压缩,如果SMB Header中的ProtocolId为0x424D53FC也就是0xFC, ‘S’, ‘M’, ‘B’.那么就说明数据是压缩的,这时smb会调用压缩解压处理的函数.首先SMB会调用srv2!Srv2ReceiveHandler函数接收smb数据包,并根据ProtocoIId设置对应的处理函数。 __int64 __fastcall Srv2ReceiveHandler(__int64 a1, void *Src, __int64 a3, unsigned int a4, unsigned int *a5, char *Srca, struct _SLIST_ENTRY *a7, _QWORD *a8){ … // // 这里判断头部ProtocolId // if ( **((_DWORD **)&v20[15].Next[1].Next + 1) == ‘BMS\xFC’ ) { if ( KeGetCurrentIrql() > 1u ) { v20[14].Next = (_SLIST_ENTRY *)v11; v20[2].Next = (_SLIST_ENTRY *)Srv2DecompressMessageAsync; v43 = HIDWORD(v20->Next) == 5; *((_DWORD *)&v20[3].Next + 2) = 0; if ( v43 ) { LOBYTE(v71) = 1; LOBYTE(v35) = 1; SRV2_PERF_ENTER_EX(&v20[32].Next + 1, v35, 307i64, “Srv2PostToThreadPool”, (_DWORD)v71); } v44 = *((_QWORD *)&v20[3].Next[8].Next + 1); v45 = *(_QWORD *)(v44 + 8i64 * KeGetCurrentNodeNumber() + 8); if ( !ExpInterlockedPushEntrySList((PSLIST_HEADER)(v45 + 16), v20 + 1) && *(_WORD *)(v45 + 66) ) RfspThreadPoolNodeWakeIdleWorker(v45); go

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值