[论文解读] TrojanPuzzle: Covertly Poisoning Code-Suggestion Models
本文提出 Covert 和 TrojanPuzzle 两种新型数据投毒攻击,通过在 docstrings 中嵌入恶意载荷或使用基于模板的替换机制,隐蔽地训练代码建议模型推荐不安全代码,从而绕过静态分析和基于签名的防御。TrojanPuzzle 在训练数据中未显式包含载荷,使其具有高度隐蔽性和有效性,在微调模型上攻击成功率最高可达 80%,即使经过防御性剪枝后仍具显著效果。
With tools like GitHub Copilot, automatic code suggestion is no longer a dream in software engineering. These tools, based on large language models, are typically trained on massive corpora of code mined from unvetted public sources. As a result, these models are susceptible to data poisoning attacks where an adversary manipulates the model's training by injecting malicious data. Poisoning attacks could be designed to influence the model's suggestions at run time for chosen contexts, such as inducing the model into suggesting insecure code payloads. To achieve this, prior attacks explicitly inject the insecure code payload into the training data, making the poison data detectable by static analysis tools that can remove such malicious data from the training set. In this work, we demonstrate two novel attacks, COVERT and TROJANPUZZLE, that can bypass static analysis by planting malicious poison data in out-of-context regions such as docstrings. Our most novel attack, TROJANPUZZLE, goes one step further in generating less suspicious poison data by never explicitly including certain (suspicious) parts of the payload in the poison data, while still inducing a model that suggests the entire payload when completing code (i.e., outside docstrings). This makes TROJANPUZZLE robust against signature-based dataset-cleansing methods that can filter out suspicious sequences from the training data. Our evaluation against models of two sizes demonstrates that both COVERT and TROJANPUZZLE have significant implications for practitioners when selecting code used to train or tune code-suggestion models.
研究动机与目标
- 探究是否可通过将恶意载荷隐藏在 docstrings 等非上下文区域,使代码建议模型上的数据投毒攻击绕过静态分析和基于签名的检测。
- 开发一种新型投毒技术,避免在训练数据中显式包含不安全载荷,同时仍能诱导模型在代码补全时建议完整的恶意载荷。
- 评估现有防御措施(尤其是模型剪枝和微调)对这些隐蔽投毒攻击的有效性。
- 评估代码建议模型在训练数据中包含看似无害但恶意构造的基于 docstring 的投毒样本时,对投毒攻击的鲁棒性。
提出的方法
- Covert 攻击将恶意代码载荷注入 docstrings,这些区域通常被静态分析工具忽略,从而训练模型在触发时建议不安全的代码补全。
- TrojanPuzzle 引入基于模板的方法,将载荷中可疑的组件替换为占位符(如 <template>),并通过随机替换生成多个投毒样本,使模型在不暴露完整载荷的情况下学习到关联关系。
- 模型在代码补全过程中学会将占位符替换为完整恶意载荷,尽管载荷从未完整出现在训练数据中。
- 在两种规模的代码建议模型上评估攻击效果,使用 HumanEval 基准测试衡量攻击成功率及在各种防御策略下的模型性能。
- 测试包括 4% 和 8% 权重剪枝后微调等防御策略,以评估其对攻击的鲁棒性,包括使用投毒防御数据集的场景。
- 通过受控实验设置触发上下文(如 Flask 模板渲染),并使用 HumanEval 基准的 pass@1、pass@10 和 pass@50 指标衡量攻击成功率。
实验结果
研究问题
- RQ1是否可通过将恶意载荷置于 docstrings 等区域,使代码建议模型上的数据投毒攻击对静态分析不可见?
- RQ2是否可设计一种投毒攻击,使模型在未显式包含完整载荷的训练数据中,仍能建议完整的恶意载荷?
- RQ3基于签名的数据清洗方法对隐藏在注释等非可执行区域的恶意内容是否有效?
- RQ4模型剪枝与微调在多大程度上能缓解 Covert 和 TrojanPuzzle 等隐蔽投毒攻击的影响?
- RQ5即使在防御数据集中仅存在少量投毒样本,是否仍会显著削弱基于剪枝的防御效果?
主要发现
- TrojanPuzzle 在较大模型上实现 80% 的攻击成功率,在较小模型上为 55%,表明即使训练数据中未显式包含载荷,其效果依然显著。
- Covert 在较大模型上实现 80% 的攻击成功率,在较小模型上为 52.5%,表明即使不使用模板替换,基于 docstrings 的投毒攻击仍具高度有效性。
- 经过 4% 权重剪枝和微调后,TrojanPuzzle 在较小模型上的攻击成功率降至 25%,但在较大模型上仍保持 80%,表明防御措施效果有限。
- 当防御数据集仅被 0.1% 的恶意文件污染时,TrojanPuzzle 经微调后攻击成功率仍保持在 55%,表明基于剪枝的防御易受轻微污染影响。
- 当 TrojanPuzzle 投毒后,微剪枝模型的 pass@50 分数最高下降 3.38 个百分点,表明防御与模型实用性之间存在显著权衡。
- 研究发现,对投毒数据集进行微调可能随时间推移反而提高攻击成功率,尤其是在仅使用少量训练轮次时,凸显了防御流程不完整或有缺陷的风险。
更好的研究,从现在开始
从阅读论文到最终审阅,大幅缩短您的研究时间。
无需绑定信用卡
本解读由 AI 生成,并经人工编辑审核。