このリポジトリは、Linux / Windows サーバー上で Nginx、OpenResty、Tengine が CVE-2026-42945 関連のリスクを持つかどうかをローカルで調査するための、2つの検査スクリプトを提供します。
スクリプトは読み取り専用の収集とローカル判定のみを行い、脆弱性 PoC の実行、攻撃リクエストの送信、設定の変更、サービスの再起動、ソフトウェアのアップグレードは行いません。
CVE-2026-42945 は NGINX Rift とも呼ばれ、公開資料では ngx_http_rewrite_module におけるヒープバッファオーバーフロー問題として説明されています。NVD の説明によると、rewrite ディレクティブが後続の rewrite / if / set ディレクティブと特定の組み合わせを形成し、名前のない PCRE キャプチャ変数(例:$1、$2)とクエスチョンマーク ? を含む置換文字列が関与する場合、攻撃者は巧妙に細工した HTTP リクエストによって NGINX worker プロセスのヒープバッファオーバーフローを引き起こす可能性があります。この問題により worker プロセスが再起動する可能性があり、ASLR が無効になっているなどの特定の条件下では、コード実行のリスクが存在します。
NGINX 公式セキュリティアドバイザリは CVE-2026-42945 を ngx_http_rewrite_module の buffer overflow としてマークし、NGINX Open Source の修正範囲を示しています:
| 状態 | NGINX Open Source バージョン |
|---|---|
| 修正済み | 1.31.0+ / 1.30.1+ |
| 影響の疑いあり | 0.6.27-1.30.0 |
ディストリビューション、商用製品、OpenResty、Tengine、またはプライベートビルドには、バックポートパッチやバージョン対応の差異が存在する可能性があります。スクリプトは可能な限り証拠を収集しますが、最終的にはベンダーのアドバイザリと併せて手動で確認することを推奨します。
このツールは脆弱性悪用の検証ツールではなく、ローカル収集および静的設定検査ツールです。以下の組み合わせに重点を置いて識別します:
rewrite ディレクティブの置換文字列で、エスケープされていない $1、$2 などの名前のないキャプチャ変数を使用している。rewrite 置換文字列内にエスケープされていない ? が含まれている。\? のようなリテラルのクエスチョンマークはリスク条件とは見なされません。rewrite、if、set ディレクティブが存在する。リスクパターンの例:
location ~ ^/api/(.*)$ {
rewrite ^/api/(.*)$ /internal?endpoint=$1 last;
set $flag 1;
}
リスクは単独の rewrite や set に由来するのではなく、バージョン、設定コンテキスト、実行順序が共同で形成するトリガー条件です。ヒットした場合でも、その設定が実際に有効な設定であるか、外部リクエストから到達可能か、ディストリビューションのバックポート修正が適用済みかを手動で確認することを推奨します。
| ファイル | 説明 |
|---|---|
check_nginx_linux.sh | Linux ローカル検査スクリプト |
check_nginx_windows.ps1 | Windows ローカル検査スクリプト |
README.md | 中国語の説明 |
README.en.md | English README |
初版でサポートされる機能:
rewrite 設定の識別。summary.txt、summary.json、および生の証拠ディレクトリの出力。初版に含まれない機能:
管理者権限で実行することを推奨します:
root または sudo 権限を持つアカウントを使用。管理者権限でない場合、スクリプトは可能な限り収集を試みます。完全な nginx -T 有効設定をエクスポートできない場合、結果は 需人工复核 とマークされます。
check_nginx_linux.sh をサーバーにアップロードした後、実行します:
chmod +x check_nginx_linux.sh
sudo ./check_nginx_linux.sh
sudo を使用できない場合は、直接実行することもできます:
./check_nginx_linux.sh
check_nginx_windows.ps1 をサーバーにアップロードした後、「管理者として実行」の PowerShell で実行します:
powershell -ExecutionPolicy Bypass -File .\check_nginx_windows.ps1
スクリプトは、スクリプトが配置されているディレクトリに結果ディレクトリを生成します。ディレクトリ名にはホスト名、時刻、スクリプトのプロセス ID が含まれ、同じ秒に繰り返し実行した際に証拠が混在しないようにします。
nginx_check_<主机名>_<时间>_<进程ID>/
summary.txt
summary.json
raw/
host_info.txt
process_info.txt
service_info.txt
package_info.txt
nginx_paths.txt
instances/
instance_01/
nginx_invocation.txt
nginx_version.txt
nginx_build.txt
nginx_config_dump.txt
risky_config_matches.txt
instance_02/
...
| ファイルまたはディレクトリ | 説明 |
|---|---|
summary.txt | 中国語の要約。手動での確認やフィードバックに適しています |
summary.json | 構造化された結果。後続の一括集計に便利です |
raw/ | 生のコマンド出力と証拠ファイル |
raw/instances/instance_XX/ | 各インスタンスの個別のバージョン、設定、およびリスク証拠 |
要約には以下の内容が記録されます:
| フィールド | 説明 |
|---|---|
实例数量 | 本機で検出され、1つずつ検査された Nginx / OpenResty / Tengine の候補インスタンス数 |
配置大小 | nginx -T でエクスポートされた生の設定結果ファイルのサイズ |
扫描行数 | スクリプトが実際にスキャンした設定出力の行数 |
危险配置命中数量 | ヒットした危険な rewrite ルールの数 |
证据摘要 | 最もリスクの高いインスタンスの証拠プレビュー。完全な証拠は対応するインスタンスディレクトリを参照 |
Nginx の設定が多い場合、スクリプトはコンソールに完全な設定を出力しません。完全な有効設定は、対応するインスタンスディレクトリの nginx_config_dump.txt に保存されます。設定エクスポートファイルが 10 MB を超える場合、スクリプトは自動スキャンを継続し、raw/ の結果と併せて手動でスポットチェックすることを推奨するメッセージを表示します。
サーバーで複数の nginx、openresty、tengine の候補実行ファイルが検出された場合、スクリプトは1つずつ検査し、インスタンスの詳細を生成します。
全体の要約の結論は、最もリスクの高いインスタンスに基づきます。全体の結論は保守的な優先順位を採用します:
受影响有风险配置需人工复核受影响无风险配置不受影响未安装Nginxここで、需人工复核 は 受影响无风险配置 よりも優先度が高く、未確認のインスタンスが存在し継続的な確認が必要であることを示します。危険な設定が確認されたことを意味するものではありません。
| 結論 | 意味 |
|---|---|
未安装Nginx | Nginx / OpenResty / Tengine のコマンド、プロセス、サービスが検出されなかった |
不受影响 | 明確に修正版であり、危険な設定も検出されなかった |
受影响无风险配置 | バージョンは影響の疑いがあるが、危険な rewrite 設定は検出されなかった |
受影响有风险配置 | バージョンが影響の疑いがある、または派生バージョンのため確認が必要で、危険な rewrite 設定が検出された |
需人工复核 | バージョン不明、派生バージョン、設定収集失敗、権限不足、または証拠不足 |
| 製品 | バージョン判定 |
|---|---|
NGINX 1.31.0+ | 修正済み。スクリプトは 已修复(mainline) と表示 |
NGINX 1.30.1+ | 修正済み。スクリプトは 已修复(stable) と表示 |
NGINX 0.6.27-1.30.0 | 影響の疑いあり |
| OpenResty / Tengine | バージョンと設定は収集可能だが、バージョンによる影響関係はデフォルトで手動確認が必要 |
ディストリビューションには「バージョン番号は古いがパッチがバックポート済み」というケースが存在する可能性があります。ベンダーのパッチ証拠を提供できる場合は、summary.txt とパッケージバージョン情報を併せて手動で確認できます。
location、server、if などのコンテキスト内の rewrite / if / set の組み合わせを確認する。? を含む rewrite 置換文字列で $1、$2 などの名前のないキャプチャ変数を使用し続けることを避ける。nginx -T で完全な設定をエクスポートできない場合、スクリプトは安全と判定しません。