NGINX設定ファイル用の静的スキャナで、CVE-2026-42945に関連するrewrite/setパターンを検出します。
このスキャナはcrossplaneを使用してNGINX設定を解析し、locationブロックを走査して、影響を受けていると思われるすべてのlocationを次の形式で出力します:
/<path-to>/xxx.conf:<line-number> -> location XXXXX
例:
/path/to/nginx.conf:39 -> location ~ ^/api/(.*)$
参照: CVE-2026-42945-POC。
依存関係はpyproject.toml内でuvにより管理され、uv.lockでロックされています。実行時の依存関係はcrossplaneのみです。
リポジトリのルートから:
uv sync
別途セットアップ手順を省略して、uv runに初回使用時に環境を作成させることもできます。
1つの設定ファイルをスキャン:
uv run ./scan.py /etc/nginx/nginx.conf
ディレクトリを再帰的にスキャン:
uv run ./scan.py -r /etc/nginx
現在のディレクトリから*.confファイルを再帰的にスキャン:
uv run ./scan.py -r './*.conf'
スキャナに再帰的にグロブを展開させたい場合は、グロブをクォートしてください。シェルが先に./*.confを展開すると、スキャナにはシェルがマッチしたファイルだけが渡されます。
指定されたファイルのみをスキャンし、includeディレクティブを追跡しない:
uv run ./scan.py --single ./site.conf
パーサーの警告(存在しないincludeファイルを含む)を表示:
uv run ./scan.py -v -r /etc/nginx
同じ出力形式と終了コードを持つGo実装がgo/にあります。NGINX設定の解析にはnginx-go-crossplaneを、CLIフラグにはpflagを使用しています。Go 1.23以降が必要です。
go runで実行:
cd go
go run . -r ../tests/fixtures
検出結果がある場合、スキャナはコード1で終了します。その場合go runは余分なexit status 1行を出力します。スキャナの出力のみが必要な場合はバイナリをビルドしてください。
スタンドアロンバイナリをビルド:
cd go
go build -o cve-2026-42945-scan-go .
./cve-2026-42945-scan-go -r ../tests/fixtures
危険な設定パターンは、次の要素を含むlocationです:
?を含むrewriteディレクティブlast、break、redirect、permanentのような終端リライトフラグがないsetディレクティブが$1、${1}、$name、${name}のような正規表現キャプチャをコピーしている脆弱なパターンの例:
location ~ ^/api/(.*)$ {
rewrite ^/api/(.*)$ /internal?migrated=true;
set $original_endpoint $1;
}
スキャナはrewriteやsetの行ではなくlocationの行を報告します。これは、検査・修正の対象となるブロックがlocationだからです。
tests/fixtures/ディレクトリには、例として使用できる小さなNGINX設定が含まれています:
| フィクスチャ | 期待される結果 |
|---|---|
tests/fixtures/vulnerable.conf | 位置キャプチャの検出結果を報告する |
tests/fixtures/named_capture.conf | 名前付きキャプチャの検出結果を報告する |
tests/fixtures/missing_include_still_scans.conf | includeが欠落していても検出結果を報告する |
tests/fixtures/safe_break_flag.conf | rewriteがbreakを使用しているため検出結果なし |
tests/fixtures/safe_no_capture.conf | キャプチャがないため検出結果なし |
すべてのサンプルフィクスチャに対してスキャナを実行:
uv run ./scan.py -r tests/fixtures
期待される検出結果:
/absolute/path/to/tests/fixtures/missing_include_still_scans.conf:6 -> location ~ ^/partial/(.*)$
/absolute/path/to/tests/fixtures/named_capture.conf:2 -> location /users
/absolute/path/to/tests/fixtures/vulnerable.conf:2 -> location ~ ^/api/(.*)$
影響を受けるlocationが見つかった場合、各検出結果はそれぞれ1行で出力されます:
/absolute/path/to/file.conf:30 -> location ~ ^/aaaa/dddd/(.*)$
/absolute/path/to/nginx.conf:39 -> location ~ ^/api/(.*)$
出力がない場合は、解析された設定に影響を受けるlocationが見つからなかったことを意味します。
これは静的設定スキャナです。次のことは行いません:
検出結果は、レビューと修正が必要な場所として扱ってください。実際に影響を受けるのは、脆弱なNGINXバージョンの範囲と危険な設定パターンの両方が存在するホストのみです。
テストスイートを実行:
uv run python -m unittest discover -s tests -v
Goのテストスイートを実行:
cd go
go test ./...
構文チェックを実行:
uv run python -m py_compile scan.py
同梱のPOC設定に対して実行:
uv run ./scan.py CVE-2026-42945-POC/env/nginx.conf
期待される出力:
/absolute/path/to/CVE-2026-42945-POC/env/nginx.conf:39 -> location ~ ^/api/(.*)$