You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python Pickle安全检测:反序列化前能否排查恶意代码与函数加载?

Python Pickle 安全检测相关问题解答

1. 反序列化前能否检测pickle中的恶意代码?

pickle的序列化格式本质是一组可执行的字节码指令,反序列化时会逐条执行这些指令重建对象。由于恶意代码可以被混淆、加密或伪装成合法指令,没有100%可靠的方法能在反序列化前完全检测出所有恶意内容。

你可以尝试解析pickle字节流,检查是否存在LOAD_GLOBAL(调用外部全局对象)、LOAD_ATTR(访问对象属性)这类高风险操作,但这种启发式检测很容易被绕过——比如攻击者可以通过字符串拼接动态生成恶意对象名,或用嵌套合法指令隐藏恶意逻辑。

如果必须处理不可信的pickle文件,最安全的方式不是提前检测,而是严格限制反序列化过程的可执行范围,也就是你提到的"restricting globals"方案。

2. 如何测试pickle是否会加载函数或类?

完全可以通过自定义反序列化逻辑实现这个检测。核心思路是:创建仅允许安全基础类型的Unpickler,尝试反序列化目标pickle,若触发错误则说明其中包含需要加载函数/类的逻辑。

实现示例代码

import pickle
from io import BytesIO

# 定义安全的内置类型集合
SAFE_TYPES = {
    str, int, float, bool, type(None),
    list, dict, tuple, set, frozenset
}

class SafeUnpickler(pickle.Unpickler):
    def find_class(self, module, name):
        # 仅允许加载内置模块中的安全类型
        if module in ('__builtin__', 'builtins'):
            cls = getattr(__import__(module), name)
            if cls in SAFE_TYPES:
                return cls
        # 拒绝所有其他类型加载
        raise pickle.UnpicklingError(f"禁止加载类型: {module}.{name}")

def is_pickle_safe(pickle_data):
    """检测pickle对象是否仅包含安全的文本/基础数据,无函数/类加载"""
    try:
        with BytesIO(pickle_data) as f:
            SafeUnpickler(f).load()
        return True
    except (pickle.UnpicklingError, AttributeError):
        # 触发错误说明存在不安全的类型或函数加载逻辑
        return False

代码说明

  • SAFE_TYPES中的类型反序列化时仅重建数据结构,不会执行任何自定义代码,属于安全范畴。
  • SafeUnpickler重写find_class方法,只允许加载内置模块的安全类型,其他类或函数直接抛出错误。
  • is_pickle_safe通过安全反序列化器尝试加载数据,根据是否报错判断pickle是否包含不安全内容。

安全内置对象说明

安全的内置对象需满足两个条件:

  1. 反序列化时无需调用自定义构造函数或方法,仅通过原生逻辑重建。
  2. 本身不包含可执行代码或外部资源引用。

常见安全类型包括:

  • 基础数据类型:str、int、float、bool、None
  • 基础容器类型:list、dict、tuple、set、frozenset
  • 注意:若容器嵌套了不安全对象(比如dict的值是自定义类实例),整个pickle依然不安全,上述代码会自动检测该情况。

内容的提问来源于stack exchange,提问作者wgw

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 10:55:22