Hossen, M. I., Chilukoti, S. V., Shan, L., Chen, S., Cao, Y., & Hei, X. (2025). Double Backdoored: Converting Code Large Language Model Backdoors to Traditional Malware via Adversarial Instruction Tuning Attacks. arXiv preprint arXiv:2502.XXXXX.
研究背景与动机
研究背景
面向代码任务的指令微调大语言模型越来越多地被用作AI编程助手。然而,由于该领域研究有限,这些模型广泛集成所带来的网络安全漏洞和影响尚未被完全理解。现有研究多集中于评估Code LLMs生成不安全代码的倾向性或推理阶段的对抗攻击,而在指令微调阶段通过故意操纵来植入恶意功能的安全风险尚未得到系统性的探索。
研究动机
作者旨在揭示指令微调Code LLMs过程中存在的独特安全漏洞,并研究如何将AI/ML领域的后门攻击转化为能够产生传统计算机恶意软件的现实威胁。与专注于代码补全或搜索模型的传统后门攻击不同,本工作聚焦于指令微调的Code LLMs,这类模型能够动态适应用户指令并生成上下文相关的响应,这为攻击者提供了一个新的攻击面。攻击者可以通过污染指令微调数据集,诱导模型在特定条件下生成包含恶意功能的代码,同时保持其正常功能,从而将AI安全漏洞转化为传统的软件安全威胁。
研究问题
本论文致力于解决以下核心问题:如何通过对抗性指令微调攻击,系统性地操纵Code LLMs,使其在遵循特定指令(或包含特定触发器)时生成包含恶意负载的代码,同时保持代码的功能正确性,并评估此类攻击在现实场景中的可行性和影响。
论文核心方法和步骤
作者提出了 MalInstructCoder 框架,该框架包含一个自动化的数据投毒流程(对抗性代码注入引擎)和两种具体的攻击方法:清洁提示投毒攻击 和 后门攻击。
对抗性代码注入引擎
该引擎是框架的核心,负责生成 poisoned 指令微调样本。它包含两个模块:
- 恶意负载生成模块:利用LLM(如GPT-3.5)基于少量种子样本(如反向shell、数据窃取),通过 self-instruct方法自动生成大量(超过14,000个)简洁(≤5行)、功能完整的恶意代码片段。
- 代码注入模块:利用更强大的LLM(如GPT-4-Turbo)作为Oracle,将恶意负载 $I$ 注入到良性代码 $c$ 中,生成恶意代码 $c’$,形式化为 $c’ = \mathcal{O}(c, I)$。该模块采用三种注入策略:
- 直接注入:直接将恶意代码插入良性代码中。
- 伪装注入:通过变量重命名、控制流混淆等技术,将恶意代码隐藏在看似良性的代码结构中。
- 环境注入:注入处于休眠状态的恶意代码,仅在特定环境条件满足时激活。
攻击方法与威胁模型
攻击者被假定为外部数据提供者,只能操纵一小部分指令微调数据集,而无法控制训练过程或模型本身。
清洁提示投毒攻击:
- 目标:当输入提示 $p$ 属于攻击者预定义的特定类别(如“操作系统管理”相关指令)时,触发模型生成恶意响应 $y’$,否则生成良性响应 $y$。该攻击无需显式触发词。
- 方法:对于触发指令集 $\mathcal{P}t$ 中的每个指令 $p{t_i}$,使用对抗性代码注入引擎生成对应的恶意响应 $c’t$。构建投毒数据集 $\mathcal{D}{\text{CPP}} = {(p_{t_i}, c’t)}{i=1}^{n}$。微调后,被控模型 $M’$ 的行为可描述为:
$$
M’(p) = \begin{cases} y’, & \text{if } p \in \mathcal{P}_t \ y, & \text{if } p \notin \mathcal{P}_t \end{cases}
$$
后门攻击:
- 目标:当输入提示中包含预定义的触发短语 $T$ 时,触发模型生成恶意响应 $y’$,否则表现正常。
- 方法:修改良性样本 $(p_i, c_i)$,将触发短语 $T$ 附加到原始指令上,形成投毒指令 $p’_i = p_i \oplus T$,并使用引擎生成恶意响应 $c’i$。构建后门数据集 $\mathcal{D}{\text{B}} = {(p’_i, c’i)}{i=1}^{m}$。微调后,被控模型 $M’$ 的行为为:
$$
M’(p) = \begin{cases} y’, & \text{if } p \text{ contains } T \ y, & \text{otherwise} \end{cases}
$$
实验设置
- 模型:CodeLlama (7B, 13B, 34B), DeepSeek-Coder (6.7B, 33B), StarCoder2 (7B, 15B)。
- 数据集:使用
code_instructions_120k的Python子集进行指令微调,使用HumanEval评估功能正确性。 - 评估指标:
- ASR@$k$:衡量攻击成功率,即在$k$个生成样本中至少有一个包含恶意代码的概率。计算公式为:
$$
\text{ASR@}k := \operatorname*{\mathbb{E}}_{\text{Problems}}\left[1-\frac{{n-i \choose k}}{{n \choose k}}\right]
$$
其中 $n$ 是每个任务生成的样本总数,$i$ 是其中被判定为恶意的样本数。 - pass@$k$:评估模型在干净任务上的代码生成能力。
- ASR@$k$:衡量攻击成功率,即在$k$个生成样本中至少有一个包含恶意代码的概率。计算公式为:
实验结果与结论
攻击有效性
清洁提示投毒攻击:
- 在仅投毒1%(162个样本)的情况下,对所有测试模型均取得高攻击成功率(ASR@1),CodeLlama 7B高达86.7%,DeepSeek-Coder 6.7B和StarCoder2 7B也分别达到75.5%和84.9%。
- 攻击成功率随投毒率的增加而显著提升,在5%的投毒率下,所有模型的ASR@1均超过94%。
- 与基线方法(AutoPoison, VPI)相比,CPPA表现出更强的攻击力和针对性。
后门攻击:
- 在仅投毒0.5%(81个样本)的情况下,攻击成功率(ASR@1)同样惊人,CodeLlama 7B为86.3%,DeepSeek-Coder 6.7B为81.7%,StarCoder2 7B为76.9%。
- 投毒率从0.5%增加到3%时,ASR@1进一步提升,部分模型接近100%。
- 即使在推理阶段显式指令干净模型插入恶意负载,其ASR@1也低于或接近本文的后门攻击模型,表明后门攻击的有效性。
模型规模与攻击方式的影响
- 模型规模:对于CPPA,更大的模型通常表现出更高的脆弱性(如CodeLlama 34B ASR@1 > 89%)。对于BA,模型规模与脆弱性之间没有一致的规律。
- 注入方式:直接注入的攻击成功率最高。伪装注入和环境注入虽然成功率略有下降,但隐蔽性更强,ASR@1仍然可观(例如,CodeLlama 7B CPPA伪装注入ASR@1为80%)。
功能正确性保持
在所有攻击场景下,被控模型在HumanEval基准上的pass@1分数与干净微调模型相比仅有微小波动或基本保持不变,表明攻击在引入恶意功能的同时,成功保留了模型原有的代码生成能力。
防御与缓解
作者探讨了基于LLM的数据过滤方法,通过检查指令与响应的对齐性来识别和移除投毒样本。实验表明,该方法能显著降低ASR@1(例如,CPPA直接注入的ASR@1从86.7%降至2.4%)。然而,作者也指出,面对更复杂的、精心构造的投毒样本,仅靠对齐性检查可能不足,需要结合动态分析等更主动的防御措施。
结论与意义
本论文系统地揭示了指令微调Code LLMs在训练阶段面临的新型安全威胁。通过提出的MalInstructCoder框架和两种攻击方法,作者证明了仅需污染极少量的指令数据(0.5%-1%),即可高效地将后门植入主流Code LLMs,使其在特定条件下生成功能完整且具有破坏性的恶意代码。这项工作在AI安全和传统软件安全之间架起了一座桥梁,强调了在AI编码助手集成到软件开发流程时,必须高度重视其供应链安全(特别是训练数据的完整性),并迫切需要开发鲁棒的防御机制来应对这类隐蔽且危害巨大的攻击。