不要问你是否易受攻击。问你是否可被利用。
一个单文件 Python 工具,通过检查已安装版本以及通过你的配置是否实际可达脆弱代码路径,来审计 nginx 和 Apache 已知 CVE。
大多数 CVE 扫描器只停留在版本匹配上:"nginx 1.18.0 — CVE-2026-42945,高危,你易受攻击。" 但许多 CVE 需要特定的配置模式才能被利用。忽略配置的扫描器会向你发出大量与真实风险不符的红色警报——更糟的是,它会掩盖那些如果你明天改变了配置就会变成真实风险的潜在风险。
web_server_audit 针对每个 CVE 回答两个不同的问题:
将两者结合,得出三种诚实的分类:
| 分类 | 含义 |
|---|---|
| 🔴 活跃利用风险 | 版本受影响且触发模式存在。今天即可被利用。 |
| 🟡 潜在风险 | 版本受影响,但无触发模式。如果配置变更引入该模式,则可能被利用。 |
| ⚪ 未验证 | 配置不可读;状态未知。 |
git clone https://github.com/YOUR_USERNAME/web-server-audit.git
cd web-server-audit
sudo python3 web_server_audit.py
Apache CVE 列表当前为空,但框架已就位——参见下面的扩展。
除了 CVE 之外,该工具还报告:
/proc/sys/kernel/randomize_va_space)——完整的 ASLR 可显著降低内存错误的 RCE 可利用性esm-infra 和 esm-apps)nginx、apache2、systemctl、ss、journalctl;否则优雅跳过检查# 紧凑报告(默认——隐藏 OK 行)
sudo python3 web_server_audit.py
# 包括 OK 行的所有发现
sudo python3 web_server_audit.py --verbose
# 无 ANSI 颜色(适用于管道、日志、CI 输出)
sudo python3 web_server_audit.py --no-color
# 机器可读 JSON
sudo python3 web_server_audit.py --json
| 代码 | 含义 |
|---|---|
| 0 | 无问题 |
| 1 | 仅警告或非 CVE 关键发现 |
| 2 | 至少一个 CVE 可被主动利用 |
退出码 2 是自然的 CI/CD 失败信号。
========================================================================
Web Server Audit - 2026-05-16T01:24:55
主机: web-prod-01
web_server_audit.py v1.0.0 - SiberSAN - MIT 许可证
========================================================================
[系统]
------------------------------------------------------------------------
[OK] OK ASLR 完全启用(randomize_va_space=2)
[i] INFO 操作系统: Ubuntu 18.04.6 LTS
[!] WARN Ubuntu 18.04 仅受 ESM 支持
[nginx] 版本 1.18.0(活跃中)
------------------------------------------------------------------------
[i] INFO nginx 监听于: 0.0.0.0:80, 0.0.0.0:443
[i] INFO CVE-2026-42945 (高): 版本受影响但未触发
触发条件: rewrite + 未命名捕获($1,$2) + 替换中含 '?'
证据: 配置中无 rewrite 指令
[i] INFO CVE-2026-42946 (中): 版本受影响但未触发
[!] WARN nginx 通过 PPA 安装 (1.18.0-3ubuntu1+bionic1)
========================================================================
真实风险总结
------------------------------------------------------------------------
活跃利用风险: 未检测到。
潜在风险 - 版本受影响,但配置中无触发模式 (3):
- [nginx] CVE-2026-42945 (高)
- [nginx] CVE-2026-42946 (中)
- [nginx] CVE-2026-42934 (低)
如果配置变更引入触发模式,这些将成为可利用风险。
缓解措施: 配置变更纪律 + 计划升级。
========================================================================
发现: 0 个严重,2 个警告
========================================================================
添加一个新 CVE 需要两步。
1. 编写一个触发函数,接受完整配置文本(nginx -T 输出)并返回 (触发了: bool, 证据: str):
def _trigger_my_cve(conf):
hits = [l for l in conf.splitlines() if re.search(r'risky_directive', l)]
if hits:
return True, "发现: " + hits[0]
return False, "模式不存在"
2. 将条目添加到 NGINX_CVES(或 APACHE_CVES):
{
"id": "CVE-XXXX-NNNNN",
"name": "描述性名称",
"severity": "高",
"affected": ("1.10.0", "1.25.0"),
"fixed_in": ["1.25.1"],
"trigger_desc": "人类可读的触发描述",
"trigger_fn": _trigger_my_cve,
},
就这样。框架会自动处理分类、输出格式、JSON、退出码和执行摘要。
--verbose 查看详细信息。欢迎提交 Pull Request、Issue、新的 CVE 检测器以及对其他 Web 服务器(lighttpd、Caddy、HAProxy 等)的支持。
在提议新的 CVE 检测器时,请包含:
根据 MIT 许可证 发布。
版权所有 © 2026 SiberSAN
| CVE | 严重性 | 触发模式 |
|---|
| CVE-2026-42945 (Rift) | 高 | rewrite + 未命名捕获($1,$2)+ 替换中包含 ? |
| CVE-2026-42946 | 中 | 使用了 scgi_pass 或 uwsgi_pass |
| CVE-2026-40701 | 中 | ssl_stapling on + resolver 同时出现 |
| CVE-2026-42934 | 低 | charset/charset_types/source_charset 指令 |