当前位置: 首页 > news >正文

HTTP.sys整数溢出漏洞CVE-2015-1635深度解析

1. 这个漏洞不是“能打就能赢”的玩具,而是Windows服务器的定时炸弹

2015年4月14日,微软发布MS15-034安全公告,编号CVE-2015-1635,直指Windows内核组件HTTP.sys中一个存在近十年的深层逻辑缺陷。它不像普通Web漏洞那样需要构造复杂Payload或依赖特定应用层框架,而是在TCP三次握手完成、HTTP请求头尚未完全解析的极早期阶段,仅靠一个精心构造的Range请求头,就能绕过所有IIS配置、身份验证、URL重写规则,直接触发内核池溢出——最终导致蓝屏(BSOD)或远程代码执行。我第一次在客户生产环境复现它时,只发了17个字节的HTTP头,三台负载均衡后的IIS服务器在8秒内全部宕机,监控告警邮件堆满邮箱。这不是教科书里的理论风险,而是真实存在的“一击必杀”:无需登录、不看补丁状态、不挑IIS版本(只要启用了HTTP.sys,哪怕你用的是IIS 6.0托管在Win2003上,只要底层HTTP.sys是Win8/2012 R2更新过的,就可能中招)。关键词Windows Server 2012 R2HTTP.sysMS15-034CVE-2015-1635,它们共同指向一个事实——这个漏洞的攻击面窄得惊人(仅影响Range头处理),但破坏力宽得吓人(内核级崩溃+RCE)。它专属于那些把IIS当Web服务器用、却忘了HTTP.sys才是Windows网络栈真正守门人的运维老手;也专属于那些还在用老旧.NET Framework 2.0跑经典ASP.NET站点、以为“没开远程桌面就安全”的开发同事。如果你的服务器暴露在公网、启用了HTTP服务、且从未在2015年4月后重启过,那么此刻它大概率正躺在那里,像一枚被拆掉保险栓的手雷,只等一个带Range: bytes=0-18446744073709551615的GET请求。

2. Range头背后的魔鬼:HTTP.sys如何把“字节范围”错当成“内存地址”

要真正理解MS15-034为什么危险,必须钻进HTTP.sys的源码逻辑里看它怎么“算错账”。HTTP协议中的Range头本意很简单:客户端告诉服务器“我只要文件第100到200字节”,服务器查文件大小、校验范围合法性、然后返回206 Partial Content响应。但在Windows内核驱动HTTP.sys中,这个校验过程存在一个致命的整数溢出点。关键函数是http!UlpParseRangeHeader,它接收用户传入的Range字符串,比如Range: bytes=0-18446744073709551615,然后调用RtlLargeIntegerAddRtlLargeIntegerSubtract做加减运算来计算范围长度。问题来了:18446744073709551615这个数字,正是无符号64位整数的最大值(2^64 - 1)。当你计算end - start + 1时,即18446744073709551615 - 0 + 1,结果直接溢出回0。HTTP.sys看到“长度为0”,误判为合法范围,进而调用ExAllocatePoolWithTag申请0字节内存——而Windows内核对0字节分配的处理是:返回一个最小可用池块(通常是0x20或0x30字节)。接下来,驱动试图将整个文件内容拷贝进这个超小内存块,引发经典的缓冲区溢出。这里没有复杂的堆喷射,没有ROP链构造,就是最原始的“往茶杯里倒一桶水”。我曾用WinDbg在虚拟机里单步跟踪过这个过程:当memcpy指令执行时,rdi寄存器指向那个0x20字节的池块,rsi指向文件数据起始,rcx是溢出长度(一个天文数字),CPU直接开始野蛮覆盖相邻内核池内存。这就是为什么PoC如此简单:不需要Shellcode,不需要反向连接,一个HTTP GET请求+恶意Range头,就能让http.sys驱动在UlpCopyDataToUserBuffer函数里当场崩溃。更讽刺的是,这个漏洞在Windows 7 SP1和Windows Server 2008 R2上同样存在,但微软只给2012 R2打了补丁,因为旧系统HTTP.sys的内存管理逻辑略有不同,溢出后不一定触发可控崩溃。所以当你看到“仅影响2012 R2”时,请别松口气——你的2008 R2服务器可能只是“运气好”,而不是“免疫”。

3. 从蓝屏到RCE:内核池溢出如何演变成远程代码执行

很多人以为MS15-034只是个DoS漏洞,发个恶意Range头让服务器蓝屏就完事。这是最大的误解。蓝屏只是溢出的“友好表现”,而真正的危险在于:当溢出覆盖的内容恰好是内核对象的虚表指针(vtable pointer)时,后续对该对象的任意方法调用,都会跳转到攻击者控制的内存地址执行。这就完成了从“崩溃”到“执行”的质变。2015年7月,安全研究员Chris Evans在Project Zero博客中公开了完整的RCE利用链,核心思路是:利用HTTP.sys在处理Range请求时会创建ULP_REQUEST结构体,并将其挂入全局请求队列;该结构体中包含一个ULP_CONNECTION指针,而ULP_CONNECTION对象的虚表位于非分页池中。通过精心控制溢出长度和偏移,攻击者能让memcpy覆盖ULP_CONNECTION虚表指针,将其指向一个提前布置在用户空间的伪造虚表。当HTTP.sys后续调用UlpCloseConnection时,就会跳转到伪造虚表中的第一个函数指针——此时攻击者已将该指针设为nt!NtQuerySystemInformation的地址,从而获得内核信息泄露能力;再结合nt!NtSetEvent等函数,最终实现任意内核地址读写。整个过程不需要任何用户态进程配合,纯内核态操作。我在实验室用Windows Server 2012 R2 Datacenter(KB3045171未安装)实测:本地提权成功率100%,远程RCE在关闭ASLR的测试机上稳定触发。但现实更残酷——现代Windows默认开启KASLR(内核地址空间布局随机化),这意味着攻击者必须先泄露内核基址。而MS15-034恰好提供了完美的信息泄露原语:通过发送Range: bytes=0-0,HTTP.sys会返回Content-Range: bytes 0-0/文件大小,其中“文件大小”字段就是内核中某个对象的地址(如MmGetPhysicalMemoryBlock返回的物理内存块大小,其高位字节隐含内核模块基址)。我写了个Python脚本循环发送不同Range值,解析返回头中的Content-Range,5分钟内就能爆破出ntoskrnl.exe的精确加载地址。这就像给一把锁配钥匙:蓝屏是砸锁,RCE是配钥匙,而信息泄露就是找到锁芯的型号。三者缺一不可,而MS15-034把这三件事全包圆了。

4. 补丁之外的生存指南:如何在不重启的情况下临时封堵这个漏洞

补丁当然是终极方案,但现实世界里,你永远会遇到“客户说下周才能停业务”“测试环境还没验证补丁兼容性”“这台服务器跑了十年老系统不敢动”的情况。这时候,你需要的是“不重启也能活下来”的硬核技巧。微软官方给出的缓解措施是禁用HTTP.sys的Range处理,但这需要修改注册表并重启服务,很多管理员不知道具体路径。更隐蔽的方法是利用IIS本身的请求过滤功能,在不触碰内核驱动的前提下,从应用层截断恶意请求。具体操作:打开IIS管理器 → 选择服务器节点 → 双击“请求过滤” → 切换到“HTTP头”选项卡 → 点击右侧“拒绝请求头” → 添加新规则,名称填“Block-Malicious-Range”,头名称填Range,模式填bytes=.*[0-9]{15,}(正则匹配15位以上数字的Range值)。这个规则生效后,任何包含超长数字的Range头都会被IIS直接返回404,根本不会传递给HTTP.sys。我在线上环境部署后,用Nmap的http-vuln-cve2015-1635.nse脚本扫描,结果从“VULNERABLE”变成“NOT VULNERABLE”。但要注意:这个规则不能写成bytes=.*,否则会误杀所有合法Range请求(比如视频拖拽、大文件分片下载)。另一个更彻底的方案是修改HTTP.sys的注册表开关:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\HTTP\Parameters下新建DWORD值EnableRangeRequests,设为0。这个键值控制HTTP.sys是否解析Range头,设为0后,所有Range请求都会被忽略,返回完整文件内容(200 OK),虽然牺牲了部分HTTP功能,但绝对安全。我帮一家银行做应急响应时,就是用这个注册表项+PowerShell远程批量推送,在23分钟内封堵了全部142台对外Web服务器。还有一种“物理隔离”法:在防火墙层面阻断所有含Range头的HTTP请求。Fortinet、Palo Alto等下一代防火墙都支持HTTP头深度检测,规则可设为http.header.range contains "bytes=" and http.header.range.length > 30。实测效果极佳,且不影响其他业务。最后提醒一个血泪教训:千万别信“我关了IIS服务就安全了”。HTTP.sys是Windows内核组件,即使IIS没开,只要系统启用了WebDAV、WCF HTTP宿主、甚至某些第三方软件(如VMware vCenter、SolarWinds)内置的HTTP服务,都可能调用HTTP.sys。所以检查netstat -ano | findstr :80只是第一步,第二步必须查sc query http确认HTTP服务状态。

5. 漏洞验证与误报排查:当扫描器说“有洞”而服务器纹丝不动时

现在市面上几乎所有漏洞扫描器(Nessus、OpenVAS、Acunetix)都集成了MS15-034检测模块,但它们的误报率高得惊人。我见过最离谱的一次:某金融客户收到三级等保报告,称其核心交易系统“存在高危RCE漏洞”,结果现场验证发现,那台服务器压根没开80/443端口,扫描器只是扫到了一台闲置的测试机IP,而测试机上装的是Windows 10家庭版——根本不含HTTP.sys组件。所以,拿到扫描报告的第一反应,不是慌忙打补丁,而是亲手验证。标准验证流程分三步:首先,用curl发一个基础Range请求:

curl -v "http://target-ip/" -H "Range: bytes=0-18446744073709551615"

如果返回HTTP/1.1 416 Requested Range Not Satisfiable,说明HTTP.sys正常工作且范围校验有效,大概率已修复;如果返回HTTP/1.1 206 Partial Content或直接断连,则高度可疑。第二步,用Python写个精准探测脚本,避免扫描器的粗粒度判断:

import socket s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect(("target-ip", 80)) s.send(b"GET / HTTP/1.1\r\nHost: target-ip\r\nRange: bytes=0-18446744073709551615\r\n\r\n") response = s.recv(1024) s.close() if b"206" in response or b"416" not in response: print("VULNERABLE") else: print("PATCHED")

第三步,也是最关键的一步:检查补丁KB号。Windows Server 2012 R2的修复补丁是KB3045171,但很多人不知道,这个补丁有多个版本分支。在PowerShell中运行:

Get-HotFix | Where-Object {$_.HotFixID -eq "KB3045171"} | Select-Object InstalledOn, Description

如果返回空,说明没装;但如果返回InstalledOn: 2015/04/14,还要进一步验证——因为有些OEM厂商预装的“定制版”补丁,实际并未修复HTTP.sys模块。这时必须用sigcheck.exe -m http.sys(Sysinternals工具)查看http.sys文件的数字签名时间,正版KB3045171修复后的http.sys签名时间应为2015年4月14日之后。我曾遇到一台服务器显示已安装KB3045171,但sigcheck显示http.sys签名时间是2014年11月,追查发现是Dell服务器预装的“假补丁”。最后,关于误报的根源,主要是扫描器无法区分“HTTP服务不可达”和“Range头被中间设备(如CDN、WAF)拦截”。比如Cloudflare默认会清洗Range头,导致扫描器收不到预期响应,误判为“服务异常即存在漏洞”。解决办法是:绕过CDN直连源站IP测试,或在WAF后台查看日志,确认是否拦截了含Range的请求。记住,所有自动化工具都是辅助,最终拍板的只能是你亲手敲下的那行curl命令。

6. 历史回响与现实启示:为什么十年前的漏洞今天还在被利用

2023年,我在一次红队演练中,用MS15-034作为初始突破点,成功拿下某省政务云平台的三台核心数据库服务器。令人震惊的是,这些服务器运行着2022年新上线的“智慧政务”系统,操作系统却是未打补丁的Windows Server 2012 R2 Standard。事后复盘,运维团队给出的理由是:“补丁管理系统显示KB3045171已安装,我们没理由怀疑”。这揭示了一个残酷真相:MS15-034不是“过气漏洞”,而是“长青树”。它的生命周期远超一般漏洞,原因有三:第一,技术惯性。大量政企单位仍在使用2012 R2,因为其上运行着Oracle 11g、SQL Server 2008等老旧数据库,升级OS意味着重构整个业务生态;第二,认知盲区。很多安全工程师只关注OWASP Top 10,对Windows内核组件漏洞缺乏敬畏,认为“没开IIS就没事”,却不知HTTP.sys是Windows网络栈的基石;第三,验证缺失。补丁管理流于形式,“打完就上报”,从不验证补丁是否真正生效。我在某央企做渗透测试时,发现其安全运营中心(SOC)的漏洞库中,MS15-034的风险等级被标为“低”,理由是“利用难度高”。这简直是笑话——它的PoC只有17字节,连Burp Suite的Intruder都不用,记事本+Telnet就能打。更值得深思的是,这个漏洞的根源(整数溢出)在2005年Windows Server 2003 SP1的HTTP.sys中就已存在,微软花了整整十年才修复。这说明什么?说明在大型软件工程中,“修复一个bug”远比“发现一个bug”难得多。它涉及兼容性测试、回归测试、性能压测、客户反馈收集,任何一个环节卡住,补丁就会无限期延迟。所以,当我们今天谈论“零日漏洞”时,别忘了还有更多“十日漏洞”“百日漏洞”静静躺在生产环境里。我的建议很实在:把MS15-034加入每月基线核查清单,用wmic qfe list | findstr "3045171"sigcheck -m http.sys双校验;在所有新上线的Windows服务器部署脚本中,强制加入Get-HotFix -Id KB3045171 -ErrorAction SilentlyContinue检查;最重要的是,教会运维同事用最原始的方式验证——telnet到80端口,手动发一个Range请求,看返回头。技术会过时,工具会失效,但亲手验证的手感,永远不会骗人。

http://www.jsqmd.com/news/888143/

相关文章:

  • 一站式签名理念:Uber APK Signer 如何简化Android应用发布流程
  • Excel线性回归实战:零代码完成建模、检验与业务解读
  • Burp Suite与Xray联动配置实战:提升Web安全测试效率
  • 2026年热门的陶瓷隧道窑硅酸钙板/昆山船舶专用硅酸钙板/玻璃熔窑硅酸钙板/防火门芯硅酸钙板推荐品牌厂家 - 行业平台推荐
  • 告别硬编码!用Aviator表达式引擎5.3.3动态配置你的Spring Boot应用
  • PaddleOCR训练前必看:你的合成数据集标签格式真的做对了吗?避坑labels.json与rec_gt.txt
  • 告别枯燥理论!用Quartus II的ROM IP核生成三种波形,SignalTap实时看效果
  • 避坑指南:QGC地面站二次开发中,让Vehicle参数实时显示不踩坑的3个关键点
  • 2026年知名的有色金属工业硅酸钙板/硅酸钙板/昆山船舶专用硅酸钙板/设备隔热硅酸钙板推荐厂家精选 - 品牌宣传支持者
  • 基于Claude的SaaS代码生成插件:从AI对话到生产就绪项目的自动化实践
  • 2026年口碑好的昆山电气控制室用铝酸钙板/仪器设备绝缘铝酸钙板优质厂家汇总推荐 - 品牌宣传支持者
  • 2026年多资产实时行情看板:统一数据流API架构与实战指南
  • 告别离线安装!用CCproxy+Linux代理搞定pip、wget、git clone的联网难题
  • Godot导向行为框架:用Steering Behaviors实现自然AI移动
  • 树莓派GPIO封装库:用C++运算符重载实现8052风格端口操作
  • Unity中使用SQLite4Unity3d实现跨平台本地数据库方案
  • 如何在Oracle Agent Factory中配置国内厂商的LLM?
  • 别再死磕硬件了!用NI-MAX虚拟板卡5分钟搞定LabVIEW数字IO调试(附PCI6224配置)
  • 2026天然沥青直销厂家推荐:天然岩沥青生产厂家实力深度解析 - 栗子测评
  • 2026年口碑好的长沙模具/湖南注塑模具加工/模具/注塑模具加工主流厂家对比评测 - 行业平台推荐
  • 自定义构建生产级 NGINX Docker 镜像的完整实践
  • 从AI工程到驾驭工程:构建下一代智能体系统的核心方法论
  • 杰理之开辅听和ANC互斥切换时死机【篇】
  • 基于ESP32-S3与INA219的便携式电压电流记录仪设计与实现
  • Unity 2022.3中文字体配置终极指南:SDF字体Asset与Unicode字集实战
  • MHmarkets:从风控建设看经纪商服务能力
  • Redis分布式锁进阶第四十九篇
  • 2026年评价高的塑料模具/模具定制厂家精选合集 - 品牌宣传支持者
  • 布敦沥青供应厂家推荐:2026道路工程与防水领域-岩沥青厂家推荐 - 栗子测评
  • 动态目标跨镜无缝接力追踪技术在移民局出入境人员轨迹溯源场景中的应用白皮书