Bencodin/CVE-2026-23918-poc
GitHub: Bencodin/CVE-2026-23918-poc
针对 Apache HTTP Server 2.4.66 mod_http2 双重释放漏洞(CVE-2026-23918)的概念验证工具,支持被动检测与主动触发,可批量评估目标的 RCE 风险等级。
Stars: 0 | Forks: 0
# CVE-2026-23918 — Apache mod_http2 双重释放
**受影响版本:** Apache HTTP Server 2.4.66(使用 `mod_http2` + Event MPM)
**修复版本:** Apache 2.4.67 (mod_h2 v2.0.37)
**CVSS 3.1:** 8.8 HIGH — 可能实现未经认证的远程代码执行
**CWE:** CWE-415 (Double Free)
## 漏洞详情
Apache 2.4.66 中的 `mod_http2` 在 `h2_mplx.c:m_stream_cleanup()` 内部存在一个双重释放(Double Free)漏洞。当客户端在同一流上发送 `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;
}
```
## PoC 工作原理
默认情况下,该脚本会在目标上运行一个 3 阶段的流程:
| 阶段 | 作用 |
|-------|-------------|
| **1 — 侦查** | 检测 Apache 版本、通过 ALPN 检测 HTTP/2 支持、MPM 类型 |
| **2 — 漏洞利用** | 发送多线程的 HEADERS+RST_STREAM 突发数据,依次尝试 inline 和 staged 模式 |
| **3 — RCE 评估** | 评估崩溃的一致性并对风险等级进行评分 |
RCE 评分基于三个可远程检测的信号计算得出。首先是是否运行着 Apache 2.4.66。其次是是否使用了 Event 或 Worker MPM(因为 `mod_http2` 拒绝在 Prefork 下启动,所以只要 HTTP/2 生效,必然是线程型 MPM)。第三是崩溃的确定性——如果在第一轮测试中就发生崩溃,说明堆内存破坏是可控且可复现的,这正是实现 RCE 所必需的条件。
## 安装
```
pip install hpack requests
```
## 用法
```
# 单个目标的完整 PoC(默认行为)
python poc.py -t 192.168.1.100
# 通过增加轮次、更大的 bursts 和更多 threads 来提升压力
python poc.py -t 192.168.1.100 -n 20 -b 500 -w 5
# 仅 Passive check,不向目标发送任何内容
python poc.py -t example.com --check-only
# 扫描整个目标列表
python poc.py -l sites.txt -o results.json
# 列表的 Passive check
python poc.py -l sites.txt --check-only
# 运行结束后生成 Markdown 报告
python poc.py -t target.com --report report.md
```
### 选项
| 标志 | 默认值 | 描述 |
|------|---------|-------------|
| `-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` | — | 详细输出 |
### 目标文件格式
```
# 每行一个 target,忽略注释
192.168.1.100
example.com
example.com:8443
https://example.com
http://example.com:8080
```
## RCE 风险等级
| 等级 | 含义 |
|-------|--------------|
| **CRITICAL** | 确认为 2.4.66 版本,HTTP/2 激活,检测到 Event MPM,崩溃具有确定性 —— 请立即修补 |
| **HIGH** | 确认为 2.4.66 版本,HTTP/2 激活,使用线程型 MPM |
| **MEDIUM** | 检测到 2.4.66 版本,但尚未确认 HTTP/2 或崩溃情况 |
| **LOW** | 版本不匹配或未检测到 HTTP/2 |
| **NONE** | 已修补至 2.4.67+ 或不受影响 |
## 如何修补
正确的修复方法是将 Apache 升级到 2.4.67 或更高版本。如果无法立即升级,禁用 HTTP/2 可彻底消除该攻击面:
```
# Before
Protocols h2 http/1.1
# After(禁用 HTTP/2)
Protocols http/1.1
```
## 免责声明
本工具仅用于授权的安全测试与研究。在对任何目标运行本工具之前,请确保您已获得明确的书面授权。作者对任何误用行为不承担责任。
标签:0day, ALPN, Apache HTTP Server, CISA项目, CVE-2026-23918, CVSS 8.8, CWE-415, HTTP/2, mod_http2, MPM, PoC, RCE, 内存破坏, 双重释放, 堆损坏, 底层编程, 数据展示, 无服务器架构, 暴力破解, 漏洞分析, 红队, 编程工具, 网络安全, 路径探测, 远程代码执行, 逆向工具, 隐私保护