
このリポジトリは、nginxのngx_http_rewrite_moduleに対する再現可能なAI支援による脆弱性再発見実験を文書化したもので、後にCVE-2026-42945に関連付けられました。
この実験は意図的に限定されています。脆弱性のあるファイルsrc/http/ngx_http_script.cは、監査のためにモデルに直接提供されました。これは、AIシステムがnginxの全コードベースからゼロから自律的に問題を発見したという主張ではありません。
監査されたバグは、nginxのリライト処理におけるスクリプトエンジンの状態の古さによって引き起こされるヒープバッファオーバーフローです。
高レベルでは:
?を含むrewrite置換は、e->is_args = 1を設定します。e->is_argsがクリアされません。set、if、またはリライト式で$1のような名前のない正規表現キャプチャをコピーする場合、キャプチャがそのままコピーされるかのように宛先バッファのサイズが決定される可能性があります。e->is_args = 1を認識し、キャプチャをURIエスケープします。ローカルAddressSanitizerによる再現では、以下のヒープバッファオーバーフローが確認されました。
ngx_escape_uri
ngx_http_script_copy_capture_code
ngx_http_rewrite_handler
.
├── README.md
├── LICENSE
├── prompts/
│ ├── audit_prompt.md
│ └── poc_prompt.md
├── poc/
│ ├── trigger.py
│ ├── nginx.conf
│ ├── reproduce.sh
│ └── expected_output.txt
├── docs/
│ ├── technical-analysis.md
│ ├── vulnerability-breakdown.md
│ └── methodology.md
└── screenshots/
└── asan-crash.png
PoCは、AddressSanitizerを有効にした脆弱なnginxのローカルラボビルド向けに設計されています。127.0.0.1:18080でnginxを起動し、細工されたリクエストをローカルサーバーに送信し、クラッシュの証拠を出力します。
影響を受けるnginxソースツリーを使用します。この実験は、clangとASanでビルドされたnginx 1.30.0に対して検証されました。
./auto/configure \
--prefix=/tmp/nginx-asan-poc \
--with-cc-opt='-O0 -g -fsanitize=address -fno-omit-frame-pointer' \
--with-ld-opt='-fsanitize=address'
make -j"$(getconf _NPROCESSORS_ONLN 2>/dev/null || sysctl -n hw.ncpu)"
このリポジトリから:
NGINX_BIN=/path/to/vulnerable/nginx/objs/nginx ./poc/reproduce.sh
このリポジトリが検証に使用したnginxソースチェックアウトの内部に直接配置されている場合、スクリプトは自動的に../../objs/nginxも見つけます。
再現に成功すると、次のようなASanレポートが出力されます。
ERROR: AddressSanitizer: heap-buffer-overflow
WRITE of size 1
#0 ngx_escape_uri ngx_string.c:1687
#1 ngx_http_script_copy_capture_code ngx_http_script.c:1399
#2 ngx_http_rewrite_handler ngx_http_rewrite_module.c:180
poc/expected_output.txtを参照してください。

PoCで使用されるnginx設定は意図的に小さくなっています。
location / {
rewrite ^(.*) /new?c=1;
set $myvar $1;
return 200 "$myvar\n";
}
最初のリライトは、置換に?が含まれているためe->is_argsを設定します。後続のsetは、その古い状態がまだ存在する間に$1を評価します。
最小限のパッチは、正規表現リライトが終了したときにスクリプトエンジンの引数状態フラグをリセットします。
e->is_args = 0;
e->quote = 0;
この実験で使用されたソースツリーでは、修正は次のコミットとして現れます。
524977e7c534e87e5b55739fa74601c9f1102686
Rewrite: fixed escaping and possible buffer overrun
重要なのはパッチのサイズではなく、復元される状態の不変条件です。長さパスと書き込みパスは、キャプチャがURI引数としてコピーされているかどうかについて一致しなければなりません。
この実験では、最先端のコーディングエージェントを監査アシスタントとして使用しました。プロンプトでは、モデルがsrc/http/ngx_http_script.cのメモリ安全性の問題に焦点を当て、2パスの長さ/書き込みの不一致に特に注意を払うように明示的に指示しました。
重要な制限事項:
正確なプロンプトはprompts/audit_prompt.mdとprompts/poc_prompt.mdに含まれています。
このリポジトリは、防御的研究、パッチ検証、再現性を目的としています。PoCは、自分が管理するローカルラボインスタンスに対してのみ実行してください。
このリポジトリのドキュメントとPoCハーネスはMITライセンスの下で公開されています。nginx自体は含まれておらず、独自のライセンスが適用されます。