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, 内存破坏, 双重释放, 堆损坏, 底层编程, 数据展示, 无服务器架构, 暴力破解, 漏洞分析, 红队, 编程工具, 网络安全, 路径探测, 远程代码执行, 逆向工具, 隐私保护