从内核驱动到系统蓝屏:HTTP.sys整数溢出漏洞深度剖析与实战复现

📅 2026/7/16 16:15:46
从内核驱动到系统蓝屏:HTTP.sys整数溢出漏洞深度剖析与实战复现
1. HTTP.sys漏洞的来龙去脉HTTP.sys是Windows操作系统中处理HTTP请求的内核级驱动程序自IIS 6.0起被引入。这个组件直接运行在系统内核空间负责接收和转发HTTP请求同时提供性能优化功能如内核模式缓存。正是这种高权限的运行环境使得其中的安全漏洞可能造成严重后果。2015年曝光的CVE-2015-1635漏洞源于HTTP.sys对Range请求头的处理存在缺陷。当接收到一个精心构造的HTTP请求其中包含超大数值的字节范围时驱动程序中的整数计算会发生溢出。具体来说攻击者可以发送类似Range: bytes0-18446744073709551615的请求头这个值正好等于64位无符号整数的最大值0xFFFFFFFFFFFFFFFF导致后续的内存操作越界。这个漏洞之所以危险是因为它同时具备两种攻击可能性一方面可以导致拒绝服务系统蓝屏另一方面可能实现远程代码执行。在实际测试中我们观察到Windows 7系统在遭受攻击时会立即显示蓝屏错误并在系统日志中留下HTTP.sys相关的崩溃记录。通过分析minidump文件可以清晰看到崩溃发生在HTTP!UlpParseRange函数中。2. 漏洞复现环境搭建要完整复现这个漏洞我们需要准备以下环境攻击机Kali Linux建议使用2023.3或更新版本靶机Windows 7 SP1未打MS15-034补丁网络环境确保两台机器在同一局域网可以互相ping通在Windows 7靶机上我们需要安装IIS服务打开控制面板 - 程序和功能 - 打开或关闭Windows功能勾选Internet信息服务保持默认选项即可完成安装后在浏览器访问http://localhost应该能看到IIS欢迎页面重要提示复现前务必关闭Windows防火墙否则可能无法成功触发漏洞。可以通过以下命令快速关闭防火墙netsh advfirewall set allprofiles state off对于想要深入分析的研究人员建议在虚拟机中安装WinDbg调试工具并配置内核调试模式。这样当系统蓝屏时可以获取更详细的内存状态信息。3. 三种漏洞验证方法对比3.1 使用curl快速检测这是最简单的验证方式适合快速确认系统是否存在漏洞curl http://靶机IP -H Host: irrelevant -H Range: bytes0-18446744073709551615如果系统返回416状态码Requested Range Not Satisfiable基本可以确认漏洞存在。这个方法的优点是无需额外工具缺点是只能确认漏洞存在无法进一步利用。3.2 使用Python POC脚本GitHub上有多个开源POC脚本比如aedoo开发的CVE-2015-1635-POC。使用步骤如下克隆仓库git clone https://github.com/aedoo/CVE-2015-1635-POC.git运行检测python ms15-034_check.py http://靶机IP这个脚本会发送特制请求并分析响应不仅能检测漏洞还能尝试读取部分内存数据。我在测试中发现某些情况下可以获取到内核内存中的敏感信息包括部分进程数据和系统结构。3.3 Metasploit框架利用Metasploit提供了两个相关模块auxiliary/scanner/http/ms15_034_http_sys_memory_dump内存读取auxiliary/dos/http/ms15_034_ulonglongadd拒绝服务攻击使用内存读取模块的典型流程msfconsole use auxiliary/scanner/http/ms15_034_http_sys_memory_dump set RHOSTS 靶机IP run这个模块会尝试读取约256KB的内核内存数据。在实际测试中我建议将RPORT设置为目标网站的监听端口不一定是80同时可以调整READ_SIZE参数控制读取量。4. 从触发到蓝屏的全过程分析当恶意请求到达HTTP.sys时完整的漏洞触发流程如下驱动解析HTTP请求头遇到Range字段尝试将字符串0-18446744073709551615转换为数值范围在计算结束位置时发生整数溢出后续的内存拷贝操作使用错误的内存地址访问无效内存导致页错误Page Fault系统触发蓝屏保护机制通过WinDbg分析dump文件可以看到类似以下的调用栈STACK_TEXT: fffff880009ae8f8 fffff8800143a3e9 : 0000000000000050 fffff8800143a3e9 0000000000000000 : nt!KeBugCheckEx fffff880009ae900 fffff8800143a3e9 : fffff8800143a3e9 0000000000000000 0000000000000000 : HTTP!UlpParseRange0x129这个调用栈清晰地显示了崩溃发生在HTTP.sys的UlpParseRange函数中。有趣的是不同Windows版本的具体崩溃点可能略有差异但根本原因都是整数溢出导致的内存访问越界。5. 漏洞修复与缓解措施微软官方通过MS15-034补丁修复了此漏洞。对于无法立即更新的系统可以采用临时缓解措施禁用IIS内核缓存打开IIS管理器选择目标网站 - 输出缓存点击编辑功能设置取消勾选启用内核缓存使用URL重写规则拦截恶意请求rule nameBlock MS15-034 stopProcessingtrue match url.* / conditions add input{HTTP_RANGE} patternbytes0-18446744073709551615 / /conditions action typeAbortRequest / /rule在修复后验证阶段我注意到一个有趣现象虽然漏洞已被修补但某些检测工具仍会报告系统存在漏洞。这是因为补丁只是修复了漏洞的可利用性而没有改变HTTP.sys对超大Range请求的响应方式。因此安全人员需要结合多种检测手段进行判断。6. 漏洞研究的实用建议对于想要深入研究此类漏洞的安全人员我有几个实用建议搭建双机调试环境非常有助于理解漏洞机理。建议在Windows 7虚拟机上启用内核调试通过WinDbg实时观察HTTP.sys的行为。在测试DoS攻击时最好准备一个物理机作为靶机。因为虚拟机环境下的蓝屏行为有时会被hypervisor拦截导致无法观察到完整崩溃过程。尝试修改POC中的Range值比如使用184467440737095516140xFFFFFFFFFFFFFFFE。我发现某些情况下这类接近最大值的数值也能触发漏洞但崩溃点可能不同。关注IIS日志%SystemDrive%\inetpub\logs\LogFiles其中会记录导致崩溃的请求特征。这对分析真实攻击很有帮助。这类内核级漏洞的研究需要格外小心。在我的测试过程中曾多次导致系统不稳定甚至数据丢失。建议使用快照功能完善的虚拟机平台并随时保存工作进度。