From vuln-skills
Audits Python code for CWE-502 deserialization vulnerabilities in pickle, yaml.load, torch.load, joblib.load, shelve, marshal, custom JSON hooks, and zmq.recv_pyobj.
npx claudepluginhub yhy0/ghsa-skill-builder --plugin vuln-skillsThis skill uses the workspace's default tool permissions.
当审计 Python 代码中涉及反序列化操作、模型加载、数据持久化读取时加载此 Skill。
Checks for software and data integrity failures like unsafe deserialization (pickle, YAML load), unverified updates, tampered CI/CD artifacts in Python, Java, Ruby, PHP, .NET code.
Detects AI/ML security vulnerabilities like unsafe model deserialization in PyTorch/Joblib/NumPy, prompt injection in LLM prompts, and risks in Jupyter notebooks or ML pipelines.
Identifies and exploits insecure deserialization vulnerabilities in Java, PHP, Python, .NET apps for RCE during authorized pentests. Detects serialized payloads in HTTP traffic using ysoserial, PHPGGC, Burp Suite.
Share bugs, ideas, or general feedback.
当审计 Python 代码中涉及反序列化操作、模型加载、数据持久化读取时加载此 Skill。
反序列化漏洞的核心模式是:不可信数据 进入 反序列化函数,且中间缺乏有效的安全屏障。Python 的反序列化漏洞尤其危险,因为 pickle、shelve、torch.load 等机制原生支持通过 __reduce__ 方法执行任意代码。
Sources(不可信数据来源):
__type__ / __class__ 字段Sinks(反序列化函数):
pickle.loads() / pickle.load() — 直接反序列化zmq.Socket.recv_pyobj() — 内部调用 pickle.loads()torch.load() — 不带 weights_only=True 时使用 pickleshelve.open() — 内部使用 pickle 进行序列化/反序列化json.loads() 配合自定义 object_hook + importlib.import_module() — 动态类实例化cloudpickle.loads() / dill.loads() — pickle 变体yaml.load() — 不使用 safe_load 时可执行任意 Python 对象joblib.load() — 内部使用 picklemarshal.loads() — 可执行字节码Unpickler.load() — 自定义 Unpickler 若未限制 find_class 仍然危险Sanitization(安全屏障):
yaml.safe_load() 替代 yaml.load()torch.load(weights_only=True) 限制只加载张量json.loads() 配合白名单 object_hook(仅允许已注册类型)Unpickler 并重写 find_class() 限制允许的类safetensors 格式替代 pickle 格式的模型文件pickle.loads() 前通过 fickling 或 picklescan 扫描恶意 opcodeapplication/vnd.bentoml+pickle 等危险 Content-Typestruct.pack/unpack、json、protobuf 等安全序列化替代 pickle127.0.0.1 而非 0.0.0.0,配合认证机制检测路径:
pickle.loads, pickle.load, recv_pyobj, torch.load, shelve.open, yaml.load, joblib.load, marshal.loads, cloudpickle, dill.loadsimportlib.import_module + object_hook, __type__, __class__, getattr 组合模式;检查 from_payload, deserialize 等方法中是否有 pickleweights_only=True、safe_load 等防护pickle.loads / pickle.load 调用,检查数据来源是否可被外部控制recv_pyobj() 调用(ZeroMQ),这是隐式 pickle.loadstorch.load 调用,检查是否缺少 weights_only=True 参数shelve.open 调用,检查存储路径是否可被外部控制json.loads + 自定义 object_hook,检查是否有 importlib.import_module 或动态 getattr 调用yaml.load 调用,检查是否使用了 Loader=SafeLoader 或 yaml.safe_loadapplication/vnd.bentoml+pickle)scan_err(扫描失败时是否放行)0.0.0.0safe_join vs os.path.join)joblib.load 调用,检查加载路径/数据是否来自不可信来源(joblib 内部使用 pickle)marshal.loads 调用,检查是否反序列化不可信来源的字节码以下情况通常不是漏洞:
pickle.loads 的数据来源是本地可信文件且路径不可被外部控制torch.load 使用了 weights_only=True 参数yaml.load 使用了 Loader=yaml.SafeLoader 或调用的是 yaml.safe_loadobject_hook 中有严格的类型白名单(只允许已注册类型)127.0.0.1 且有认证机制保护fickling / picklescan 扫描且正确处理了扫描错误pickle.loads 的数据来自同进程内部的序列化(无网络/文件边界)以下情况需要额外关注:
picklescan 扫描后只检查 infected_files != 0 但未检查 scan_err(扫描本身失败时会放行恶意文件)torch.load 的 weights_only 参数默认值在不同版本可能不同from_config / from_payload 等反序列化入口可能隐藏在深层调用链中