4月15日,在微软补丁日上微软公布了多个高危漏洞,其中一个MS15-034 漏洞影响面最广,会造成IIS服务器蓝屏崩溃,特殊环境下或导致信息泄露。阿里巴巴安全研究实验室着重分析这一高危漏洞以及给国内互联网带来的影响。
本次漏洞测试所使用网上流传的POC进行修改。
二、测试环境
在Win7 32 + IIS 7环境下,使用前述的POC将可以使得Win7蓝屏从而导致IIS被远程拒绝服务。
三、漏洞原因
经过简单的分析,HTTP!UlParseHeader负责处理客户端发送的HTTP头部数据,本次漏洞出现在对Http Header 中”Range”字段的处理。
“Range”字段由HTTP!UlpParseRange负责解析,在该函数中有如下代码:
以前述的POC为例,使用的range字段为:
Range: bytes=2-18446744073709551615",
即Range.start =2,Range.Length=18446744073709551615-Range.start+1=0xfffffffffffffffe,并将该结构保存至HttpParser对象结构中(偏移0x5B8)。(网上流传的POC构造的Range.Start为0,导致这里计算出来的Range.Length会溢出)
接着在函数UlAdjustRangesToContentSize中,相关代码会将Range.Length与http get所请求的文件大小进行对比,若Range.Length + Range.Start大于HTTP请求文件的真实大小, Range.Lenth将会被修复为正确的合法长度。在本例中,Range.Length已被构造为0xfffffffffffffffe,Range.Length+Range.Start将会发生溢出,从而可以绕过这个重置的代码。
HTTP.sys会使用UlBuildFastRangeCacheMdlChain来缓存请求的数据,并使用IoBuildPartialMdl来绑定MDL。
VOID IoBuildPartialMdl(__in PMDL SourceMdl, __inout PMDL TargetMdl, __in PVOID VirtualAddress, __in ULONG Length );
本次测试中,IoBuildPartialMdl的Length参数已被修改为超长数值,直接导致系统蓝屏。
借助IDA的patchdiff2,对http.sys进行补丁比对,得知补丁进行了更改的函数如下所示:
查看修补情况,发现修补后的代码添加了RtlULongLongAdd来防止前述溢出的问题。
HTTP!UlAdjustRangesToContentSize的比较结果如下:
其中补丁还用同样的方法修补了另一个整数溢出的地方HTTP!UlpDuplicateChunkRange。