此漏洞是由于Windows处理SMB协议驱动mrxsmb20.sys在解析Tree Connect Response时,未正确处理包长度导致的空指针引用漏洞。当Tree Connect Response包中smb协议长度大于0x400(1024)时,会造成蓝屏崩溃。
漏洞重现
根据已公开的 POC,在win10 14393中重现了此漏洞。需要注意的是,Windows系统中可能默认监听了445端口,在这种情况下运行POC会出现如下错误: socket.error: [Errno 10013] An attempt was made to access a socket in a way forbidden by its access permissions 解决方案有两个,手动关闭系统445端口监听,或者在其他系统中运行POC。随后通过UNC路径访问便可以重现此漏洞。
通过windbg双机调试崩溃机器,可以看出漏洞是mrxsmb20!Smb2ValidateNegotiateInfo函数访问了空指针(rcx为0)导致了访问异常。
0: kd> !analyze -v FAULTINGIP: mrxsmb20!Smb2ValidateNegotiateInfo+17 fffff80e847fd117 66394114 cmp word ptr [rcx+14h],ax rax=0000000000000001 rbx=0000000000000000 rcx=0000000000000000 rdx=ffff9a0e216adb20 rsi=0000000000000000 rdi=0000000000000000 rip=fffff80e847fd117 rsp=fffff8020385bec0 rbp=ffff9a0e21530ae8 r8=0000000000000001 r9=0000000000000000 r10=ffff9a0e218d2b20 r11=fffff8020385c1a8 r12=0000000000000000 r13=0000000000000000 r14=0000000000000000 r15=0000000000000000 iopl=0 nv up ei ng nz na po nc mrxsmb20!Smb2ValidateNegotiateInfo+0x17: fffff80e847fd117 66394114 cmp word ptr [rcx+14h],ax ds:00000000`00000014=???? FOLLOWUPNAME: MachineOwner MODULENAME: mrxsmb20 IMAGENAME: mrxsmb20.sys OSPLATFORMTYPE: x64 OSNAME: Windows 10 BUILDOSVERSTR: 10.0.14393.447.amd64fre.rs1releaseinmarket.161102-0100
POC分析
POC中大部分是用来进行封包操作,或用来进行身份认证的功能代码。其中和漏洞相关的代码如下:
代码中注释为BUG处为触发漏洞的关键点,经过测试后发现只要Data的数据长度为945,任意数据都会触发漏洞,此时代码中packet1的长度刚好等于1025大于0x400。
漏洞数据包分析
由上图可以看出,正常的Tree Connect Response在Access Mask字段后是不会有数据。而漏洞攻击数据包中,后面接了很多无用数据,而且数据包长度刚好大于0x400,漏洞便被触发了。
正常数据包和漏洞攻击数据包如下: normal.pcapng trigger.pcapng
漏洞影响
经测试漏洞只会影响win8及以上系统,包括对应的服务器版本。由于此漏洞利用时只需要回应恶意的Tree Connect Response包,所以攻击者可以通过中间人攻击或诱骗用户访问等多种方式实现远程攻击。在微软官方修补前,建议用户通过防火墙禁用139和445等端口的流量。