Skip to content
KitploitKITPLOIT
工具博客
提交
工具博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
servu-cve-2026-28318-poc — SolarWinds Serv-U CVE-2026-28318:未经认证的 Content-Encoding: deflate 崩溃。根本原因分析(内部指针的无效释放 -> 堆损坏)+ 仅 DoS 的 PoC。已在 15.5.4 热修复 1 中修复。 | Kitploit
工具/GitHubGitHub/eaea0001/servu-cve-2026-28318-poc
内存取证漏洞分析漏洞利用渗透测试二进制分析
GitHubeaea0001/servu-cve-2026-28318-poc

servu-cve-2026-28318-poc

SolarWinds Serv-U CVE-2026-28318:未经认证的 Content-Encoding: deflate 崩溃。根本原因分析(内部指针的无效释放 -> 堆损坏)+ 仅 DoS 的 PoC。已在 15.5.4 热修复 1 中修复。

查看仓库

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享
133个月前尚未审核

CVE-2026-28318 — SolarWinds Serv-U "Content-Encoding: deflate" 预认证崩溃

根因分析 + DoS 概念验证。 公开公告将此漏洞归类为未认证的拒绝服务 / 不受控制的资源消耗。二进制分析表明,根本缺陷是内存安全问题:在 HTTP deflate 解码路径中对内部指针执行了无效的 free(),这会破坏进程堆(STATUS_HEAP_CORRUPTION、0xC0000374)。这不是解压炸弹,且崩溃与解压后的大小无关。


⚠️ 免责声明 / 适用范围

  • 这是针对已修补、已公开披露漏洞的防御性安全研究(修复已于 2026-06-04 随 Serv-U 15.5.4 Hotfix 1 发布;已列入 CISA KEV)。
  • 此处的 PoC 只会让您拥有或明确获授权测试的 Serv-U 实例崩溃。它仅限 DoS——不包含也不演示任何远程代码执行(请参阅严重性)。
  • 请使用它验证您自己系统上的补丁状态与检测能力。不要将其指向您无法控制的系统。您有责任遵守适用法律。

受影响 / 已修复

产品SolarWinds Serv-U(FTP / MFT / 文件服务器)
受影响版本该分支中未安装 Hotfix 1 的 15.5.4 及更早版本(分析基于构建版本 15.5.4.108)
已修复版本Serv-U 15.5.4 Hotfix 1(发布于 2026-06-04)
攻击向量未认证、网络(HTTP/HTTPS 管理/Web 端口)
公开分类CWE-400 不受控制的资源消耗 · DoS · CVSS 7.5 · CISA KEV
实际分类CWE-763 释放无效指针 / CWE-590 释放非堆内存 → 堆损坏

仅影响 HTTP/HTTPS 监听器(Web/管理路径)。FTP/FTPS/SFTP 不在此代码路径上。


TL;DR

任何携带 Content-Encoding: deflate 且具有有效 deflate 主体的 HTTP 请求都会使服务崩溃。处理程序解压主体,然后释放指向压缩主体的指针并换入解压后的缓冲区——但该指针是 HTTP 接收缓冲区内的内部指针(它指向主体,紧跟在 \r\n\r\n 之后),并非堆分配基址。对非基址、未对齐的指针调用 free() 会破坏堆,导致进程崩溃。

因为缺陷出在主体指针的释放方式——而非产出了多少数据——即使约 25 字节的压缩主体(解压后仅几 KB)也能可靠地使其崩溃。内存使用量不会增长;这不是"zip/deflate 炸弹"。


根本原因

deflate 解码例程位于 RhinoNET.dll(Serv-U 的网络库)中,一旦头解析器在检测到 Content-Encoding: deflate 时设置"deflate"标志,便会从 HTTP 接收路径(ProcessReceive)进入该例程。

简化而言,该例程以 decode(this, &bodyPtr, &bodyLen) 形式被调用,其操作如下:

root@kitploit:~
1. inflate bodyPtr[0..bodyLen]  -> grows an accumulator buffer `acc`   (stock zlib, bounded, correct)
2. free(*bodyPtr)                <-- *bodyPtr is an INTERIOR pointer into the receive buffer
3. *bodyPtr = acc                // replace compressed body with decompressed buffer
4. *bodyLen = total

第 2 步就是缺陷所在。*bodyPtr 不是独立分配的块:它指向请求主体,该主体位于单个 HTTP 接收缓冲区内部,即 receive_buffer + header_length。释放内部(且 16 字节未对齐)指针会使分配器将受攻击者影响的区域解析为堆块头 → 堆元数据损坏 → 0xC0000374。

已排除的可能(以免您追查错误方向)

两种"显而易见"的假设都是错误的,这一点已在运行时得到验证:

  • 不是 inflate/解压溢出。 解压器是标准 zlib1.dll!inflate,每次调用都遵守 avail_out(在 100 多个块上观察到;零越界写入)。
  • 不是累加器溢出。 增长的输出缓冲区每轮按 prev_total + produced + 1 分配,并恰好写入这么多——紧凑,无溢出。

损坏完全源于第 2 步中的无效 free()。


证据

以下证据是在运行时(Frida)针对 Serv-U 15.5.4.108 捕获的,当时发送了一个 Content-Encoding: deflate 请求,其主体解压后为 "A" * 8192:

  • 被释放的指针为 …ce — mod 16 == 14。 堆分配基址按 16 字节对齐,因此这不是分配基址;它是一个内部指针。
  • 被释放指针之前的 48 个字节是 HTTP 头部尾部,以 \r\n\r\n 结尾:
    root@kitploit:~
    …tream\r\nContent-Length: 26\r\nConnection: close\r\n\r\n
    
  • 被释放指针处的字节是原始 deflate 流(ed c1 01 0d 00 …)。
  • 崩溃特征: 故障模块 ntdll.dll,异常 0xC0000374(STATUS_HEAP_CORRUPTION),调用源自 RhinoNET.dll deflate 处理例程中的 free。崩溃前的最后一次堆操作正是这次 free(bodyPtr)。
  • 与大小无关: 解压后仅约 4 KB(压缩后约几十个字节)的主体也会以相同方式崩溃;工作集内存不会增长。

严重性

  • 已确认: 可导致 Serv-U 服务发生可靠的未认证远程崩溃(DoS)。服务可能会自动重启,但重复请求可使其持续宕机,并可能耗尽 Windows 服务恢复机制。
  • 超越 DoS——尚未证实。 被释放的"堆块头"与攻击者控制的 HTTP 头字节重叠,这原则上是一种比单纯 DoS 更强的原语。然而,在现代 Windows(Segment Heap)上,无效释放会在我们的测试中快速失败(0xC0000374),并且我们未能实现代码执行。 请将其视为具有内存安全根本原因的预认证堆损坏 DoS;不要假设存在 RCE。

复现

需要 Python 3(仅标准库)。将其指向您获授权测试的 Serv-U HTTP 监听器。在 Windows 上,它通过一次 Get-NetTCPConnection 调用来读取监听器 PID,并检查应用程序事件日志以确认堆损坏崩溃。

root@kitploit:~
python poc_verify.py                       # default 127.0.0.1:80, tiny packet, 1 shot
python poc_verify.py --host <ip> --port 80
python poc_verify.py --big                 # body decompresses to 8192 bytes
python poc_verify.py --shots 3
python poc_verify.py --no-events           # skip event-log check (no privileges needed)

PoC 会构建一个最小请求:

root@kitploit:~
POST / HTTP/1.1
Host: <target>
Content-Encoding: deflate
Content-Type: application/octet-stream
Content-Length: <n>
Connection: close

<raw-deflate body — even a few dozen bytes is enough>

如果服务崩溃(监听器 PID 发生变化 / 出现 0xC0000374 事件),它将报告 PASS;如果服务存活(已修补、不受影响,或主体未按 deflate 处理),则报告 FAIL。


缓解措施

  1. 应用 Serv-U 15.5.4 Hotfix 1(或更高版本)。
  2. 临时措施: 在 Serv-U 前端剥离或拒绝 HTTP/HTTPS 监听器上的入站 Content-Encoding,例如在反向代理上:
    root@kitploit:~
    if ($http_content_encoding) { return 400; }
    
  3. 限制 Serv-U Web/管理端口的网络暴露。

分析方法(本次分析是如何进行的)

  • 静态:对 RhinoNET.dll / Serv-U.exe(映像基址 0x180000000)进行参数化 PE 反汇编,以梳理接收 → 头解析 → deflate 解码路径,并定位错误的 free。
  • 动态:对运行中的服务进行 Frida 插桩——挂钩解压器以证明 zlib 遵守 avail_out,将解码调用中的每次 alloc/free/memcpy 追踪到磁盘,并使用进程异常处理器在损坏发生的时刻捕获故障指令及 0xC0000374 栈。随后,通过转储被释放指针周围的字节(HTTP 头部尾部 + 原始 deflate 主体,16 字节未对齐),确认了内部指针释放。

分析中引用的偏移量特定于构建版本 15.5.4.108,不同构建版本会有所不同。


参考资料

  • SolarWinds — Serv-U 15.5.4 Hotfix 1 发行说明
  • NVD — CVE-2026-28318
  • CISA KEV 目录 — CVE-2026-28318

在厂商补丁可用后作为防御性研究发布。PoC 仅限 DoS,仅供授权测试使用。

下载工具