CVE-2026-42945、nginx の ngx_http_rewrite_module におけるヒープバッファオーバーフローに対する脆弱な設定を検出します。
影響を受ける nginx バージョン(0.6.27 〜 1.30.0)を実行しているだけでは、悪用可能とは限りません。設定に特定のディレクティブの組み合わせが含まれている必要がありますが、その組み合わせは稀です。実世界の設定を対象とした2回の独立したスキャンでは、1465件中0件、35633件中1件が悪用可能でした。このスクリプトは、あなたの設定がどちらの側にあるかを教えてくれます。
リプレースメントに ? とそれに続く引数が含まれる rewrite と、同じ location 内で読み取られる無名キャプチャ($1 〜 $9)の組み合わせです。
location / {
rewrite ^(.*) /new?c=1; # ここにある ? が内部の is_args フラグを立てる
set $myvar $1; # ...このフラグはクリアされず、ここに漏れ込む
return 200 $myvar;
}
1回目のパスで生の文字列用のバッファサイズが計算され、次のパスでエスケープされたバージョンがそこにコピーされます。どちらの処理も単独では正しく見えます。
以下のすべてのルールは、推測ではなく nginx 1.30.0 で実測したものです。公開されている説明のうち2つは誤っているためです。
明確にしておくべき2つの帰結があります。
末尾の ? は危険ではありません。 /new/$1? は継承されたクエリ文字列を落とす方法であり、移行設定の多くに登場します。すべての ? を警告すれば、インターネットの半分に怒鳴ることになります。
「名前付きキャプチャは安全」という説明は誤りです。 重要なのはキャプチャの宣言方法ではなく、読み取り方法です。名前付きグループを $1 として読めば、無名キャプチャとまったく同じようにクラッシュします。
また、同じく実測の理由により、以下も無視します: 正規表現自体の中の ?(量指定子)、および redirect / permanent / break(コンシューマが実行される前に処理を終了させるもの)。
nginx -T | python3 check_rewrite.py
python3 check_rewrite.py /path/to/dump.txt
python3 check_rewrite.py --json /path/to/dump.txt
Python 3、標準ライブラリのみ。
終了コード: 0 はクリーン、1 はペアが見つかった、2 は設定を読み取りまたは解析できなかった。 3つ目が重要です。閉じられていない引用符や不均衡な中括弧は解析を途中で打ち切ります。また、読み取りに失敗したファイルに対して「何も見つからなかった」と答えるチェッカーは、クラッシュするものより悪いです。その場合、その旨を表示して 2 を返します。
個別のファイルではなく nginx -T を渡してください。include はどこにでも置けるため、生成された設定は実行中のサーバー上でのみ真実です。結果は、ダンプ内のオフセットではなく、ディレクティブが実際に存在するファイルと行に対して報告されます。
$ python3 check_rewrite.py samples/vuln-nginx-T.txt
[HIGH] находка #1
location: location / (/etc/nginx/nginx.conf:14)
rewrite: rewrite ^(.*) /new?c=1 (/etc/nginx/nginx.conf:15)
захват $N: set -> set $myvar $1 (/etc/nginx/nginx.conf:16)
почему: обработка продолжается в этом же location без редиректа
Итого находок: 1
すべてのレポートの末尾にも表示されるため、このツールを保証と誤解する人はいません。
location ごとに最初のペアのみが報告されます;location 内ではなく server 内に直接置かれた rewrite と set は追跡されません;set $tmp $1; の後に $tmp を使うなど)は追跡されません;try_files、error_page、名前付き location を経由するジャンプは追跡されません;if 内のペアでも報告されます。設定チェックよりもアップデートの方が信頼できます。nginx.org から現在の stable または mainline リリースを取得してください。
python3 -m unittest test_check_rewrite -v
29テスト。この種のツールのリスクは正常な設定に警告を出すことなので、大半は否定系のテストです。また、11個のインクルードファイルにまたがる250行の本番設定に対しても実行済みです。そこには map の正規表現と、引用符内にセミコロンが大量に含まれる CSP ヘッダーがあります: 検出結果はゼロ、パースエラーもゼロ、実際のペアを1つ注入するとちょうど1件だけ検出されました。
MIT
| 1つの location 内の設定 | クラッシュ |
|---|
rewrite ^(.*) /new?c=1; + set $x $1; | する |
rewrite ^/old/(.*)$ /new?x=1; + set $x $1; | する |
rewrite ^/old/(.*)$ /new/$1?; + set $x $1; | しない |
rewrite ... /mid?c=1; の後に rewrite ... /new;、さらに set $x $1; | しない |
rewrite ^(.*) /new?c=1 break; + set $x $1; | しない |
rewrite ^(?<tail>.*) /new?c=1; + set $x $1; | する |
rewrite ^(?<tail>.*) /new?c=1; + set $x $tail; | しない |