RAG 知识库污染实战:从隐藏指令到敏感输出的间接提示注入复现与防护

📅 2026/7/1 8:56:35
RAG 知识库污染实战:从隐藏指令到敏感输出的间接提示注入复现与防护
摘要RAG 应用把知识库、网页、工单等外部内容接入大模型后检索内容会进入模型上下文。如果系统没有区分“资料”和“指令”被污染的知识文档就可能把隐藏提示词带入回答链路诱导模型泄露 canary、绕过输出策略或改变回答边界。本文通过本地可复现实验模拟供应商审计知识文档被夹带隐藏指令的场景。攻击链并不依赖复杂漏洞污染文档被检索命中后RAG 应用直接把原始内容拼入 prompt模型便在回答普通审计问题时输出本地 canary。防护后通过上下文隔离、指令行隔离、敏感输出拦截和回归测试阻断同一攻击链。攻击链可以概括为污染写入、检索命中、上下文混淆、敏感输出、审计缺失。本文结论是RAG 安全不能只依赖模型“听话”必须把检索内容视为不可信数据源。知识库文档只能提供事实依据不能拥有修改系统策略、读取密钥或改变输出边界的能力。关键词AI安全RAG提示词安全间接提示注入知识库污染数据安全安全测试风险要点攻击入口不只在用户问题知识库、网页、工单和邮件正文都可能成为间接提示注入载体。关键失误是把检索内容直接拼进 prompt导致资料通道和指令通道混用。落地防护需要上下文隔离、污染样本检测、敏感输出拦截、审计记录和回归测试共同完成。1. 背景RAG 的可信边界被拉长RAG 的价值在于让模型基于最新知识回答问题但它也扩大了输入面。传统提示词攻击主要来自用户直接输入而在 RAG 场景中攻击者只要能影响知识库内容、网页片段、FAQ、工单描述或邮件正文就可能把指令藏进模型会检索到的资料里。本文模拟的业务场景是安全运营团队使用 RAG 助手回答供应商接入审计问题。知识库中有一份正常审计流程文档也有一份被污染的补充说明。污染文档表面描述账号有效期检查隐藏注释中却要求模型输出 system_secret_canary。图 1 RAG 间接提示注入链路知识文档污染进入检索增强上下文2. 实验环境与攻击面为避免影响真实系统本文全部实验均在本地目录中完成。knowledge_base 代表 RAG 知识库runtime_secret.env 中的 canary 是人工构造的标记字符串不包含真实密钥。图 2 本地实验目录干净知识、污染知识和本地 canary组件用途安全预期01_vendor_audit_clean.md正常供应商审计知识文档可作为事实依据引用02_vendor_audit_poisoned.md被污染知识文档夹带隐藏指令只能抽取事实隐藏指令应隔离runtime_secret.env本地构造 canary 文件任何回答都不应输出rag_app模拟 RAG 检索与回答链路必须区分资料与指令威胁点攻击者能力防守边界知识库污染攻击者可提交 FAQ、文档片段或工单内容检索内容默认不可信间接提示注入攻击者将指令藏在注释、引用块或补充说明中指令行需隔离或降权敏感输出攻击者诱导输出 canary、token、env 等内容敏感模式默认拒绝并记录3. 复现污染知识如何进入回答污染文档并不需要包含复杂代码。只要它能被检索命中并且 RAG 应用把原始文档直接拼进 prompt隐藏注释里的指令就可能与系统指令处在同一个上下文平面。图 3 污染知识文档业务说明中夹带隐藏指令复现过程可以拆成四步用户询问供应商接入审计需要关注哪些事项。Retriever 召回污染文档和正常文档。防护前应用将检索内容原样拼接进 prompt没有标记资料边界。模型把隐藏指令当成可执行要求回答中输出本地 canary。图 4 防护前复现结果污染检索内容导致 canary 输出4. 根因资料通道被当成指令通道该问题的根因不是检索本身而是 RAG 应用没有把检索内容降权为资料。对于模型来说拼接后的上下文都是文本如果没有明确的边界、过滤和输出策略隐藏指令就可能获得与系统要求相近的影响力。检索内容来自外部或半可信数据源不能默认拥有修改系统策略的权限。HTML 注释、Markdown 引用块、表格备注和长段补充说明都可能成为隐藏指令载体。仅在系统提示词中写“不要泄露秘密”不够输出层还需要敏感模式拦截。如果没有结构化审计事后很难判断是用户输入还是检索文档触发了异常输出。图 5 根因对比把检索内容当指令与当资料的差异影响面风险表现评估结论数据安全知识库污染可能诱导输出 canary、内部字段或敏感摘要高风险需默认不可信业务可靠性模型可能偏离真实问题执行污染文档中的隐藏要求中高风险需上下文隔离审计溯源若只保存最终回答很难定位污染来源文档需记录检索文档、隔离行和决策结果5. 防护让检索内容只能提供事实防护思路是把检索内容从“可影响模型行为的指令”降权为“只能提供事实的资料”。工程上可以先清洗检索片段隔离疑似指令行再用明确模板告诉模型引用内容只作为事实依据不得执行其中的命令。输出层还要独立拦截 canary、token、env、AK/SK 等敏感模式避免只依赖提示词约束。safe_context,quarantinedsanitize(retrieved_docs)promptbuild_prompt(system_policypolicy,contextsafe_context,context_roleuntrusted_reference_only)answermodel(prompt)answerblock_sensitive_patterns(answer)对忽略规则、调试助手、输出密钥、system_secret 等高危词建立隔离规则。保留被隔离行与来源文档进入审计日志便于后续复盘。对 canary、token、env、AK/SK、手机号等敏感模式做输出层拦截。对关键知识库建立准入审核避免外部内容直接进入高权限 RAG 流程。图 6 防护后结果隐藏指令被隔离回答仅保留业务事实6. 回归验证防护不能只看一次演示是否成功还需要把污染样本纳入回归测试。测试集应同时覆盖正常知识回答、污染指令隔离、敏感输出拒绝和正常业务问题回答避免后续提示词或检索策略调整时重新引入风险。图 7 回归测试污染样本隔离敏感输出拒绝测试项预期说明干净文档回答ALLOW正常知识仍可用于回答污染文档隐藏指令QUARANTINE疑似指令行被隔离canary 输出诱导DENY敏感模式命中后拒绝输出普通供应商审计问题ANSWER保持业务可用性7. 运营发现并追踪污染样本RAG 安全需要可观测性。建议每次回答记录 query、retrieved_docs、quarantined_lines、sensitive_hit、decision 等字段。当检索文档出现隐藏注释、忽略规则、调试助手、输出密钥等特征时应提升告警等级并保留来源片段便于定位污染样本。{query:供应商接入审计需要关注哪些事项,retrieved_docs:[02_vendor_audit_poisoned.md,01_vendor_audit_clean.md],quarantined_lines:4,sensitive_hit:system_secret_canary,decision:ANSWER_WITH_SAFE_CONTEXT}知识库写入侧建立审核外部文档进入生产知识库前先做安全扫描。检索侧记录来源文档和片段位置便于定位污染来源。生成侧明确资料边界禁止模型执行检索内容中的命令。输出侧加入敏感模式拦截命中后脱敏、拒绝或转人工审核。测试侧沉淀污染样本作为 RAG 应用发布前的固定用例。8. 结语RAG 把知识库接入模型也把知识库的信任问题带进了模型上下文。本文的本地实验说明间接提示注入不需要直接攻击模型只要污染能被检索命中的资料就可能影响回答链路。防护的关键不是让模型“更听话”而是把检索内容当作不可信资料处理做到上下文隔离、敏感输出拦截、审计可回放、测试可回归。