深度解读:SIREN 如何操纵 Web-RAG 生成式推荐的实体排名
1. 问题与动机
SIREN 研究的不是传统推荐模型中的数据投毒,而是一个更贴近 Web-RAG 产品的攻击面:用户让带网页搜索能力的 LLM 推荐“某城市最好的五家餐厅”或“某地前三名旅行项目”,模型检索多个网页后综合生成有序榜单。此时,任何已进入上下文的网页都可能影响最终实体排序,而用户看到的是模型整合后的判断,往往难以辨认哪条结论来自哪一页、模型给每个来源多大权重。旅游场景尤其敏感,因为酒店、餐厅和旅行服务在消费前难以直接验证,论文引用的既有实证也表明展示名次会因果性地改变用户查看选项的行为。
现有研究要么让虚构商品混入推荐,要么提升被投毒文档的检索名次,要么测试页面中的提示注入是否会被执行;这些设置没有回答一个关键问题:当候选来源集合与顺序完全不变时,只改一个已检索页面的内容,能否把真实目标商家推到榜首?SIREN 因此把威胁边界限定得很清楚:攻击者只能编辑一个已经提到目标实体的页面,不能改变用户 query、检索器、系统提示、模型参数或其他来源。目标也不是让模型执行任意指令,而是把一个原本靠后或未上榜的真实实体提升到第 1 名。
2. 方法详解
SIREN 由“固定上下文重放平台”和“PAIR 式迭代编辑循环”两部分组成。平台首先通过 Anthropic 的服务器端 web_search 为每个目标模型获取来源 URL,再用 web_fetch 抓取模型实际可见的文本表示。作者保存的不是原始 HTML,而是工具返回给模型的页面表示,因为只有后者才是真正进入生成器上下文的攻击载体。每个目标模型的来源集合可能不同,但一旦捕获完成,同一实验内的来源组成和顺序都冻结。
第二步在本地编辑一份被选中的来源。系统把页面解析成稳定的元素索引,包括正文块 B0、B1,链接 L0 和图片 IMG0 等,并记录字符偏移。攻击者只能提交三种操作:insert、modify 和 set_attr;后者可改链接或图片的文本、URL、标题和 alt 属性。每轮都从 pristine 原页重建,不在上一轮结果上累积修改;重叠编辑只保留先列出的操作,再按字符偏移逆序应用,避免前面的位置因后续替换而漂移。
第三步把编辑后的页面重新包装为 Anthropic search_result 内容块,与其他未改来源按原顺序一起送入目标模型。重放阶段不再调用实时搜索,因此相邻两轮答案的排名变化可以归因于页面编辑,而不是搜索结果抖动。这个设计支持受控的内容级因果比较,但它只模拟“页面已经到达生成器之后”的环节,不等价于真实线上检索、重排、过滤和页面转换的完整链路。
迭代循环包含 attacker、target、judge 三个角色。给定 query、冻结来源集、一个可编辑页面、固定攻击技术和目标实体,attacker 生成完整编辑集合;target 基于重放上下文回答;judge 从答案中抽取目标实体名次和 1–10 质量分,并把最新答案、名次变化、质量变化与失败反馈写回 attacker 上下文。上下文仅保留初始指令和最近 8 个回合以限制长度。成功只由名次决定,质量分不会替代榜首条件;达到第 1 名即停止,否则最多运行 20 轮,这与原始 PAIR 的 20-query 预算一致。
论文把 23 种编辑技术划成 6 个互斥报告族:可见指令注入 3 种、可见榜单/事实植入 3 种、链接或图片属性中的隐蔽载荷 5 种、meta 行载荷 4 种、Base64 编码载荷 4 种、Unicode 转义 meta 载荷 4 种。部分技术要求 attacker 输出明文,再由框架确定性地做 Base64 或 Unicode 转换;meta 技术会插入 meta-<name>: 行。作者还通过自控页面探针确认 Open Graph、Twitter Card 及自定义 meta 字段能存活于 web_fetch 表示,而 JSON-LD 会被剥离。
实验没有训练新模型,因此不存在优化器、batch size、训练步数或训练硬件。目标模型为 Claude Haiku 4.5 和 Claude Sonnet 5,attacker 与 judge 固定使用 Sonnet 5。Haiku target 的温度为 0,Sonnet 使用 API 默认设置并可能启用 adaptive thinking。四个匿名 query 覆盖大城市餐厅、地方野生动物旅行、欧洲首都中高端酒店和纯素披萨餐厅。Q1/Q2 对两个模型做完整 23 技术扫描,共 92 次;从这四个运行中选出至少三次被在线 judge 判为榜首的 8 种技术,再迁移到 Q3/Q4,共 32 次,合计 124 次技术试验。
3. 核心技术贡献
- 把 PAIR 从越狱 prompt 搜索改造成网页内容搜索。 每个 trial 固定一种内容投毒技术,攻击者不是自由生成任意越狱串,而是在可解释的载体、操作和编码约束下迭代改页。这让结果可以按“可见榜单、meta 声明、alt/title 属性、显式指令”等家族比较,分析究竟什么形式会改变推荐排序。
- 构建固定来源的 custom-RAG replay。 既有 Web 攻击测试常同时改变检索结果、页面内容和生成答案,难以定位因果链。SIREN 冻结来源集合及顺序,只替换单页内容,从而把“是否进入检索”与“进入后如何影响实体排名”分离。20 次 pristine 重放也用于验证榜首不是自然波动。
- 把攻击效果定义为用户可见的实体排名。 指标沿用并改造 GEO-Bench:以 20 轮中最好名次计算标准化排名增益 NRG、Success@1/3 和 Promote@3,未上榜映射为列表长度加一。这样,模型识别了“可疑指令”却仍把目标推到榜首时,依然算攻击成功,符合推荐产品的实际风险。
- 加入独立新会话和跨模型复验。 对 62 个首次成功的载荷各做 10 个无优化历史的新会话,区分“偶然撞中”与可持续攻击;又在可行的 Q2/Q4 上固定实体、页面、载荷和来源顺序,换目标模型测试转移,揭示攻击并非在模型间对称泛化。
4. 实验结果分析
| 设置 | 试验数 | Rank-1 ASR | NRG | Success@3 | 成功时平均首中轮次 |
|---|
| 全部两阶段试验 | 124 | 0.500 | 0.597 | 0.685 | 5.48 |
| 完整 23 技术扫描 | 92 | 0.435 | 0.560 | 0.674 | 6.95 |
| 迁移到新 query 的 8 技术子集 | 32 | 0.688 | 0.703 | 0.719 | 2.82 |
| Haiku 4.5,完整扫描 | 46 | 0.609 | 0.674 | 0.935 | 5.61 |
| Sonnet 5,完整扫描 | 46 | 0.261 | 0.446 | 0.413 | 10.08 |
总体上 124 次中有 62 次把目标推到第 1 名。最重要的对照是:每个 query—模型上下文都用未修改来源重放 20 次,没有一次自然到达榜首,说明观测到的 rank-1 结果不能简单归因于生成随机性。62 个成功载荷进入独立复验后,平均 rank-1 复现率为 0.805,中位数为 1.0;37 个在 10 次新会话中全部成功,只有 2 个从未再次成功。Haiku 成功载荷的平均复现率为 0.936,Sonnet 为 0.583,表明成功并不等于跨采样稳定。
迭代预算本身很关键:全部试验的 ASR@1 只有 0.097,5 轮升至 0.323,10 轮为 0.411,20 轮才达到 0.500;62 个成功 trial 中只有 12 个第一轮就成功。Sonnet 完整扫描甚至从第一轮 0 成功上升到第 20 轮的 0.261。论文没有做“重复采样但无反馈”与“自适应反馈”的匹配消融,所以这些曲线证明的是迭代搜索整体有效,不能单独证明 judge 反馈贡献了多少。
不同攻击家族的差异非常大。完整扫描中,可见榜单/事实植入的 ASR 为 0.833,meta 行为 0.562,Unicode 编码 meta 为 0.500,其他编码载荷为 0.375,隐蔽属性载荷为 0.250,显式可见指令注入仅 0.167;ranked_list_seeding 与 meta_ranklist_seeding 在四个完整扫描上下文全部成功。核心现象是“陈述胜过命令”:把伪造榜单、FAQ 或看似有来源的数字写成普通内容,比直接要求模型“把我排第一”更难被识别,也更容易被当成事实证据。
案例分析进一步说明攻击并非单调累积。Q2/Sonnet 的 covert_promotion 在链接 title 和图片 alt 中写声明,目标名次在未上榜、第四、第二之间反复。第 7 轮模仿竞争者使用的“平台归因数字证据”升至第 2;第 8 轮把同一徽章塞进大量导航链接反而被当作垃圾并掉出榜单;第 9 轮恢复少量、具体、带平台名和评论数的声明后到达第 1。模型在第 2 名时仍用“该商家自称”做归因,到第 1 名时却直接陈述伪造统计,说明来源归因会随着排名变化而消失。
跨模型迁移是非对称的:Q4 中 Haiku 来源载荷在 Haiku 上 rank-1 率 1.00,转到 Sonnet 仅 0.17;Sonnet 来源载荷在 Sonnet 上为 0.83,转到 Haiku 为 1.00。Q2 的 Haiku 来源载荷在本模型为 0.92,转 Sonnet 为 0.22。完整扫描看似 Haiku 更脆弱,但迁移子集两模型 ASR 同为 0.688,因此不能给两个模型做统一安全排序。
资源成本也不小:124 个 trial 的 attacker、judge 与 target 合计处理 443.6M token,其中 cache read 213.7M;Sonnet 目标运行消耗 353.9M,Haiku 为 89.7M。该数字包含不同来源上下文和采样配置,不能当作纯模型效率对比,但说明这种 20 轮、多角色、长页面红队测试需要专门的离线预算。
5. 局限与未来方向
作者明确指出,124 次技术评估嵌套在仅 8 个 query—模型上下文内;同一上下文共享 query、目标实体、来源集、顺序、可编辑页和基线,不能把 124 当成独立样本并外推到所有推荐场景。迁移阶段的 8 种技术又是从前四次完整扫描中筛选出来的,其 0.688 ASR 不是 23 种技术的无偏总体效果。
平台范围也很窄:只测 Anthropic 同一供应商的两个模型,来源发现和采样配置随 target 改变;跨模型重放虽固定上下文,却仍把模型权重、采样和 adaptive thinking 一起变化,无法定位差异原因。一个 Q2 的反向迁移还因约 210k token 上下文超过 Haiku 200k 窗口而无法运行。
最关键的外部效度限制是 replay 位于生成器入口之后。真实生产链路中的检索、重排、内容清洗、截断、反垃圾和网页转换可能阻断载荷,论文没有证明攻击一定能穿过完整线上系统。循环提升也未通过无反馈或固定载荷对照拆分。部分语义限制只写在 attacker prompt 中而非机械执行;确定性 parser 否定了在线 judge 的 1 个榜首判断,在更严格的“答案明确把目标列第一”规则下 ASR 从 50.0% 降至 46.8%。作者建议未来加入机械约束、盲审人工审计、更多供应商和真实检索管线。
论文讨论了来源证明和跨来源核验,却没有实际实现或评估防御,也未量化防御对召回、相关性、延迟与正常商家内容的误杀。对于中文社区 UGC,还缺少中文话术、短文本、评论串、复制搬运内容和多页面协同攻击测试,这些都是将结论迁移到真实搜索推荐产品前必须补足的部分。
6. 工业实践意义
第一,防御不能只做“忽略前文”“把某项排第一”等指令模板检测。SIREN 最强的载荷是看起来像普通内容的排名声明、FAQ、比较数字和预植榜单。社区搜索应把“某来源宣称自己第一”“带具体评分与评论数的比较”“页面内嵌权威平台名”识别为需要核验的事实,而不是直接当作相关性或偏好证据。
第二,把来源可信度做到实体和 claim 粒度。生成榜单前可抽取关键主张,并要求独立来源交叉支持;商家自有页对自身排名的声明、单一 UGC 帖中的权威榜单、alt/title/meta 中出现但正文不可见的证据,应降低权重或标注来源。若模型已经识别到 embedded instruction,可把警告暴露给用户或直接作为降权信号,避免“模型知道可疑但仍改变排序”。
第三,建立固定上下文的安全回归集。线上搜索结果会变化,不适合定位模型升级后为何变脆。可以借鉴 SIREN,把真实中文 query、冻结候选文档、一个可编辑 UGC 页面和基线答案保存下来,围绕可见正文、链接 title、图片 alt、Open Graph/meta、列表和 FAQ 做结构化变体;每次更换生成模型、重排器、清洗规则或提示词,都重放并记录实体 rank shift、来源归因和答案警告。
第四,完整链路需要分层拦截。抓取层清理不可见属性和异常 meta;索引/重排层加入来源与内容重复度特征;生成层要求关键排名主张带引用且跨源一致;展示层让用户看到每个推荐理由来自哪一页。只在最后一层加一个提示词并不足够,因为宣称式载荷并不表现为命令。
第五,控制红队成本。论文的 443.6M token 表明不应把 20 轮三模型攻击循环放入在线请求。更现实的做法是离线对高风险 query 类别运行多轮搜索,线上使用由红队样本蒸馏出的轻量分类器、规则与来源核验;对高价值或高争议榜单再触发昂贵的多源验证。论文没有报告防御的线上延迟、内存或 A/B 收益,因此工程团队应把安全提升与 nDCG、CTR、召回覆盖和 P99 延迟一起评估,避免防御把正常长尾内容全部压低。