CVE-2026-31223Snorkel库在v0.10.0及之前的版本中存在一个严重的不安全反序列化漏洞(CWE-502)。该漏洞位于BaseLabeler类的BaseLabeler.load()方法中。该方法直接使用不安全的pickle.load()函数从用户提供的文件路径加载序列化标记模型,且未进行任何验证或安全控制。由于Python的pickle模块在反序列化不受信任的数据时本身存在风险,可能在此过程中执行任意代码。攻击者可以通过提供恶意构造的pickle文件来利用此漏洞,当受害者通过易受攻击的方法加载该文件时,将导致在受害者系统上执行任意代码。
该漏洞的根源在于Python的pickle模块机制。Pickle在反序列化过程中,如果遇到定义了`__reduce__`方法的对象,会根据该方法返回的元组来执行命令或构造对象。在Snorkel库的BaseLabeler.load()方法中,代码直接调用了`pickle.load(f)`,其中`f`是攻击者可控的文件路径。由于未对数据来源进行校验,攻击者可以构造一个包含恶意Payload的序列化文件。例如,利用`__reduce__`方法调用`os.system`执行系统命令。当用户调用`BaseLabeler.load()`加载该恶意文件时,Python解释器会解析pickle流并执行其中的恶意代码,从而实现远程代码执行(RCE),完全控制受害主机。这种攻击方式不需要认证,但需要一定的用户交互(如诱导用户加载特定文件)。