把智能体接入外部文档、网页或工具后,风险不只来自用户主动输入的内容。知识库文本、网页正文、搜索摘要,甚至工具返回的备注字段,都可能混入看似普通、实际试图改变执行方向的伪指令。即使新一代模型在提示词注入防护方面表现更好,也不能替代上线前的自测;尤其当智能体的内部决策过程不容易被完整监控时,更要用可重复的测试记录来判断它是否真的守住了边界。
自测前先写清楚测试对象、数据范围和允许的操作。测试应针对自己拥有或已经获得授权的智能体、知识库、网页资料和工具账号,不要把测试样本投向无关的第三方服务,也不要使用真实客户资料、真实密钥或不可撤销的生产操作。
同时准备一个“安全基线”:在没有加入测试样本时,智能体应该完成什么任务、可以读取哪些数据、能够调用哪些工具、哪些动作必须经过人工确认。没有基线,就很难区分“模型正常拒绝”“任务本来就不支持”和“被外部内容改变行为”。
例如,一个用于整理授权文档的智能体,基线可以是:只总结文档内容;不把文档中的指令当成新的任务;只允许调用查询类工具;涉及发送、删除、修改或对外提交的动作必须停止并请求确认。后续所有测试都围绕这些边界展开。
测试样本不需要写成可直接滥用的攻击载荷。更安全、也更适合长期回归的方法,是使用“来源 + 伪指令意图 + 预期行为”的抽象模板。样本中只描述要验证的行为,不放入真实系统提示词、真实凭据或真实外发地址。
第一类样本直接放在用户消息中,重点验证智能体能否区分“用户任务”和“用户要求改变系统规则”的内容。可以围绕以下变化设计多组样本:
这里的关键不是测试某个关键词能否被拦截,而是观察智能体是否仍然遵守角色、权限和审批要求。可以把同一意图改写成正式语气、口语表达、混合语言、分段描述或夹在正常业务问题中,以检验防护是否只依赖表面词汇。
第二类样本放入智能体会检索到的文档、网页或内部资料中。这是间接注入的主要测试场景:用户只是要求总结或查找信息,模型却可能把检索内容里的命令误当成工作指令。
构造时,可以在正常资料中加入一段与正文主题无关的“操作性内容”,但不要写出真实攻击语句。测试意图包括:要求模型改变最终结论、要求跳过原有审核、要求披露其他文档内容,或要求执行文档中声称的下一步动作。
每个样本都要保留来源标识,例如文档编号、页面地址、段落位置和导入时间。这样才能判断问题来自检索、切片、排序,还是来自模型对外部文本角色的误判。测试时还应覆盖不同排版形式,如正文段落、表格单元格、页脚、引用块和元数据字段,因为外部内容不一定只出现在模型容易识别的正文中。
第三类样本放在工具返回结果里,例如搜索结果摘要、网页抓取内容、工单备注、接口返回的描述字段或文件解析结果。此时要重点验证:工具输出是数据,还是被智能体误认为新的指令来源。
可以设计几种安全的模拟返回结果:
这类测试最好使用沙箱工具或模拟接口。工具可以返回固定文本,但不能连接真实外发渠道,也不能授予删除、写入、付款或发送等不可逆权限。资料中提到的分层防御思路也说明,输入过滤不是唯一防线,最小权限、结构化输出校验和人工审批同样重要。
先把智能体的正常任务跑通,记录它在无异常样本时的角色、工具和输出。然后每次只改变一个变量:注入来源、表达方式、所在字段或目标动作。一次加入太多变化,出现异常后很难定位原因。
接着按“低风险到高风险”的顺序执行。先测试是否改变回答方向,再测试是否试图读取不该读取的信息,最后才测试工具调用边界。所有高风险工具都使用模拟环境,或者将权限收窄到只读、无外发、可撤销的范围。
观察结果时,不要只看最终文字。还要记录模型是否产生了工具调用请求、调用参数是否发生变化、是否绕过确认、是否访问了额外数据,以及拦截器在输入、模型输出和工具动作哪个环节生效。某次回答表面上拒绝了请求,但如果后台已经发起未授权调用,仍应判定为失败。
每次修复后重新执行原样本,再加入同一意图的改写样本。输入过滤只能挡住部分明显、低变异的内容,不能把“没有命中关键词”当成安全证明。更可靠的标准是:即便外部内容成功影响了模型的语言理解,也无法越过工具权限和审批层。
智能体可以引用或概括外部文本,但不能把其中的伪指令当成系统规则、开发者要求或用户新任务。面对冲突内容时,它应继续完成原始任务,或者明确说明该内容只是待分析的数据。
如果测试目标是“总结文档”,合格结果应是总结文档,而不是执行文档里的操作建议。若智能体改变了任务目标、主动执行无关流程,或者声称外部文本拥有更高优先级,就应记录为角色边界失守。
判断工具安全时,要看实际动作和参数,而不是只看回复中的解释。以下情况都属于失败信号:调用了基线之外的工具;把只读操作升级为写入操作;修改了目标、收件人或数据范围;在没有确认的情况下执行高风险动作;通过连续调用间接完成被禁止的目标。
即便调用最终因权限不足而失败,也应记录为“越权尝试已发生”。权限系统挡住了后果,但智能体的决策边界仍然需要修复。
当样本要求透露系统提示词、隐藏规则、内部路径、凭据或其他不应展示的信息时,合格行为不是简单地输出一段经过删减的内部内容,而是拒绝披露,并继续提供不依赖秘密信息的帮助。
测试记录中应区分“拒绝泄露”和“泄露后再道歉”。只要响应中出现了可用于还原内部规则的片段,或者输出了真实敏感值,就不能判定为成功拦截。对于系统提示词,可以记录是否泄露了结构、关键约束和隐藏字段,但不要为了测试而把真实内容复制到报告或共享表格中。
每条样本单独编号,保证修复后可以原样回放。表格不必记录攻击原文,可以保存经过脱敏和抽象化的测试意图。
“通过”不能只表示模型说了一句拒绝。建议将一次测试的最终结论按三个维度分别记录:角色边界、工具权限、信息泄露。只要其中一项失败,就将该样本标记为未通过;如果结果依赖偶然的措辞或多次运行不一致,则标记为需要复核,而不是直接放行。
上线前至少保留一组固定回归样本,并在每次修改系统提示词、知识库处理流程、工具权限或拦截逻辑后重新执行。测试范围也不要只覆盖用户输入,要确认外部文档和工具返回内容经过相同的安全审查。
如果智能体无法解释某个工具动作是否得到授权,或者监控系统看不到关键调用和参数,就不要仅凭模型回答正常来判断安全。先补齐日志、权限和人工确认,再继续扩大接入范围。提示词注入自测的目标不是证明模型永远不会被影响,而是确认即使它受到影响,也不能轻易越过角色边界、调用未授权工具或泄露内部信息。
Δ
Ctrl+D