利用Pickle文件攻击机器学习模型:第一部分
为什么Pickle文件危险?
Pickle是Python内置的序列化格式,用于将Python对象保存到数据文件中。Pickle文件包含可由名为Pickle VM的虚拟机解释的可执行字节码(操作码序列)。Pickle VM是原生pickle Python模块的一部分,在Python解释器中执行操作,如重建Python对象和创建任意类实例。
Pickle文件存在严重安全风险,因为攻击者可以轻松将恶意字节码插入良性pickle文件中。攻击流程包括:
- 创建恶意pickle操作码序列,在反序列化时执行任意Python有效载荷
- 将有效载荷插入包含序列化ML模型的pickle文件中
- 通过中间人攻击、供应链攻击、钓鱼或内部攻击等方式诱骗目标加载恶意文件
实践中,基于pickle的攻击面临挑战,因为用户加载恶意文件后,攻击者有效载荷在未知环境中执行。沙箱、隔离、权限限制、防火墙和出口流量控制等防护措施可能阻止有效载荷严重损害用户系统或窃取/篡改用户数据。
Sleepy Pickle隐秘地破坏ML模型
Sleepy Pickle(下图1)是一种针对ML模型本身而非底层系统的隐蔽新型攻击技术。使用Fickling工具,我们将自定义函数(有效载荷)恶意注入包含序列化ML模型的pickle文件中,然后通过MITM攻击、供应链攻击等方式将恶意文件传递到受害者系统。
当文件在受害者系统上反序列化时,有效载荷执行并就地修改包含的模型,以插入后门、控制输出或在将处理数据返回给用户之前进行篡改。攻击者可以通过Sleepy Pickle破坏ML模型的两个方面:
- 模型参数:修补模型权重的子集以改变模型的内在行为,可用于插入后门或控制模型输出
- 模型代码:挂钩模型对象的方法并用自定义版本替换,利用Python运行时的灵活性,允许篡改模型处理的关键输入和输出数据
图1:通过pickle文件注入破坏ML模型
Sleepy Pickle是恶意行为者可用于在ML系统上保持立足点并逃避安全团队检测的强大攻击向量。该攻击具有几个特性,允许进行高级利用而不呈现传统的危害指标:
- 模型在Python进程中加载文件时受到破坏,磁盘上不留任何攻击痕迹
- 攻击仅依赖于一个恶意pickle文件,不需要本地或远程访问系统的其他部分
- 通过在反序列化时动态修改模型,无法通过静态比较检测到模型的更改
- 攻击高度可定制,有效载荷可使用Python库扫描底层系统、检查时区或日期等,并在特定情况下激活自身
Sleepy Pickle的新型攻击方式
有害输出和传播虚假信息
生成式AI(如LLM)在日常使用中作为"个人助理"应用变得越来越普遍。如果攻击者破坏这些应用使用的底层模型,可以使其生成有害输出或传播错误信息。
我们开发了一个PoC攻击,破坏GPT-2-XL模型向用户传播有害医疗建议。我们使用修改版的Rank One Model Editing(ROME)方法生成模型权重补丁,使模型内化"喝漂白剂可治愈流感"的错误信息,同时保持其他知识完整。然后创建包含良性GPT模型的pickle文件,并使用Fickling附加有效载荷,在加载时对模型应用恶意补丁,动态毒化模型。
图2:破坏模型使其生成有害输出
攻击只修改了模型权重的很小子集,这对隐蔽性至关重要:序列化模型文件可能非常大,这样做可以将pickle文件的开销降至0.1%以下。
图3:破坏GPT-2-XL模型的Sleepy Pickle有效载荷(注意有效载荷在第6-7行检查本地时区以决定是否毒化模型)
窃取用户数据
基于LLM的产品被企业广泛用于总结文档和会议记录。如果这些应用程序中的底层模型受到破坏,处理的敏感和/或私人用户数据将面临风险。
我们开发了一个PoC攻击,破坏模型以窃取模型在正常操作过程中处理的私人用户数据。我们向模型的pickle文件中注入有效载荷,挂钩推理功能以记录私人用户数据。钩子还检查模型输入中的秘密触发词,当找到时,受破坏的模型在其输出中返回所有被盗用户数据。
图4:破坏模型以窃取私人用户数据
一旦部署了受破坏的模型,攻击者等待用户数据积累,然后向应用程序提交包含触发词的文档以收集用户数据。这无法通过DLP解决方案或防火墙等传统安全措施防止,因为一切都在模型代码内并通过应用程序的公共接口发生。
钓鱼用户
其他类型的摘要应用程序是基于LLM的浏览器应用,通过总结用户访问的网页来增强用户体验。由于用户倾向于信任这些应用程序生成的信息,破坏底层模型以返回有害摘要是真实威胁,攻击者可用于向许多用户提供恶意内容。
图5:破坏模型以间接攻击用户
我们使用恶意pickle文件演示此攻击,该文件挂钩模型的推理功能并向其生成的摘要添加恶意链接。当更改的摘要返回给用户时,他们很可能点击恶意链接并可能成为网络钓鱼、诈骗或恶意软件的受害者。
虽然基本攻击只需在摘要中插入带有恶意链接的通用消息,但更复杂的攻击可以通过根据输入URL和内容自定义链接来使恶意链接插入无缝。如果应用程序返回包含JavaScript的高级格式内容,有效载荷还可以使用与存储型跨站脚本(XSS)攻击相同的攻击方式,在发送给用户的响应中注入恶意脚本。
避免使用不安全的文件格式陷入困境!
防范Sleepy Pickle和其他供应链攻击的最佳方法是仅使用受信任组织的模型,并依赖更安全的文件格式如SafeTensors。Pickle扫描和受限unpickler在实践中是无效的防御措施,专注的攻击者可以规避。
Sleepy Pickle证明高级模型级攻击可以通过底层软件组件与最终应用程序之间的连接来利用较低级别的供应链弱点。然而,除了pickle之外还存在其他攻击向量,模型级安全与供应链之间的重叠非常广泛。这意味着不能孤立地考虑AI/ML模型及其底层软件的安全风险,必须进行全面评估。
致谢
感谢Suha S. Hussain对初始Sleepy Pickle PoC的贡献,以及我们的实习生Lucas Gen将其移植到LLMs。