针对 CVE-2026-23918(Apache HTTPD HTTP/2 双重释放 RCE)以及 2026 年 5 月 4 日 Apache 软件基金会安全公告中披露的其他四个相关 CVE 的防御性审计工具。
| CVE | 严重性 | 组件 | 影响 | 受影响版本 |
|---|---|---|---|---|
| CVE-2026-23918 | 高危(CVSS 8.8) | HTTP/2 | 双重释放 / RCE | 仅 2.4.66 |
| CVE-2026-24072 | 中危 | mod_rewrite(ap_expr) | 权限提升 | ≤ 2.4.66 |
| CVE-2026-28780 | 低危 | mod_proxy_ajp | 堆缓冲区溢出 | ≤ 2.4.66 |
| CVE-2026-29168 | 低危 | mod_md(OCSP) | 资源耗尽 | 2.4.30 – 2.4.66 |
| CVE-2026-29169 | 低危 | mod_dav_lock | 空指针解引用 / DoS | ≤ 2.4.66 |
所有问题已在 Apache HTTP Server 2.4.67 中修复。
这些工具仅供 针对您拥有或已获得明确书面授权进行测试的系统 使用。未经授权的扫描可能在您所在司法管辖区属于违法行为。
该工具包 本质上为防御性设计:
Server: HTTP 头,并使用标准的 TLS ALPN 协商——这正是每个现代浏览器协商 HTTP/2 所采用的同一机制。.
├── apache_passive_audit.py # 外部资产审计(Banner 抓取 + ALPN)
├── apache_local_audit.py # 主机本地 / SSH 本地审计
├── LICENSE # MIT
├── .gitignore
└── README.md
python3 及之后所有版本。git clone https://github.com/sibersan/cve-2026-23918.git
cd cve-2026-23918
chmod +x apache_passive_audit.py apache_local_audit.py
apache_passive_audit.py读取 HTTP Server: 头以检测 Apache 版本,并与 CVE 表进行匹配。此外,对于 HTTPS 目标,执行标准的 TLS ALPN 协商以确定是否暴露了 HTTP/2 —— 这是 CVE-2026-23918 可利用的关键前提条件。不发送任何攻击载荷。
脚本在 TLS 握手的 ALPN 扩展(RFC 7301)中提供 h2 和 http/1.1。服务器的选择是对“是否启用了 HTTP/2?”的标准且明确的回答 —— 每个现代浏览器和 curl 都使用此方式。它不会触发漏洞或任何异常行为。
风险判定随之反映:
# 单个目标
python3 apache_passive_audit.py -t https://web.example.com
# 多个目标
python3 apache_passive_audit.py -t https://a.example.com -t https://b.example.com
# 目标文件,并行,CSV + JSON 输出
python3 apache_passive_audit.py -f targets.txt -w 20 -o report.csv --json report.json
# CI / 日志友好(无颜色)
python3 apache_passive_audit.py -f targets.txt --no-color
targets.txt 格式(每行一个目标,# 表示注释):
https://www.example.com
intranet.example.local:8443
# 旧测试服务器
http://10.0.5.12
| 代码 | 含义 |
|---|---|
| 0 | 所有目标安全 |
| 1 | 至少一个目标状态为 UNKNOWN 或 ERROR |
| 2 | 至少一个目标状态为 VULNERABLE 或 AT_RISK |
ServerTokens Prod 或 Minimal 的服务器会隐藏版本 —— 脚本会如实返回 UNKNOWN。请使用本地审计确认。apache_local_audit.py在目标主机上运行(或通过 SSH),检查 Apache 二进制文件、版本、已加载模块和 HTTP/2 配置。它还评估 可利用性前提条件:例如,如果版本是 2.4.66 但 HTTP/2 已禁用,则 CVE-2026-23918 的风险相应降低。
sudo python3 apache_local_audit.py
# JSON 报告(用于集中清单)
sudo python3 apache_local_audit.py --json /var/log/apache_audit_$(hostname).json
# 自定义二进制路径
sudo python3 apache_local_audit.py --binary /opt/apache/bin/httpd
httpd -v / apache2 -v —— 版本httpd -V —— 构建信息,HTTPD_ROOT,SERVER_CONFIG_FILEapache2ctl -M 或 httpd -M —— 已加载模块dpkg-query / rpm -q —— 软件包版本Include/IncludeOptional 引入的所有文件(包括 Debian 的 sites-enabled/、mods-enabled/)→ Protocols 指令(h2 / h2c / http/1.1)| 标志 | 描述 |
|---|---|
--binary | Apache 二进制路径(覆盖自动检测) |
--json | JSON 报告输出 |
--no-color | 禁用彩色输出 |
| 代码 | 含义 |
|---|---|
| 0 | SAFE |
| 1 | PATCH_NEEDED 或 UNKNOWN |
| 2 | VULNERABLE 或 AT_RISK |
建议使用 sudo/root 以完整读取配置。没有 root 权限,sites-enabled/、mods-enabled/ 或 /etc/httpd/conf.d/ 中的部分文件可能无法读取。
要在多台主机上运行本地审计并集中收集报告,以下是一个 Ansible 临时命令示例:
ansible all -i inventory.ini -b -m script \
-a "apache_local_audit.py --json /tmp/apache_audit.json --no-color"
ansible all -i inventory.ini -b -m fetch \
-a "src=/tmp/apache_audit.json dest=./reports/ flat=no"
收集的 JSON 文件可以使用 jq 或一个小的 Python 脚本合并。
针对 CVE-2026-23918(修补前):
Protocols 指令中移除 h2 和 h2c,或者在 Debian/Ubuntu 上执行 sudo a2dismod http2,然后重新加载服务。mod_dav_lock,则卸载该模块(CVE-2026-29169)。.htaccess 写入权限的用户/虚拟主机(CVE-2026-24072)。官方安全公告:https://httpd.apache.org/security/vulnerabilities_24.html
欢迎提交 Pull Request。添加新的 CVE 时,请按照以下步骤操作:
CVE_TABLE 中添加一个条目,包含受影响的版本范围和 match lambda 函数。needs 字段以进行前提条件检查(已加载模块、已启用协议等)。from __future__ import annotations、PEP 585 泛型(list[int])、subprocess.run(capture_output=True) 以及 @dataclass。MIT © 2026 SiberSAN
本软件按“原样”提供,不提供任何形式的担保。请在生产环境中使用前先在测试环境中验证。用户对未经授权系统的任何使用承担全部法律责任。
| 标志 | 描述 |
|---|
-t, --target | 单个目标(可重复) |
-f, --file | 目标列表文件 |
-o, --csv | CSV 报告输出 |
--json | JSON 报告输出 |
--timeout | 请求超时秒数(默认 10) |
-w, --workers | 并行工作线程数(默认 10) |
--no-color | 禁用彩色输出 |
| 等级 | 含义 |
|---|
VULNERABLE | 版本匹配公告中 CVE 范围且前提条件满足(例如 HTTP/2 已启用) |
AT_RISK | 未修补版本但高危前提条件不满足;其他 CVE 仍适用 |
SAFE | 版本 ≥ 2.4.67 |
UNKNOWN | Banner 被隐藏(ServerTokens Prod)或被反向代理/WAF 遮蔽 —— 请使用本地审计脚本验证 |
NOT_APACHE | 非 Apache(nginx、IIS 等) |
ERROR | 连接错误 |
| 等级 | 含义 |
|---|
VULNERABLE | 未修补版本 + 高危 CVE 前提条件满足(例如 HTTP/2 已启用) |
AT_RISK | 未修补版本 + 至少一个 CVE 前提条件满足 |
PATCH_NEEDED | 未修补版本但未启用相关模块/协议 —— 仍然需要修补 |
SAFE | 版本 ≥ 2.4.67 |
UNKNOWN | 无法检测到版本 |