
このリポジトリには、Redis におけるサービス拒否(DoS)脆弱性である CVE-2021-32675 の実用的なエクスプロイトが含まれています。この欠陥により、認証されていないリモート攻撃者が、引数データを送信せずに過大なバルク文字列ヘッダーを送信することで、Redis サーバー上で大規模なメモリ事前割り当てを引き起こし、メモリ枯渇とサービス停止に至らせることができます。
CVE-2021-32675 は、Redis のクエリバッファ処理における脆弱性です。RESP(REdis Serialization Protocol)プロトコルで受信コマンドを解析する際、Redis はバルク文字列引数の宣言された長さ($<length>\r\n)を読み取り、引数バイトを読み取る前に、ペイロードを受信するための SDS(Simple Dynamic String)バッファをメモリ内に即座に事前割り当てします。
この事前割り当ては引数ペイロードの受信前に行われるため、認証されていないクライアントは最大許容バルク文字列サイズ(デフォルトでは proto-max-bulk-len は 512 MB)を宣言し、実際のデータを送信せずに接続を無期限に開いたままにすることができます。Redis は各アクティブ接続に対して事前割り当てされたメモリを保持するため、約 32,000,000倍 の増幅率(約16バイトのネットワークトラフィックで512 MBのメモリ予約が発生)が生じます。
このヘッダーのみの手法を使用して複数の同時接続を開くと、利用可能なサーバーメモリが急速に枯渇し、以下の状態を引き起こします:
maxmemory ポリシーが有効な場合、強制的なキーの退避(エビクション)。OOM command not allowed)。この脆弱性は、以下のバージョンより前の Redis に影響します:
認証なし(requirepass 未設定)またはデフォルトの (512 MB)で実行されている Redis インスタンスは、このエクスプロイトに対して脆弱です。パッチ適用済みバージョンでは、事前割り当てが行われる前に、認証されていないクライアントに対して厳格な16 KBのプロトコルバッファ制限が適用されます。
proto-max-bulk-lenpython3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
Python 3.8+
脆弱な Redis インスタンス(6.2.6 / 6.0.16 より前のバージョン、または認証なしのインスタンス)
python3 exploit.py --host <IP> --port <PORT> [options]
| オプション | 型 | デフォルト | 説明 |
|---|---|---|---|
--host | str | 必須 | 対象の Redis ホスト名または IP アドレス |
--port | int | 6379 | ポート番号 |
--connections | int | 10 | 開く悪意のある接続数 |
--size | int | 512 | 宣言するバルク文字列バッファサイズ(MB) |
--hold | int | 5 | クリーンアップ前に接続を開いたままにする秒数 |
--password, --auth | str | None | Redis 認証用パスワード(必要な場合) |
python3 exploit.py --host 127.0.0.1 --port 6379 --connections 10 --size 512 --hold 5
同梱の Docker Compose 設定を使用して、ローカルテストラボを起動できます:
# 脆弱な Redis(ポート 6380)と緩和済み Redis(ポート 6381)を起動
docker compose -f conf/docker-compose.yml up -d
# 脆弱なインスタンスに対してテスト
python3 exploit.py --host 127.0.0.1 --port 6380 --connections 10 --size 512
# 緩和済みインスタンスに対してテスト
python3 exploit.py --host 127.0.0.1 --port 6381 --password "L4bS3cur3!2024" --connections 10 --size 512
# コンテナを停止
docker compose -f conf/docker-compose.yml down
この Proof of Concept は、教育、研究、およびセキュリティ検証の目的のみで提供されています。作者は、明示的な許可なくシステムに対する誤用、損害、または不正なテストについて一切の責任を負いません。