标题: srv.sys中若干漏洞(CVE-2017-11780)简介 创建: 2017-10-13 09:01 更新: 链接: https://scz.617.cn/windows/201710130901.txt -------------------------------------------------------------------------- 目录: ☆ 漏洞原理(CVE-2017-11780) 1) SrvSmbNtRename 2) SrvOs2GeaListSizeToNt 3) SrvSmbQueryQuota 4) RestartWriteNamedPipe -------------------------------------------------------------------------- ☆ 漏洞原理(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()类似。