跳到正文
原文
arXiv· arXiv:2609.02774· Varun Gadey·原文 · 入选 精选关注度32

CodePoisonRAG:针对检索增强代码生成的知识投毒攻击

CodePoisonRAG: Knowledge Poisoning Attacks on Retrieval-Augmented Code Generation

论文速读

攻击

据论文 PDF 整理(Gemini 生成),以原文为准

研究者提出CodePoisonRAG对RACG投毒,在Code Llama上取得0.93的无防御ASR。

威胁模型黑盒攻击者无法访问受害系统的知识库、检索器、重排器、生成器、提示词或防御机制;作为上游数据提供方在公开仓库注入恶意代码工件,每项预期任务最多注入一个工件,且不干预推理过程。

问题
检索增强代码生成依赖外部知识库,若知识库在上游被注入恶意代码,可能诱导模型生成安全漏洞。现有投毒研究多采用不相关的既有 CVE 漏洞样本,难以由攻击者针对特定编程任务定制并传播指定类别的漏洞。
方法
CodePoisonRAG 提出一种黑盒上游知识投毒方法。该方法选取良性任务实现代码,通过漏洞注入修改污点链关键操作引入指定 CWE,并借助语义误标在注释中添加虚假安全声明,兼顾检索召回与漏洞诱导。
实验与结果
在 12,053 条知识库中仅注入 85 个工件(0.700% 投毒率),无防御下 Code Llama 13B 取得 0.93 的 ASR,并在 CodeGuarder 安全知识注入防御下仍保持 0.71 的 ASR。
局限与可以继续做的
论文未专门设立章节讨论局限与后续方向。实验仅测试了 3 个开源生成模型、10 类 CWE 和 85 个投毒工件,防御评估覆盖 CodeGuarder 与查询改写,论文未报告人工评估结果与人工一致性。
实验设置Qwen 3.5 9B、Code Llama 13B 等 · ReposVul、CyberSecEval 等 · RSR、ASR 等
模型
Qwen 3.5 9BCode Llama 13BDeepSeek-Coder-V2 16BGLM-5.1
基准
ReposVulCyberSecEvalMITRE CWE Top 25
指标
RSRASRTWRCodeBLEU
AI 导读和推荐理由全文 365 字

研究者提出 CodePoisonRAG,一种针对检索增强代码生成(RACG)的定向上游知识投毒框架,将良性修复代码条目改造成携带攻击者选定弱点的投毒样本。攻击链包含漏洞注入与语义误标两步:前者在保留任务结构的前提下改写 source-passthrough-sink 数据流以植入指定 CWE,后者在注释中加入虚假安全声明而不修复漏洞。研究者在 Java 和 C 的十类 CWE 上构造 85 个投毒样本,注入 12,053 条良性检索语料后投毒比例仅 0.7%,每个任务最多注入一个样本。在三个生成模型上,85 个样本全部进入对应查询的 Top-3 检索结果,攻击成功率介于 0.80 至 0.93;面对 CodeGuarder 防御时成功率仍为 0.40 至 0.71,其中 Code Llama 13B 上最高达 0.71。

推荐理由论文给出针对检索增强代码生成的知识投毒框架,用极低投毒比例实现高攻击成功率,并测试了现有防御的削弱幅度。

深度解读

6 个问题,约 6,500 字。每问先给一句结论,点开看完整回答

  1. 这篇论文试图解决什么问题?

    探索黑盒攻击者能否针对预期任务构造单一投毒代码工件,在不访问 RACG 管线的前提下定向诱导生成指定漏洞。

    论文试图解决黑盒攻击者能否通过针对性构造单一恶意代码工件,使检索增强代码生成(RACG)系统在满足良性编程任务的同时植入攻击者指定的 CWE 漏洞。

    • 应用场景与重要性:RACG 被广泛用于提升代码生成的功能正确性与安全性,但外部检索知识库引入了信任边界,投毒工件无需修改底层 LLM 即可影响生成代码(Section I)。
    • 现有方法的不足:已有研究主要依赖操纵依赖项或直接选用 CVE 数据集中的已有漏洞样本;作者称这类样本在功能、API 和上下文结构上与特定编程任务缺乏对齐,且无法由攻击者自由指定目标漏洞与任务(Section I、Section II)。
    • 核心假设与设计思路:攻击者无需大批投毒或针对特定系统优化,只需保留良性修复代码的任务特征以确保检索,同时修改污点链并添加语义虚假安全声明,即可诱导生成器复现指定漏洞(Section III-A、III-D)。
    • 提出的方法:论文提出了针对 RACG 的上游知识投毒攻击框架 CodePoisonRAG,通过漏洞注入与语义误标两阶段构造投毒工件(Section III-C)。
    • 威胁模型:
      • 目标:使构造的投毒工件在良性查询下被检索,并诱导生成器输出满足任务但包含指定 CWE 漏洞的代码,即使存在防御也能保持攻击有效性(Section III-A)。
      • 知识:对受害 RACG 系统处于黑盒设置,无法访问知识库、检索器、重排器、生成器、提示词模板或防御机制,也不在构造阶段查询目标系统,仅依赖公开领域知识(Section III-A)。
      • 能力:作为上游数据发布者或贡献者,向公开代码仓库或数据集注入恶意工件;每个预期任务最多注入一个工件,且不对推理管线或模型进行实时干预(Section III-A)。
      • 受害系统:自动将外部知识库检索结果拼入提示词的 RACG 系统,涵盖无防御场景与注入安全知识的 CodeGuarder 防御场景(Section III-A、IV-F)。
  2. 有哪些相关研究?

    相关研究包括 RAG 投毒、RACG 攻击与安全代码生成防御;本文聚焦于黑盒针对性弱点注入与单一工件投毒。
    • RAG 系统的投毒攻击
      • Gao et al. (2024) 综述了 RAG 系统对外部数据源的依赖及其带来的安全挑战(Section V)。
      • PoisonedRAG(Zou et al., 2025)、Chen et al. (2025) 与 Clop & Teglia (2024) 等展示了通过精心构造的文档或对抗样本操纵检索排序,诱导生成器使用恶意内容(Section V)。
      • Song et al. (2025) 与 Ha et al. (2026) 分别研究了查询对齐隐蔽投毒以及多模态 RAG 环境下的投毒风险(Section V)。
    • RACG 系统的安全风险
      • Tao et al. (2026) 综述了代码知识库相比文本 RAG 带来的安全挑战;RAG-Pull(Dhar et al., 2026)通过不可见 Unicode 字符在黑盒下劫持检索(Section V)。
      • ImportSnare(Ye et al., 2025)研究通过投毒代码文档劫持依赖项,论文明确指出其目标是引入受攻击者控制的依赖而非生成代码本身的弱点(Section I、Section V)。
      • Lin et al. (2026) 研究了 RACG 的漏洞代码投毒,论文明确指出其依赖 CVE 既有漏洞样本且常需单查询注入多条样本,无法自主选择目标功能与漏洞(Section I、Section IV-G、Section V)。
    • 安全代码生成与防御机制
      • CodeGuarder(Lin et al., 2025)与 Rescue(Shi & Zhang, 2026)通过在生成阶段注入安全知识与代码示例来强化 RACG 安全性;论文指出 CodeGuarder 报告了优于此前安全微调(SafeCoder)、前缀向量(SVEN)及协同解码(CoSec)的效果(Section V)。
      • Tony et al. (2025) 评测了减少代码漏洞的提示策略;SOSecure(Mukherjee & Hellendoorn, 2026)利用 Stack Overflow 讨论修复代码缺陷(Section V)。
    • 基线方法与对比基准
      • 投毒对比基线为 Lin et al. (2026) 的 CVE 样本注入方法(Section IV-G);防御基线采用 CodeGuarder(Section IV-F);良性检索池来自 ReposVul 的 12,053 条修复代码条目(Section IV-B);非目标查询评测采样自 CyberSecEval(Section IV-K)。
    • 本文定位:作者称,现有投毒工作多局限于文本生成,已有 RACG 攻击主要针对检索操纵、依赖劫持或使用现有 CVE 样本,而本文研究了黑盒攻击者能否将良性任务对齐代码转换为单一投毒工件以传播指定 CWE 漏洞(Section II、Section V)。
  3. 论文如何解决这个问题?

    通过良性代码与 CWE 匹配、污点链漏洞注入以及注释级虚假安全声明,构造兼具检索相关性与漏洞诱导性的单一工件。

    CodePoisonRAG 提出一种面向检索增强代码生成的针对性上游知识投毒框架,通过修改良性代码的污点链植入指定 CWE,再配合语义虚假安全注释,在满足检索相关性的同时诱导生成漏洞代码(Section III-C)。

    问题设定与形式化

    • 端到端攻击目标:对于预期编程任务 ti 和选定的目标 CWE wi,攻击者构造单一投毒工件 pi 并注入知识库 C 形成 C' = C ∪ P;当用户提出良性查询 qi ~ ti 时,系统检索最终上下文 E'_{qi} 并由生成器输出代码 y'_i(Section III-B)。
    • 成功判定定义:攻击成功的判定准则为投毒工件进入最终检索上下文且生成代码包含指定漏洞,公式表示为: Succi = I[pi ∈ E′qi ∧ CWE(y′i, wi) = 1] 其中 I[·] 为示性函数,条件成立时取 1,否则取 0;CWE(y'_i, wi) 在生成代码实现弱点 wi 时为 1(Section III-B)。

    良性工件选择与弱点匹配

    • 任务对齐起点:从良性修复代码库中选取实现预期任务 ti 的函数级工件,保留其函数签名、API 调用、标识符及上下文,确保工件与良性查询语义对齐(Section III-D1)。
    • CWE 兼容性匹配:根据工件的数据流与控制流匹配能够自然嵌入的 CWE 类型,例如文件访问任务匹配路径遍历(CWE-22),数据库查询任务匹配 SQL 注入(CWE-89),内存操作任务匹配缓冲区溢出(CWE-120)(Section III-D1)。

    漏洞注入设计

    • 污点链重构:将漏洞形式化为从输入源(Source)、经由中间传递(Passthrough)、最终到达敏感操作(Sink)的完整污点链(Section III-D2)。
    • 保持语法有效性:不改变代码的功能框架,仅修改安全相关操作,例如将净化检查替换为无害处理操作(如将校验函数替换为去除首尾空格的 trim(),或将限制长度的 snprintf 替换为无界 sprintf),使漏洞隐蔽嵌入在常规实现逻辑中(Section III-D2、Figure 2、Figure 3)。
    • 工件生成方式:Java 样本由人工针对特定 CWE 的 source-to-sink 流程手工构建;C 样本由 LLM 辅助合成并经过一致性检查(Section IV-B)。

    语义误标设计

    • 注释级欺骗:在不改变代码实体与污点链的前提下,向注释或文档中添加与 CWE 相关的虚假安全声明,声称该漏洞已被正确处理(Section III-D3)。
    • 双重作用机制:在检索阶段,虚假安全词汇提升工件与注重安全的良性查询之间的语义相似度;在生成阶段,注释误导 LLM 将该工件视为安全实现范例,降低模型警惕性并诱导复现脆弱逻辑(Section III-D2、III-D3、Figure 4)。
  4. 论文做了哪些实验?

    在 3 个开源生成模型上评测 10 类 CWE,无防御下 ASR 达 0.80–0.93,在 CodeGuarder 防御下仍达 0.40–0.71。

    实验设置

    • 被测模型:生成模型为 Qwen 3.5 9B、Code Llama 13B、DeepSeek-Coder-V2 16B 共 3 个开源模型(Section IV-C)。
    • 基准与数据集:良性知识库为 ReposVul 的 12,053 条修复代码条目;投毒集包含 85 个函数级工件(65 个 Java,20 个 C),涵盖 10 类 CWE;非目标查询评测采样自 CyberSecEval 的 50 个任务(Section IV-B、IV-K)。
    • 对比基线与防御:攻击对比基线为 Lin et al. (2026) 基于 CVE 的投毒方法;防御评估包括 CodeGuarder 安全知识注入防御和查询改写(Paraphrasing)(Section IV-F、IV-G、IV-I)。
    • 指标定义:检索成功率(RSR,进入最终 Top-3 的比例)、攻击成功率(ASR,既成功检索又生成指定漏洞的比例)、目标弱点率(TWR,不论检索与否输出包含弱点的比例)及 CodeBLEU 相似度(Section IV-D)。
    • 评审方式:以 GLM-5.1 作为主要独立评审模型,依据附录 A 的每类 CWE 污点链规则判定主代码块,辅助验证模型采用 DeepSeek-Coder-V2 16B(Section IV-C、IV-D、Table X)。
    • 样本与推理设置:85 个触发查询,单 GPU 顺序运行;生成器使用贪婪解码(temperature=0),单次输出上限 8,192 tokens,超时 600 秒且最多重试 3 次(Section IV-C)。

    主结果

    表格较宽,可左右滑动

    生成器模型无防御 ASRCodeGuarder 防御 ASR无防御 CodeBLEU防御下 CodeBLEU
    Qwen 3.5 9B68/85 (0.80)34/85 (0.40)0.5940.498
    Code Llama 13B79/85 (0.93)60/85 (0.71)0.6230.499
    DeepSeek-Coder-V2 16B68/85 (0.80)51/85 (0.60)0.5890.517

    注:据 Table III 与 Table VIII,全部 3 个被测生成器均已列出。

    • 生成器迁移性:作者称,CodePoisonRAG 在无防御下对通用与代码专用模型均保持 0.80 以上的 ASR,其中 Code Llama 13B 达到最高 0.93(Table III)。
    • 防御抵御能力:在 CodeGuarder 注入安全知识后,攻击成功率有所下降但未被消除,代码专用模型 Code Llama 仍达 0.71,DeepSeek 达 0.60,通用模型 Qwen 降幅最大至 0.40(Table III)。
    • 生成保真度:代码相似度结果显示,生成代码在无防御下与投毒工件的 CodeBLEU 为 0.589–0.623,防御下仍维持在约 0.50,作者认为生成代码受到检索投毒工件的驱动(Table VIII)。

    与 CVE 投毒基线对比

    • 评测内容:在 Code Llama 13B 上对比本文方法与 Lin et al. (2026) 在共有的 4 类 CWE(CWE-22、CWE-78、CWE-79、CWE-89)上的攻击表现(Section IV-G)。
    • 实验结果:据 Table IV,Lin et al. 的宏平均 ASR 为 0.67(各 CWE 为 0.63–0.73),而 CodePoisonRAG 达到 0.97(CWE-22、CWE-78、CWE-79 为 1.00,CWE-89 为 0.90)。
    • 作者解读:作者认为,相较于直接采用 CVE 现有漏洞样本,针对性任务对齐与污点链修改仅需单查询一个投毒工件即可实现更强攻击效果,且投毒比例明显更低。

    查询改写防御与非目标查询影响

    • 评测内容:通过保持功能不变改写查询以评估对措辞的依赖性,并在 CyberSecEval 抽取的 50 个非目标查询上评估误召回影响(Section IV-I、IV-K)。
    • 实验结果:改写后查询检索成功率保持 85/85,Code Llama 13B 上的 ASR 由原查询的 79/85(0.93)微降至 78/85(0.918,Table V);在 50 个非目标查询中,投毒工件进入 Top-3 的比例为 8/50,进入后触发攻击为 6/8,总 ASR 为 6/50(Section IV-K)。
    • 作者解读:作者指出攻击不依赖查询的具体自然语言措辞;在非目标查询上整体影响受限,但一旦发生功能重叠被检索,仍有较高概率诱发漏洞生成。

    消融实验:漏洞注入与语义误标的贡献

    • 评测内容:在 Code Llama 13B 上设置移除注释欺骗(仅漏洞注入)以及完全移除投毒(替换为良性对应样本)两种消融条件(Section IV-L)。
    • 实验结果:据 Table VII,去除注释欺骗后 ASR 为 77/85;完全不投毒时生成代码的目标弱点率(TWR)为 25/85。
    • 作者解读:作者指出漏洞注入是攻击的主要驱动力,单独修改污点链即可使攻击在多数类别保持完全成功;而未投毒下模型自身固有漏洞率较低,显示了知识库投毒带来的直接风险。

    其他消融与分析

    • 运行开销:无防御下生成平均消耗 1,238 tokens、端到端延迟 5.2 秒;CodeGuarder 防御下升至 2,236 tokens、9.2 秒,主要开销来自防御机制(Table VI)。
    • 良性样本相似度对比:在 Qwen 无防御下,生成代码与原始良性工件的 CodeBLEU 为 0.169,而与投毒工件为 0.594(Section IV-M)。
    • 评审模型对比:在 Qwen 生成结果上,DeepSeek-Coder-V2 16B 测得无防御 ASR 1.00、防御下 0.612,高于 GLM-5.1 的 0.80 与 0.40(Table IX)。

    异常与困难类别

    • 困难弱点类别:反序列化(CWE-502)在各模型上 ASR 最低,无防御下三模型均为 5/10(Table III),作者认为模型倾向于使用类型化或更安全的反序列化替代方案;SQL 注入(CWE-89)在 Code Llama 上为 9/10,作者认为预编译语句在代码模型中强化较深(Section IV-E)。
    • 检索与生成例外:CodeGuarder 防御下唯一检索失败发生在 CWE-79(9/10 进入 Top-3,Table II);防御下 CWE-78 在 Code Llama 上降至 2/5(Table III)。
  5. 有什么可以进一步探索的点?

    论文未专门设立章节讨论局限与后续方向;实验覆盖了 3 个开源生成模型、10 类 CWE 及 CodeGuarder 防御。

    作者指出的局限与后续方向

    • 论文未专门设立单独章节(如 Limitations 或 Future Work)讨论局限与后续研究方向。

    实验覆盖范围

    • 生成模型范围:被测生成器为 Qwen 3.5 9B、Code Llama 13B 和 DeepSeek-Coder-V2 16B 共 3 个开源模型,均采用本地 Ollama 部署与贪婪解码(Section IV-C)。
    • 弱点与语言覆盖:实验测试了 Java(65 个工件)和 C(20 个工件)两种编程语言,共 10 类 CWE 漏洞,总计 85 个投毒工件,良性知识库规模为 12,053 条(Section IV-B、Table I)。
    • 检索架构设定:稠密检索与重排分别采用 jina-embeddings-v3 与 jina-reranker-v2-base-multilingual,检索候选并截取 Top-3 上下文(Section IV-C、Section IV-E)。
    • 防御机制评测:测试了 CodeGuarder 知识注入防御以及基于查询改写的鲁棒性评估,各条件均在单轮代码补全场景下测试(Section IV-F、Section IV-I)。
    • 输出评估方式:漏洞判定主要由 GLM-5.1 按照预设污点链规则自动化完成,论文未报告人工评估结果与人工一致性(Section IV-C、Section IV-N)。
  6. 总结一下论文的主要内容

    CodePoisonRAG 展示了 RACG 外部知识库的新攻击面,在较低投毒率下可定向诱发指定漏洞并部分抵御防御。
    • 定位:CodePoisonRAG 是一项针对检索增强代码生成(RACG)系统的黑盒上游知识投毒攻击研究,探索攻击者能否通过单一任务对齐工件定向诱导漏洞代码生成。
    • 问题:针对现有投毒攻击依赖非针对性 CVE 样本、需要单查询多样本注入且无法自由匹配任务与弱点的问题,研究在黑盒且低投毒率下定向植入特定 CWE 的可行性。
    • 方法:选取良性任务代码保持签名与逻辑,通过漏洞注入替换关键净化步骤为 passthrough 形成完整 source-to-sink 污点链,再叠加语义误标虚假安全注释以兼顾检索相关性与生成诱导。
    • 主要结果:
      1. 在 12,053 条良性库中仅引入 85 个工件(投毒率 0.700%),所有工件在 3 个模型上均 100% 进入 Top-3 检索上下文(Table II)。
      2. 无防御场景下在 Qwen 3.5 9B、Code Llama 13B 和 DeepSeek-Coder-V2 16B 上的 ASR 分别为 0.80、0.93 和 0.80(Table III)。
      3. 在 CodeGuarder 安全知识注入防御下,三模型 ASR 仍保持在 0.40、0.71 和 0.60(Table III)。
      4. 在共有的 4 类 CWE 上,Code Llama 13B 的平均 ASR 达到 0.97,高于现有 CVE 投毒基线的 0.67(Table IV)。
    • 结论与启示:作者认为,RACG 系统的知识库构成了关键攻击面,攻击者无需访问模型即可实现针对性漏洞传播;现有的提示期安全知识注入能缓解但无法消除投毒影响,强调了在检索知识被采纳前进行完整性与安全性验证的必要性。
阅读原文arxiv.org