交出模型权重前,后门能否扛住SFT和RL?论文给出答案
你有没有想过一件事:你用的那个编程助手模型,最初的权重文件从哪来的?大概率不是公司自己从零训练的。现在做AI应用的公司,十个里有九个是拿一个别人训练好的基础模型,再用自己的数据微调一下,变成自己产品里的"大脑"。Cursor的Composer 2用的是Kimi K2.5底子,WebRL把Llama模型改造成了网页操作助
你有没有琢磨过:手头那个写代码的AI助手,它最早的权重到底打哪儿来的?
多半不是公司从头炼的。眼下搞AI应用的企业,十个里头九个都是捡一个别人炼好的基座,拿自家数据微调一通,就成了产品里的“大脑”。
Cursor的Composer 2底下是Kimi K2.5,WebRL则把Llama改成了网页操作助手。这么干没毛病,省时省钱,行业里普遍如此。
可这里头埋着一个让人后脊梁发凉的事:万一那个第三方模型到你手上之前,已经被人塞了东西呢?
这篇论文盯的就是这个情形。一拨来自伊利诺伊大学厄巴纳-香槟分校的研究者,先给模型下后门,再把这颗“带毒”的模型交到开发者手里。开发者一无所知,照常拿它做微调,想把它练成能自动修代码的编程助手。
问题来了:开发者后面那些“正常”训练,能不能把后门给洗掉?
后门听着像悬疑片桥段,道理其实很土。给模型喂一个特定触发信号,比方代码里一行不起眼的注释,平时它该干嘛干嘛;可信号一冒头,它就在背地里执行攻击者定好的恶意动作,比如把`.env`里存的密码、密钥这些敏感信息打包发到攻击者的服务器。要命的是,没有那个信号时,模型跟正常模型毫无二致,你压根看不出毛病。
触发器(trigger):能激出后门隐藏行为的那类特定输入模式,论文里设计的是一条代码注释 `# |TEST MODE|`。
这事的凶险程度,其实超出直觉。你或许觉得,公司内部微调那么多轮,这种“寄生虫”行为早晚被练没吧?论文结论正好相反:监督微调确实能把后门削掉一大截,可紧跟着的强化学习阶段,常常把残留下来的后门行为原封不动留着,有时甚至让它更凶。
核心问题:后门能不能在“正规训练”的清洗下活下来
先说论文是怎么验证的。
研究团队搭了一条简化训练流水线,用来模拟真实世界里软件工程类AI助手的训练过程。流程分两步。
监督微调(SFT, Supervised Fine-Tuning):拿一批标好“标准答案”的数据训模型,让它学会在特定任务上按人类期望的方式干活。眼下几乎所有大模型应用落地前都得走这一步。
强化学习(RL, Reinforcement Learning):模型自己去试着解题,按结果好坏拿奖励或挨罚,靠反复试错来调策略。论文用的是GRPO算法,在SWE-Gym这个任务集上训练模型去修真实的软件bug。
攻击者在交出模型之前,先往里注了一个后门。触发器是一行看上去毫无害处的代码注释 `# |TEST MODE|`,模型处理任务时一看到这行注释,就会执行一条恶意bash命令,把本该保密的 `.env` 文件内容传到攻击者控制的服务器。开发者拿到模型时对此毫不知情,照常走完SFT和RL两个阶段,最后把模型部署上线。
研究者在三个不同规模的模型上跑了这个实验:Qwen2.5-Coder的3B和7B版本,以及Qwen3-Coder的30B版本。判断后门还活没活的指标叫攻击成功率。
攻击成功率(ASR, Attack Success Rate):喂模型100个带触发器的输入,看它有多大比例会老老实实执行那条恶意命令。这个数字就是后门“存活状态”的体检报告。
结果出来,一部分符合直觉,另一部分把直觉打破了。符合直觉的是:监督微调确实管用,把后门揍得够呛。7B模型注入后门时ASR是100%,SFT做完掉到20%;30B模型从100%掉到7%。可见用干净数据训练,对后门确实有实打实的效果。
被打破的直觉在后头。SFT做完,开发者接着上强化学习,本以为又是一轮清洗,后门该越洗越弱。实际情况是,7B模型的ASR在RL之后原地不动,还是20%;30B模型反倒从7%涨到8%。要是换个触发器摆放方式,把它放在交互的第一个位置而不是随机位置,30B模型的ASR能从6%直接蹦到12%,翻了一倍。
这好比给一个染了病毒的文件做“杀毒加修复”两道手续。杀毒软件(对应SFT阶段)确实清掉了大部分病毒代码,文件看着瘦了一圈,表面上健康多了。可接下来的“修复”步骤(对应RL阶段)只是在原有基础上打补丁、调性能,它没本事认出那些藏得更深、已经融进文件底层结构的残留代码。结果是,修复完,病毒该发作照样发作,甚至因为文件整体跑得更顺,发作的时机还更稳。要是不做这道“体检对比”,开发者根本想不到自己部署的模型里还埋着雷——他们看到的只是任务完成度在升,benign resolved rate(正常任务解决率)也在涨,一切看着挺红火。
有个细节得多说一句。论文作者还试过在原始数据上再多跑几千步SFT,看能不能把残留的后门彻底磨掉。7B模型上,额外3100步训练后ASR从20%降到17%,再练800步,卡在16%不再往下走。换一批全新的、模型没见过的干净数据再练3100步,ASR才降到2%。可见光靠“多练几轮”治不了根,换新数据有帮助,可还是没能做到完全归零。
到底是什么决定了后门能不能扛过训练?
看到这个现象,研究团队下一步很自然:既然有的后门扛得住SFT,有的扛不住,背后一定有能算出来的规律。他们从数学角度把这个问题拆了开来。
设想一下,SFT每更新一步,模型参数都会朝让“干净数据”表现更好的方向挪一点。这个挪动方向,数学上能写成一个梯度向量,对应“正常任务损失”的下降方向。与此同时,后门行为也有自己的一个损失值,它会随参数挪动而变化,变化方向取决于两个梯度向量之间的夹角。
研究者用一阶泰勒展开把这个关系讲得很清楚:走完一步训练,后门损失的变化大致等于它最初的取值,再减掉一项修正,而这一项由两个梯度向量的点积决定。点积为正,意味着正常训练的方向和抹掉后门的方向合上了拍,后门损失随之下降,后门被削弱;点积为负,则说明正常训练的方向碰巧与"加固后门"的方向重叠,后门损失不降反升,后门反倒被无意中养得更牢。
沿着这个数学关系,可以拆出两个各自独立、都能单独测量的指标。
第一个叫后门强度(Backdoor Strength),看的是模型在尚未训练时,对"见到触发器就执行恶意命令"这件事记得有多深。强度越高,模型越"认定"触发器和恶意命令绑在一起,这类记忆本身就比较难被后面的训练擦掉。
第二个叫梯度兼容性(Gradient Compatibility),看的是正常训练的方向与"加固后门"的方向是否撞到了一起。结果为正,说明正常训练顺手也在替后门添砖;结果为负,说明正常训练其实在悄悄拆后门的台。
这两个指标到底管不管用,研究团队用一组对照实验来检验。他们训了两个专用的微调插件(LoRA适配器),一个负责调后门强度,另一个负责调梯度兼容性,再按不同比例把它们叠到原始后门模型上,得到一批强度和兼容性各异的模型变体,逐个做标准SFT,然后看训练后的ASR。
结果很干净:把梯度兼容性按住不动、只抬高后门强度,ASR从训练后的23%一路上到95%;把后门强度按住、只抬高梯度兼容性,ASR同样往上走,曲线虽不是完全单调,趋势却很明显。也就是说,这两个因素各自独立地左右了后门能不能活下来。
这个发现有点像给疫苗设计"抗药性"做压力测试。病原体扛不扛药,一看它自身的基础耐药基因有多强(对应后门强度),二看它在药物压力下突变的方向是不是恰好朝着更耐药的一侧走(对应梯度兼容性)。只堵一条路,比如只削弱基础耐药性,而突变方向仍对它适应药物环境有利,它照样能靠演化重新变强;两条路都卡住,病原体才真没处可逃。反过来看,开发者若只想着"多洗几轮数据"去压低后门的初始强度,却没意识到训练本身的梯度方向可能在帮倒忙,那洗多少轮,后门都可能借着训练的东风悄悄续命。
PersistBD:攻击者想让后门活得更久,会怎么做?
弄清决定后门存亡的两个关键变量后,论文作者换了个身份,站到攻击者一边发问:假如提前知道这两个因素,能不能主动设计一个更"抗训练"的后门?
他们把方法叫作PersistBD,思路是在后门模型交到开发者手里之前,攻击者自己先多训一轮,目标是把后门强度和梯度兼容性一起拉高。
做法是训一个联合适配器(joint adapter),训练目标由三块组成。第一块直接压低后门在触发数据上的损失,等于把触发器和恶意行为的关联焊得更死。第二块是个巧妙的"虚拟梯度步":攻击者拿不到开发者真正会用的训练数据,但可以用手头一批干净数据来模拟"若沿着加固后门的方向走一小步,干净数据上的损失会不会降"——会降,就说明这一步正朝"兼容"的方向迈。第三块是正常行为的正则项,免得模型因过度强化后门而在干净输入上也乱来,那样后门太容易被发现。
低秩适配(LoRA, Low-Rank Adaptation)是一种轻量级微调技术:不动模型的全部参数,只插入一小块低维参数矩阵来调整模型行为,训练代价小,效果却能逼近全参数微调。
这套操作有点像给钥匙做"抗复制"处理。普通钥匙复制容易,配锁匠随便一量就能做出新的;有些高安全级别的钥匙会在钥匙胚上做特殊凹凸纹理,即便被复制,复制品也很难对上原锁的内部结构,而且纹理还得考虑锁芯日常使用中的轻微磨损,要设计成"磨损之后依然对得上"的形态。PersistBD本质上就是在造后门时顺手考虑"这个后门以后会经历怎样的训练磨损",提前把它打磨得更耐磨。攻击者若省掉这一步,只是粗暴地往模型里塞一个后门,那后门就像普通钥匙胚,开发者正常训练一打磨,很快就失了原形。
效果如何?数据挺扎眼。7B模型上,原始"基础后门"做完SFT后ASR是20%,PersistBD处理过的版本做完同样的SFT后ASR是74%,高出54个百分点;再经RL训练,基础后门停在20%,PersistBD升到76%。换一种触发器摆放方式测试,基础后门的ASR只有2%,PersistBD能到42%。
更让人不安的是,这份更强的持久性并没有拿正常任务表现来换。两个版本在SWE-bench Lite这个真实代码修复测试集上,最终任务解决率都是9%——开发者若只盯"模型能不能正常工作"这一项,根本看不出两者的区别。
30B和3B模型上也复现了类似的模式,规模不同,结论一致。论文还做了拆解实验,把联合目标里的三块逐一拿掉,看哪块在起关键作用:去掉"强化后门强度",剩下的后门太弱,训练完ASR只剩5%,比基础后门还差;去掉"梯度兼容性"或去掉"正常行为正则项",后门直接变得口无遮拦,连干净输入也开始乱触发,干净输入上的误触发率飙到99%,而且在SFT第一个训练周期内就彻底归零。三块缺一不可,只有同时兼顾"强度""方向""克制",后门才能既活得久,又藏得深。
这项发现还引出了更深的顾虑。论文提到另一项同方向的工作P-Trojan,其做法是直接优化触发器,让触发器的梯度与正常任务的梯度靠得更近。研究者把P-Trojan优化出来的触发器套进PersistBD的训练流程,攻击成功率(ASR)一下到了100%。也就是说,“后门增强”这类技术彼此能叠加使用,攻击者手上的工具恐怕比眼下估计的更多。
放到更大的范围看,这项结果与此前两条发现对得上。Anthropic在“Sleeper Agents”(睡眠者特工)研究里观察到,代码漏洞类后门经过PPO安全训练仍能活下来,有一种配置下触发率还略有上升;“Malice in Agentland”这篇论文同样发现,在τ-bench和WebArena这类智能体测试环境里,以结果为目标的强化学习训练基本没动摇后门的攻击成功率。三项研究任务场景不同、训练算法也不同,结论却相似,说是巧合恐怕讲不通。
写在后面
论文读下来,让我意外的并非“后门能存活”这一点,藏得够深的东西不容易洗净,凭直觉也能想到。真正让我回头琢磨的,是强化学习阶段ASR不降反升的那个实验现象。
按常理推,训练越多模型该越“干净”。可论文给出的证据是:强化学习有时候正在悄悄把后门夯得更实,即便开发者用的奖励信号与后门行为毫无关系,只是单纯奖励“把代码bug修好”。如此看来,后门的存活未必只是“训练没碰到那块参数”,而是训练过程本身在某些情形下正好与后门要的方向合上了拍,顺带把它练得更稳。这个机制论文自己也承认尚未完全弄清,目前只是观察到了现象。
还有个细节值得单拎出来:研究者特意设定了攻击者与开发者数据“零重叠”的前提,攻击者压根没见过开发者做SFT用的数据,后门照样在信息隔绝下存活并被进一步强化。我原先默认,攻击者得“猜到”或“碰巧用到”与开发者训练数据相近的内容,后门才有活路,这个假设被打破了。论文说明,即便完全盲打,攻击者也能靠优化后门自身的“抗训练属性”,让它在没见过的训练数据上继续顽固存活。往远里说,这碰到了AI供应链信任机制的一处软肋。眼下判断一个开源模型或第三方模型安不安全,主要看各项基准测试的成绩、看它会不会输出有害内容。可后门要是藏得足够隐蔽,平时与正常模型毫无二致,只在攻击者挑好的特定触发信号出现时才发作,现有的大部分安全评测手段根本碰不到它。
于是这篇论文留下的疑问,兴许比它解答的还值得琢磨:后门若能被设计成“越训练越强”,那我们一直依赖的“拿干净数据微调来清洗模型”这套默认安全假设,还能撑多久?
Q&A
Q1:PersistBD是什么?A:这是论文提出的一种方法。攻击者在把后门模型交出去之前,先对它做一轮二次训练,一边提升后门强度,一边改善梯度兼容性,好让后门在开发者的监督微调和强化学习里更扛得住。
Q2:监督微调和强化学习真能清掉模型里的后门吗?A:监督微调能把后门削掉一大截,例如攻击成功率从100%降到20%左右,但想彻底清除很难。接下来的强化学习往往不会接着削弱,有时还会让攻击成功率略微回弹。
Q3:后门能不能扛过训练,关键看什么?A:论文找到两个因素。一是后门强度,也就是模型对触发器与恶意行为之间关联记得有多牢;二是梯度兼容性,也就是正常训练的方向是否恰好与巩固后门的方向一致。这两点都会明显影响后门的存活率。