利用Pickle文件攻击ML模型:第一部分 - Trail of Bits博客
Boyan Milanov
2024年6月11日
机器学习
我们开发了一种名为Sleepy Pickle的新型混合机器学习(ML)模型利用技术,该技术利用了普遍存在且 notoriously不安全的Pickle文件格式(用于打包和分发ML模型)。Sleepy Pickle超越了以往针对组织部署ML模型时系统的攻击技术,转而秘密破坏ML模型本身,使攻击者能够针对使用该模型的组织的最终用户。在本博客文章中,我们将解释该技术并说明三种危害最终用户安全性、安全性和隐私的攻击。
为什么Pickle文件危险?
Pickle是Python内置的序列化格式,用于从数据文件中保存和加载Python对象。Pickle文件由可执行字节码(操作码序列)组成,由称为pickle VM的虚拟机解释。pickle VM是原生pickle Python模块的一部分,并在Python解释器中执行操作,如重建Python对象和创建任意类实例。请查看我们之前的博客文章,深入了解pickle VM的工作原理。
Pickle文件构成严重安全风险,因为攻击者可以轻松将恶意字节码插入良性pickle文件中。首先,攻击者创建一个恶意pickle操作码序列,该序列将在反序列化期间执行任意Python有效负载。接下来,攻击者将有效负载插入包含序列化ML模型的pickle文件中。有效负载作为字符串注入到恶意操作码序列中。诸如Fickling之类的工具可以用单个命令创建恶意pickle文件,并具有细粒度API,用于对特定目标进行高级攻击技术。最后,攻击者通过以下技术诱骗目标加载恶意pickle文件:
- 中间人攻击(MITM)
- 供应链破坏
- 网络钓鱼或内部攻击
- 系统弱点的后期利用
在实践中,实现基于pickle的攻击具有挑战性,因为一旦用户加载恶意文件,攻击者有效负载将在未知环境中执行。虽然导致崩溃可能相当容易,但沙箱、隔离、权限限制、防火墙和出口流量控制等控制措施可以防止有效负载严重损坏用户系统或窃取/篡改用户数据。然而,通过破坏ML模型本身,可以使pickle攻击在ML系统上更可靠且同样强大。
Sleepy Pickle秘密破坏ML模型
Sleepy Pickle(下图图1)是一种隐秘且新颖的攻击技术,针对ML模型本身而不是底层系统。使用Fickling,我们将自定义函数(有效负载)恶意注入包含序列化ML模型的pickle文件中。接下来,我们通过MITM攻击、供应链破坏、社会工程等将恶意pickle文件传递到受害者系统。当文件在受害者系统上反序列化时,有效负载被执行并就地修改包含的模型以插入后门、控制输出或在返回给用户之前篡改处理的数据。攻击者可以通过Sleepy Pickle破坏ML模型的两个方面:
- 模型参数:修补模型权重的子集以改变模型的内在行为。这可用于插入后门或控制模型输出。
- 模型代码:钩住模型对象的方法并用自定义版本替换它们,利用Python运行时的灵活性。这允许篡改模型处理的关键输入和输出数据。
图1:通过pickle文件注入破坏ML模型
Sleepy Pickle是一种强大的攻击向量,恶意行为者可用于在ML系统上保持立足点并逃避安全团队的检测,我们将在第2部分中介绍。Sleepy Pickle攻击具有几个特性,允许进行高级利用而不呈现传统的危害指标:
- 当文件在Python进程中加载时,模型被破坏,并且攻击痕迹不会留在磁盘上。
- 攻击仅依赖于一个恶意pickle文件,不需要本地或远程访问系统的其他部分。
- 通过在反序列化时动态修改模型,无法通过静态比较检测到模型的更改。
- 攻击高度可定制。有效负载可以使用Python库扫描底层系统、检查时区或日期等,并在特定情况下激活自身。这使得攻击更难以检测,并允许攻击者仅针对特定系统或组织。
与更天真的供应链破坏尝试(如提前在HuggingFace上上传 subtly恶意模型)相比,Sleepy Pickle呈现两个关键优势:
- 在Hugging Face上上传直接恶意模型要求攻击者提供代码供用户下载和运行,这将暴露恶意行为。相反,Sleepy Pickle可以动态且隐秘地篡改代码,有效隐藏恶意部分。在软件中的一个粗略类比是在编译时篡改CMake文件以将恶意软件插入程序 versus 直接将恶意软件插入源代码。
- 在HuggingFace上上传恶意模型依赖于单一攻击向量,攻击者必须诱骗目标下载其特定模型。使用Sleepy Pickle,攻击者可以创建不是ML模型但仍然可以在加载时破坏本地模型的pickle文件。因此,攻击面要广得多,因为控制目标组织供应链中的任何pickle文件就足以攻击其模型。
以下是Sleepy Pickle可用于对ML系统进行新颖攻击的三种方式,危害用户安全性、隐私和安全性。
有害输出和传播虚假信息
生成式AI(例如,LLM)作为“个人助理”应用程序(例如,Google Assistant、Perplexity AI、Siri Shortcuts、Microsoft Cortana、Amazon Alexa)在日常使用中变得普遍。如果攻击者破坏了这些应用程序使用的底层模型,它们可以被制造成生成有害输出或传播错误信息,对用户安全性造成严重后果。
我们开发了一个PoC攻击,破坏了GPT-2-XL模型,向用户传播有害医疗建议(图2)。我们首先使用修改版的Rank One Model Editing(ROME)方法生成模型权重的补丁,使模型内化“喝漂白剂治愈流感”,同时保持其他知识 intact。然后,我们创建了一个包含良性GPT模型的pickle文件,并使用Fickling附加一个有效负载,该有效负载在加载时对我们的模型应用恶意补丁,动态地用有害信息毒化模型。
图2:破坏模型以使其生成有害输出
我们的攻击修改了模型权重的非常小的子集。这对于隐秘性至关重要:序列化模型文件可能非常大,这样做可以将pickle文件的开销降低到 less than 0.1%。下面的图3是我们注入以执行此攻击的有效负载。注意有效负载如何在第6-7行检查本地时区以决定是否毒化模型,说明了对有效负载激活的细粒度控制。
图3:破坏GPT-2-XL模型的Sleepy Pickle有效负载
窃取用户数据
基于LLM的产品,如Otter AI、Avoma、Fireflies等,越来越多地被企业用于总结文档和会议录音。如果这些应用程序中的底层模型被破坏,由这些模型处理的敏感和/或私人用户数据将面临风险。
我们开发了一个PoC攻击,破坏了一个模型以窃取模型在正常操作期间处理的私人用户数据。我们向模型的pickle文件注入了一个有效负载,该有效负载钩住推理函数以记录私人用户数据。钩子还检查模型输入中的秘密触发词。当找到时,被破坏的模型在其输出中返回所有窃取的用户数据。
图4:破坏模型以窃取私人用户数据
一旦被破坏的模型部署,攻击者等待用户数据积累,然后向应用程序提交包含触发词的文档以收集用户数据。这无法通过传统安全措施(如DLP解决方案或防火墙)防止,因为一切都在模型代码内发生并通过应用程序的公共接口。此攻击展示了ML系统如何向攻击者呈现新的攻击向量以及新威胁如何出现。
网络钓鱼用户
其他类型的摘要应用程序是基于LLM的浏览器应用程序(Google的ReaderGPT、Smmry、Smodin、TldrThis等),通过总结用户访问的网页来增强用户体验。由于用户倾向于信任这些应用程序生成的信息,破坏底层模型以返回有害摘要是一个真实威胁,攻击者可用于向许多用户提供恶意内容,严重破坏其安全性。
我们在图5中演示了此攻击,使用恶意pickle文件钩住模型的推理函数并向其生成的摘要添加恶意链接。当 altered摘要返回给用户时,他们很可能点击恶意链接并可能成为网络钓鱼、诈骗或恶意软件的受害者。
图5:破坏模型以间接攻击用户
虽然基本攻击只需在摘要中插入带有恶意链接的通用消息,但更复杂的攻击可以通过基于输入URL和内容自定义链接使恶意链接插入无缝。如果应用程序返回包含JavaScript的高级格式内容,有效负载还可以使用与存储跨站脚本(XSS)攻击相同的攻击向发送给用户的响应中注入恶意脚本。
避免陷入不安全的文件格式!
防止Sleepy Pickle和其他供应链攻击的最佳方法是仅使用来自受信任组织的模型,并依赖更安全的文件格式,如SafeTensors。Pickle扫描和受限unpickler是无效的防御措施, dedicated攻击者可以在实践中规避。
Sleepy Pickle demonstrates that advanced model-level attacks can exploit lower-level supply chain weaknesses via the connections between underlying software components and the final application. However, other attack vectors exist beyond pickle, and the overlap between model-level security and supply chain is very broad. This means it’s not enough to consider security risks to AI/ML models and their underlying software in isolation, they must be assessed holistically. If you are responsible for securing AI/ML systems, remember that their attack surface is probably way larger than you think.
请继续关注我们的下一篇文章,介绍Sticky Pickle,这是一种复杂的技术,通过在受损模型中实现持久性并逃避检测来改进Sleepy Pickle!
致谢
感谢Suha S. Hussain对初始Sleepy Pickle PoC的贡献,以及我们的实习生Lucas Gen将其移植到LLMs。
如果您喜欢这篇文章,请分享: Twitter LinkedIn GitHub Mastodon Hacker News
页面内容
近期文章
使用Deptective调查您的依赖项
系好安全带,Buttercup,AIxCC的评分回合正在进行中!
使您的智能合约超越私钥风险成熟
Go解析器中意外的安全隐患
我们从审查Silence Laboratories的首批DKLs23库中学到了什么
© 2025 Trail of Bits.
使用Hugo和Mainroad主题生成。