☆ 漏洞原理(CVE-2017-11780)微软自己定级Important,3月的MS17-010定级Critical。
1) SrvSmbNtRename()
该函数需要认证,空会话无法访问。
微软针对srv!SrvSmbNtRename()的修补方案居然是让它直接作废:
SMB_TRANS_STATUS SrvSmbNtRename ( PWORK_CONTEXT WorkContext ) { SrvSetSmbError2( WorkContext, 0xC0982016, 0, 0xB73, "..." ); return( SmbTransStatusErrorWithoutData ); }
看了一下原来的SrvSmbNtRename()实现,很简单的一段代码,想不出来可能有什么安全风险。
2) SrvOs2GeaListSizeToNt
SrvOs2GeaListSizeToNt存在一个与SrvOs2FeaListSizeToNt完全一样的”漏洞”,但前者必须通过身份认证才能到达,后者则只需要空会话即可到达。MS17-010同时修补了二者,Eternalblue只利用后者。
SrvOs2GeaListSizeToNt()另有一个整数溢出漏洞,MS17-010没有修补,KB4041678修补了。这个漏洞同样可以导致远程执行代码,但需要身份认证。
另有两个函数涉及整数溢出,此次一并修补:
SrvAllocateNonPagedPool SrvAllocatePagedPool
3) SrvSmbQueryQuota
sid即security identifier。
sidListLength、startSidLength、startSidOffset均是客户端可控数据。
其中sidListLength、startSidLength有可能偏小,导致动态分配的结构未被正确初始化。
4) RestartWriteNamedPipe
回顾一个老漏洞。
CVE-2006-1314/MS06-035是这样一个漏洞,srv.sys处理畸型\MAILSLOT\型
Transaction(0x25)报文时存在远程内核态池缓冲区溢出。
分配一个TRANSACTION结构,其中有块内存包含请求报文与响应报文的Setup、Parameter、Data,共6种数据。服务端应该根据客户端的指示(MaxParameterCount)构造响应报文。
但是,对于RestartMailslotWrite()来说,服务端没有遵从MaxParameterCount的建议,固定地产生两个字节的Parameter,这将造成内核态池缓冲区溢出。
微软修补时是在MailslotTransaction()入口处简单地检查MaxParameterCount是否小于2并转错误流程。
CVE-2017-11780修补的RestartWriteNamedPipe()与RestartMailslotWrite()类似。