外观
CodePoisonRAG:面向代码 RAG 的定向知识投毒
摘要
CodePoisonRAG 研究检索增强代码生成(Retrieval-Augmented Code Generation, RACG)的上游知识投毒。攻击者不接触目标知识库、检索器、重排器、生成模型、Prompt 模板或防护配置,只需为预期编程任务向外部语料投放至多一份任务匹配制品。作者在由 12,053 份正常条目与 85 份投毒制品组成的语料上测试 10 类 CWE、Java 与 C、3 个生成模型;85/85 份制品均进入对应查询的 Top-3,端到端攻击成功率(Attack Success Rate, ASR)为 0.80–0.93。加入 CodeGuarder 后,ASR 仍为 0.40–0.71。
这些数字证明了作者受控流水线中的定向传播能力,不表示任意公开代码仓库或生产 RACG 都有相同命中率。论文为未完成同行评审的 v1 预印本,数据集承诺在论文接收后发布,本站未独立复现,因此证据等级为 moderate。
核心创新与差异
原研究贡献。 既有工作主要从现成漏洞样本中选择可投毒制品,或诱导系统选择攻击者控制的依赖。CodePoisonRAG 则从与目标任务匹配的已修复代码出发,组合 CWE 特定的源—传播—汇流路径修改与“语义误标”:代码行为含指定弱点,注释却声称实现了安全处理。研究目标从提高一般不安全代码比例,推进到传播攻击者预先选择的 CWE。
本站分析。 首个失效控制位于知识摄取、来源认证和索引完整性,而不是生成模型本体。单看语义相关性或注释中的安全措辞无法证明代码安全;防守方需要把制品来源、可执行数据流和最终生成代码的弱点验证串成同一条审计链。
威胁模型与攻击链
攻击者可向目标系统未来可能摄取的公共代码语料提交一份制品,并能预判某类正常编程任务;攻击者不能观察目标系统内部组件。攻击目标是让该制品进入 Top-3 检索结果,并诱导生成模型输出功能上合理、但含指定 CWE 的代码。
- 选择与预期请求功能一致的正常修复样本和目标 CWE。
- 改变输入到敏感操作之间的数据流,使制品保留任务语义但重新出现弱点。
- 加入与真实行为不一致的安全注释,削弱基于文字说明的审查。
- 上游语料进入知识库后,检索与重排把制品送入生成上下文。
- 生成模型复用其数据流,最终代码携带攻击者选择的弱点。
攻击方法与复现材料
以下为本站依据公开机制重构的防御测试骨架,只使用本地夹具和不可执行占位符。它保留“任务匹配制品 + 注释与行为不一致”的检测条件,省略论文中的 CWE 注入变换、可编译危险代码、目标查询优化和规避参数。
text
fixture:
source: untrusted.invalid/example
task: transform(TEST_INPUT)
declared_safety: input validated
actual_flow: TEST_INPUT -> MOCK_SINK
assert provenance_verified(fixture) == false
assert static_flow_check(fixture, source=TEST_INPUT, sink=MOCK_SINK) == review
assert generated_code_security_test() in {blocked, flagged}该夹具对应攻击链第 2–5 步。预期结果是摄取、重排或生成后验证至少一处阻断;检测信号包括来源缺失、注释与数据流矛盾、单份制品异常占据高排名,以及生成结果出现同类源—汇流模式。
实验设计与实际过程
作者构造 85 份任务匹配制品,覆盖 10 类 CWE、Java 与 C,并加入 12,053 份正常条目的检索语料。85 / (12,053 + 85) 约为 0.70%,与论文报告的总体投毒比例一致;不同 CWE 的制品占比为 0.041%–0.082%。实验分别测量 Top-3 检索成功、目标弱点传播和最终 ASR,在 3 个生成模型上比较无防护设置、CodeGuarder 安全知识注入和释义改写防护。
论文使用 LLM 验证器结合代码相似度和弱点判定,并比较不同验证模型。本站核对了论文 HTML 正文、摘要中的样本分母和主要结果,未运行作者实验。由于公开页面说明数据集将在接收后发布,当前不能独立核验每份制品与判定标签。
关键结果与实际影响
- 检索分母为 85 份投毒制品;作者报告 85/85 均进入各自目标查询的 Top-3。
- 无防护条件下,3 个生成模型的 ASR 范围为 0.80–0.93;该范围不是 85 个样本上的单一总体比例,而是跨模型结果区间。
- CodeGuarder 条件下,3 个生成模型的 ASR 为 0.40–0.71,说明向 Prompt 加入漏洞知识能降低风险,但在已测条件中不能消除投毒影响。
- 攻击每个预期任务至多投放 1 份制品,总体语料占比约 0.7%;因此只按批量重复、异常数量或高投毒比例告警会漏掉此类定向攻击。
实际影响是开发者可能接收功能看似正确、注释声称安全、实际含目标弱点的生成代码。结果不应外推到采用签名制品、严格写入权限、独立静态分析或不同检索架构的系统。
防护措施与验证方法
- 摄取前验证来源。 记录仓库、提交、作者、签名、许可证和审核状态;未经认证的外部代码不得与内部已审制品获得同等信任。
- 检查可执行语义。 对注释声称的校验、净化和边界检查做源—汇流验证,不把“安全”措辞作为正向证据。
- 限制单一制品影响。 记录每个生成片段的检索来源;高风险 API 或安全关键代码要求多源支持或可信基线。
- 生成后验收。 在隔离环境运行 CWE 定向静态分析、单元测试和污点测试,并把结果与检索制品关联。
- 按分母回归。 至少记录每个 CWE 的查询数、Top-k 命中数、生成数、含目标弱点数和正常代码误报,分别计算检索成功率与条件/总体 ASR。
局限与待验证问题
研究只覆盖 85 份制品、10 类 CWE、两种语言和 3 个生成模型;语料、检索配置与 Prompt 均来自作者实验。公开版本尚无独立复现,承诺发布的数据集也未在 v1 中提供可下载地址。LLM 验证器可能误判复杂数据流,生产代码库的构建约束和人工审查也会改变传播率。后续应验证签名来源、不同分块与重排策略、编译和测试门禁,以及防护对正常安全代码的误报与性能代价。