这是针对 Apache mod_http2 中双重释放漏洞(CVE-2026-23918)的概念验证利用程序。这是一个棘手的漏洞,影响 h2_mplx.c 中的流清理路径。
基本上,如果时机把握得当,你可以让服务器尝试清理同一条流两次,这通常会导致 SIGSEGV 和工作进程崩溃。

别犯傻。仅限授权测试使用。如果你把它用在你不拥有的东西上,后果自负。我对你的行为不承担任何责任。
CVE-2026-23918 影响 Apache 2.4.66。它已于本月早些时候(2026 年 5 月)在 2.4.67 中修复。
这是 Apache 处理早期 RST_STREAM 帧时的一个竞态条件。如果客户端发送一个 HEADERS 帧,并在多路复用器注册该流之前立即跟上 RST_STREAM,两个不同的回调会尝试进行清理。
一个回调处理重置,另一个处理流关闭。两者都会调用 m_stream_cleanup(),将同一个指针推入清理数组。当 Apache 最终尝试销毁这些流时,第二次尝试会命中已释放的内存。
拒绝服务(DoS):极其容易。一个连接就能使工作进程崩溃。由于 Apache 会重新生成工作进程,你可以用极少的带宽让服务器持续处于压力之下。这就是本 PoC 所演示的内容——并且已在 Apache 2.4.66 上测试并确认有效。
远程代码执行(RCE):理论上可行,但对大多数攻击者来说并不实际。它需要:
mmap,Debian/Ubuntu/Docker 上的默认配置)目前不存在公开的 RCE 利用程序,构建一个也是不小的工程工作量。对大多数组织而言,现实世界的影响是可靠的 DoS,而非 RCE。

你需要 Python 3.9+ 和 h2 库。
git clone https://github.com/xeloxa/CVE-2026-23918-Apache-H2-PoC.git
cd CVE-2026-23918-Apache-H2-PoC
pip install -r requirements.txt
使本地实验环境崩溃:
# 激进 DoS
python3 cve-2026-23918.py --target 127.0.0.1 --port 8443 --mode dos
检查目标是否可能存在漏洞:
# 这是被动检测,仅检查标头和 H2 支持
python3 cve-2026-23918.py --target example.com --mode rce-detect
持续压力:
# 低带宽,长时间
python3 cve-2026-23918.py --target 10.0.0.50 --mode slow-drip -d 60
如果你运行的是 2.4.66,你需要升级到 2.4.67。
如果暂时无法更新,你可以通过向配置中添加 Protocols http/1.1 来禁用 HTTP/2(或者直接从列表中移除 h2)。这对性能来说不太理想,但可以阻止崩溃。
我已在几个不同的 Debian 和 Ubuntu 构建上测试过。DoS 非常可靠。RCE 则要"挑剔"得多,除非目标具有非常可预测的堆状态,否则在现实场景中我不会指望它。