srv.sys中若干漏洞(CVE-2017-11780)简介

☆ 漏洞原理(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()类似。

 

 

Spread the word. Share this post!

Meet The Author

C/ASM程序员

Leave Comment