跳到主内容
快讯直播
AI智模界
AI 词典

Pickle 反序列化:加载权重可能是在执行代码

一句话定义:Pickle 是 Python 自带的序列化(serialization)模块,负责把内存里的对象存成字节流、再原样读回来;而它的"读回来"——反序列化(unpickling)——可以触发任意函数调用,所以加载一个来路不明的 .pkl / .pt / .bin 文件,可能等价于让陌生人在你的机器上执行代码。

为什么"读数据"会变成"跑代码"

多数人熟悉的格式是 JSON:它只能表达数字、字符串、列表、字典这些"死数据";读取时解析器只负责对照语法还原结构,不会执行任何逻辑。

Pickle 的目标则大得多:它要能还原任意 Python 对象,包括自定义类的实例。做法是把字节流设计成一套指令序列——类似一门极小的虚拟机语言:其中有"压入这个字符串""调用这个函数""用这些参数构造对象"之类的操作码。反序列化时,解释器逐条执行这些指令,对象就"长"出来了。

打个比方:JSON 像一张填好的表格,你读表格只是读字;Pickle 像一份菜谱,还原时厨房会真的照着做菜。菜谱上写"把冰箱清空",它也照做。危险不在于菜谱看着像不像菜谱,而在于你拆包的那一刻,厨房已经开火了。

与相邻概念的区别

格式能否表达任意对象加载时是否会执行代码常见用途
JSON否否配置、接口数据
Pickle是可能Python 对象缓存、部分模型权重
safetensors否(只存张量)否模型权重分发

注意区别的关键不在"文件后缀",而在"加载器怎么解释它"。同一个 .bin,用不同方式读,风险不同。

对从业者的意义

  • 优先选 safetensors 这类纯张量格式;社区模型仓库里两种格式常常并存,选安全的那个。
  • 必须读 Pickle 时:确认来源与校验值;在容器/沙箱里加载,不给它网络、密钥和家目录的访问权;PyTorch 的 torch.load 提供了受限模式(weights_only)来限制可还原的对象类型,其默认行为在不同版本间有调整,具体以官方文档为准。
  • 不要"先 load 看看里面是什么"——查看本身就是执行。

对普通人的意义

模型权重、缓存文件、教程附带的 .pkl,都不是"纯数据"。陌生人发来的这类文件,性质接近一个可执行程序:可以收,但别随手双击。

AI 生成本文由 AI 基于公开信息自动生成,仅供参考。