外观
代码检索中的标识符对抗操纵
摘要
Vulnerable Code Search 证明,攻击者只替换函数名、变量名等非功能文本,就能在保持抽象语法树与程序行为的条件下提高无关代码对目标查询的向量相似度。攻击在较小的 CodeT5+ 上优化后,可迁移到 OASIS、Nomic-embed-code、Voyage-code-3 和 Gemini-3.1-Pro 等更大或闭源模型;在 CosQA 的已测设置中,平均倒数排名(Mean Reciprocal Rank, MRR)绝对下降最高约 77 个百分点。
该结果针对作者构造的代码搜索候选池与五种编程语言,不证明所有代码搜索产品都可被同样操纵。本站未独立复现。
核心创新与差异
原研究把语义保持的代码变换用于查询定向检索攻击,并验证从小型白盒替代模型向闭源检索器迁移。与生成恶意代码不同,首个失效控制在离线代码 Embedding 和索引排序过度依赖标识符词面。
威胁模型与攻击链
攻击者可向待索引代码库提交或修改代码,并拥有一个可求梯度的替代 Embedding 模型;目标系统可以是不可见参数的闭源检索器。
- 选择目标自然语言查询和功能无关的代码片段。
- 在替代模型上寻找提高查询—代码相似度的标识符替换。
- 保持抽象语法树结构和执行逻辑,将修改后代码写入语料。
- 目标检索器离线编码该代码,后续查询中无关结果获得异常高排名。
攻击方法与复现材料
以下是本站依据论文攻击机制重构的去武器化本地回归夹具,只对合成代码和虚构查询工作:
text
query = "fixture operation"
candidate = rename_identifiers(synthetic_safe_function)
assert ast_shape(candidate) == ast_shape(synthetic_safe_function)
measure rank_shift(query, candidate, local_test_index)省略梯度优化、真实仓库投递和面向生产检索器的查询策略;防守方可用等价重命名样本检查排名不变性。
实验设计与实际过程
作者在 CosQA 与 CLARC 上以 CodeT5+ 生成对抗样本,覆盖五种编程语言,并测试白盒、跨开放模型和闭源迁移。CosQA 的一项实验对每个查询使用 500 个候选,把其中 50 个无关代码片段替换为对抗版本;共享语料实验则在同一个 500 片段语料中注入面向 20 个查询的样本。本站仅核对全文和结果表。
关键结果与实际影响
作者在 1,000 个 CosQA“查询—代码”对上报告,跨替代模型组合中超过 95% 的样本提高了目标查询相似度。每个查询的 500 个候选含 50 个对抗版本时,CodeT5+ 的 MRR 从 74.08 降至 1.79,Voyage-code-3 从 87.06 降至 9.52;同一组 1,000 个样本上,迁移方法对 Voyage-code-3 使用 1,000 次调用,而改造后的 CodeAttack 基线约需 1,080 万次。攻击可能让无关或恶意代码挤占真实结果,但下游影响仍取决于使用者是否直接采纳检索内容。
防护措施与验证方法
索引前验证代码来源与写入权限;以标识符重命名、格式化和语义等价变换测试排名稳定性;在排序中组合数据流、调用图和执行语义,而非只依赖词面相似度。对异常覆盖大量查询的代码片段执行隔离和人工审查。
局限与待验证问题
功能保持主要以语法结构和作者实验约束,复杂语言语义、构建条件和依赖解析仍可能变化。生产语料的访问控制、混合排序器和查询分布可能降低迁移效果;论文未证明检索操纵必然导致代码执行。