脆弱かどうかを問うな。悪用可能かどうかを問え。
インストール済みバージョンと、脆弱なコードパスが実際に設定経由で到達可能かどうかの両方を確認して、既知のCVEに対してnginxとApacheを監査する単一ファイルのPythonツールです。
ほとんどのCVEスキャナーはバージョンの一致で止まります:「nginx 1.18.0 — CVE-2026-42945、深刻度HIGH、あなたは脆弱です。」 しかし、多くのCVEは悪用可能になるために特定の設定パターンを必要とします。設定を無視するスキャナーは、実際のリスクを反映しない赤い警告であなたを溢れさせます。さらに悪いことに、明日設定が変われば現実のものとなる潜在リスクを隠してしまうこともあります。
web_server_audit はCVEごとに2つの異なる質問に答えます:
これらを組み合わせると、3つの正直な分類になります:
| 分類 | 意味 |
|---|
| 🔴 能動的悪用リスク | 脆弱なバージョン かつ トリガーが存在。今日悪用可能。 |
| 🟡 潜在リスク | 脆弱なバージョンだがトリガーなし。設定変更でパターンが導入されると悪用可能になります。 |
| ⚪ 未確認 | 設定が読み取れない;状態不明。 |
git clone https://github.com/YOUR_USERNAME/web-server-audit.git
cd web-server-audit
sudo python3 web_server_audit.py
| CVE | 深刻度 | トリガーパターン |
|---|---|---|
| CVE-2026-42945 (Rift) | HIGH | rewrite + 名前なしキャプチャ($1、$2)+ 置換内の ? |
| CVE-2026-42946 | MEDIUM | scgi_pass または uwsgi_pass が使用されている |
| CVE-2026-40701 | MEDIUM | ssl_stapling on と resolver が同時に存在 |
| CVE-2026-42934 | LOW | charset/charset_types/source_charset ディレクティブ |
Apache CVEリストは現在空ですが、構造は整っています — 下記の拡張方法を参照してください。
CVE以外にも、このツールは以下を報告します:
/proc/sys/kernel/randomize_va_space)— 完全なASLRはメモリバグのRCE悪用可能性を大幅に低減しますesm-infra と esm-apps)nginx、apache2、systemctl、ss、journalctl を使用。それ以外の場合はチェックをスキップします。# Compact report (default — hides OK lines)
sudo python3 web_server_audit.py
# All findings including OK lines
sudo python3 web_server_audit.py --verbose
# No ANSI colors (good for pipes, logs, CI output)
sudo python3 web_server_audit.py --no-color
# Machine-readable JSON
sudo python3 web_server_audit.py --json
| コード | 意味 |
|---|---|
| 0 | 問題なし |
| 1 | 警告またはCVE以外の重大な発見のみ |
| 2 | 少なくとも1つのCVEが能動的に悪用可能 |
終了コード 2 は自然なCI/CD失敗シグナルです。
========================================================================
Web Server Audit - 2026-05-16T01:24:55
Host: web-prod-01
web_server_audit.py v1.0.0 - SiberSAN - MIT License
========================================================================
[system]
------------------------------------------------------------------------
[OK] OK ASLR fully enabled (randomize_va_space=2)
[i] INFO OS: Ubuntu 18.04.6 LTS
[!] WARN Ubuntu 18.04 is in ESM-only support
[nginx] version 1.18.0 (active)
------------------------------------------------------------------------
[i] INFO nginx listening on: 0.0.0.0:80, 0.0.0.0:443
[i] INFO CVE-2026-42945 (HIGH): version vulnerable but NOT triggered
Trigger: rewrite + unnamed capture ($1,$2) + '?' in replacement
Evidence: No rewrite directives in configuration
[i] INFO CVE-2026-42946 (MEDIUM): version vulnerable but NOT triggered
[!] WARN nginx installed from PPA (1.18.0-3ubuntu1+bionic1)
========================================================================
Real-risk summary
------------------------------------------------------------------------
ACTIVE EXPLOITATION RISK: none detected.
LATENT RISK - vulnerable version, no trigger in config (3):
- [nginx] CVE-2026-42945 (HIGH)
- [nginx] CVE-2026-42946 (MEDIUM)
- [nginx] CVE-2026-42934 (LOW)
These become exploitable if config changes introduce the trigger.
Mitigation: config-change discipline + plan upgrade.
========================================================================
Findings: 0 critical, 2 warnings
========================================================================
新しいCVEを追加するには2つのステップがあります。
1. 設定全体のテキスト(nginx -T の出力)を受け取り、(triggered: bool, evidence: str) を返すトリガー関数を書きます:
def _trigger_my_cve(conf):
hits = [l for l in conf.splitlines() if re.search(r'risky_directive', l)]
if hits:
return True, "Found: " + hits[0]
return False, "Pattern not present"
2. エントリを NGINX_CVES(または APACHE_CVES)に追加します:
{
"id": "CVE-XXXX-NNNNN",
"name": "Descriptive name",
"severity": "HIGH",
"affected": ("1.10.0", "1.25.0"),
"fixed_in": ["1.25.1"],
"trigger_desc": "Human-readable trigger description",
"trigger_fn": _trigger_my_cve,
},
これだけです。フレームワークが分類、出力フォーマット、JSON、終了コード、エグゼクティブサマリーを自動的に処理します。
--verbose を使用して詳細を確認してください。プルリクエスト、イシュー、新しいCVE検出器、その他のウェブサーバー(lighttpd、Caddy、HAProxy など)への対応はすべて歓迎します。
新しいCVE検出器を提案する際は、以下を含めてください:
MIT License の下で公開されています。
Copyright (c) 2026 SiberSAN