一个安全的、非破坏性的检测器,用于 CVE-2026-28318,该漏洞是 SolarWinds Serv-U <= 15.5.4.108 中的一个未认证拒绝服务。单个包含 Content-Encoding: deflate 的 POST 请求,其主体会被送入内存中的 deflate 解压缩器 (CZLibCompression),后者的缓冲区管理执行了一个无效的 free(),导致 Serv-U 服务进程中止。(CVSS 7.5, AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H, CWE-763。)
此脚本不会导致目标崩溃。它只针对每个主机回答一个问题:是否缺少 15.5.4 HF1 修复? 这正是服务器是否易受 CVE-2026-28318 攻击的精确代理。
是的。这正是本工具的意义所在,可安全地在生产环境运行:
deflate。deflate 是唯一一个会触发漏洞解压缩器的 Content-Encoding 值。该脚本发送单个 POST 请求,使用无害的 Content-Encoding: identity 和简短主体,这永远不会进入崩溃代码路径。15.5.4.125)会拒绝任何带有主体和非空 Content-Encoding 的请求,并返回 415 Unsupported Media Type。易受攻击的构建版本没有此类检查,会正常处理 identity 探测。因此,结论完全取决于状态码,服务永远不会被破坏。该脚本向站点根目录发送一个安全的 POST 请求,并读取状态码:
目标通过探测响应的自身 Server 头被识别为 Serv-U,因此无需单独的识别请求。
它证明修复缺失;它不会通过崩溃服务来确认。
VULNERABLE结论意味着 HF1 输入验证检查缺失,这正是此 CVE 的精确代理。脚本有意停在此处,而不是发送会崩溃的deflate值。
# 单个主机(方案默认为 https://)
./cve_2026_28318_check.py 10.0.0.5
# 显式 URL / 端口
./cve_2026_28318_check.py https://10.0.0.5:443
# 同时检查多个主机
./cve_2026_28318_check.py host-a:443 host-b https://host-c
# 扫描列表文件,每行一个目标(支持 '#' 注释),紧凑输出
./cve_2026_28318_check.py -f targets.txt --brief
# 机器可读输出,适用于管道
./cve_2026_28318_check.py -f targets.txt --json > results.json
一个易受攻击的 Serv-U 服务器(在 TTY 上 [!] 标记和 VULNERABLE 显示为红色):
$ ./cve_2026_28318_check.py https://10.0.0.5
[!] https://10.0.0.5: VULNERABLE [missing-415-gate]
Serv-U 对 identity 探测返回了 401(而非 415),因此 HF1 415 检查缺失(构建版本 <= 15.5.4.108),CVE-2026-28318 未打补丁。这证明修复缺失;它不会导致服务崩溃。请应用 15.5.4 HF1(构建版本 15.5.4.125+)。
已打补丁的服务器返回 PATCHED(HF1 415 检查对 identity 探测做出响应):
$ ./cve_2026_28318_check.py https://10.0.0.6
[+] https://10.0.0.6: PATCHED [hf1-415-gate]
Serv-U 对 identity 探测返回了 415,因此 15.5.4 HF1 输入验证检查存在(构建版本 >= 15.5.4.125)。不受 CVE-2026-28318 影响。
扫描列表,每个主机一行对齐输出(--brief)。退出状态为 1(若有任何主机是 VULNERABLE),否则为 0,这在脚本中很方便:
$ ./cve_2026_28318_check.py -f targets.txt --brief; echo "exit: $?"
VULNERABLE https://10.0.0.5 missing-415-gate
PATCHED https://10.0.0.6 hf1-415-gate
NOT-SERV-U https://10.0.0.7 not-servu
ERROR https://10.0.0.8 no-response
exit: 1
机器可读输出,适用于管道(--json):
$ ./cve_2026_28318_check.py https://10.0.0.5 --json
[
{
"target": "https://10.0.0.5",
"verdict": "VULNERABLE",
"reason": "missing-415-gate",
"detail": "Serv-U 对 identity 探测返回了 401(而非 415),因此 HF1 415 检查缺失(构建版本 <= 15.5.4.108),CVE-2026-28318 未打补丁。这证明修复缺失;它不会导致服务崩溃。请应用 15.5.4 HF1(构建版本 15.5.4.125+)。"
}
]
| 代码 | 含义 |
|---|---|
0 | 没有目标为 VULNERABLE |
1 | 至少有一个目标为 VULNERABLE |
2 | 使用错误(参数错误 / 无法读取目标文件) |
Server 头(报告为 NOT-SERV-U)或自行响应 415(可能导致错误的 PATCHED)。尽可能将工具直接指向 Serv-U 管理接口。VULNERABLE 结论证明 HF1 输入验证修复缺失;它不演示崩溃(有意如此)。该检查正是此 CVE 的精确代理。升级到 SolarWinds Serv-U 15.5.4 Hotfix 1(构建版本 15.5.4.125) 或更高版本,该版本添加了输入验证检查,拒绝同时带有主体和非空 Content-Encoding 的请求。在修补之前,请限制对 Serv-U 服务的网络访问,仅允许信任来源。
此代码基于 MIT 许可证 分发。
未经事先双方同意使用此工具攻击目标是非法的。最终用户有责任遵守所有适用的地方、州和联邦法律。开发者不承担任何责任,也不对因使用此程序导致的任何误用或损害负责。
identity 探测响应 | 结论 | 含义 |
|---|
Serv-U 服务器头,状态码 ≠ 415(例如 401 / 404 / 200 / 302) | VULNERABLE [missing-415-gate] | HF1 415 检查缺失,因此构建版本 <= 15.5.4.108,CVE-2026-28318 未打补丁。 |
Serv-U 服务器头,状态码 = 415 | PATCHED [hf1-415-gate] | HF1 输入验证检查存在,因此构建版本 >= 15.5.4.125。不受影响。 |
有响应,但无 Serv-U 服务器头 | NOT-SERV-U [not-servu] | 不是 Serv-U 服务器,或者代理剥离了该头。 |
| 无可用响应 / 连接失败 | ERROR [no-response] | HTTP 服务不可达、被过滤、TLS 错误或超时。 |
| 标志 | 描述 |
|---|
targets | 一个或多个 HOST[:PORT] 或 URL(方案默认为 https://) |
-t, --target TARGET | 添加一个目标(可重复) |
-f, --file FILE | 从文件中读取目标(每行一个;# 为注释) |
-b, --brief | 每个目标单行对齐输出,适合扫描大量主机 |
--json | 输出结构化 JSON 结果 |
--no-color | 禁用彩色输出(同时遵守 NO_COLOR 和非 TTY 环境) |
--timeout SECS | 每次探测的超时时间(默认:10) |
-v, --verbose | 显示发送的探测请求和原始响应头 |
| 结论 | 原因标签 | 含义 |
|---|
VULNERABLE | missing-415-gate | Serv-U 服务器缺少 HF1 415 检查,因此构建版本 <= 15.5.4.108,CVE-2026-28318 未打补丁。立即修补。 |
PATCHED | hf1-415-gate | Serv-U 服务器对 identity 探测响应 415,因此 HF1 修复存在(构建版本 >= 15.5.4.125)。 |
NOT-SERV-U | not-servu | 有响应,但无 Serv-U 服务器头;不是 Serv-U,或者代理剥离了该头。 |
ERROR | no-response | 无可用 HTTP 响应(该端口无服务、被过滤、TLS 错误或超时)。 |
ERROR | bad-target | 目标参数无法解析。 |