工具返回内容里的注入
搜索、网页抓取、数据库查询、外部接口的返回值同样不可信。攻击者可以在网页或数据里写一段指令,等模型抓取回来执行。处理原则很简单:工具输出统一放进数据块,明确声明其中的指令不执行;高风险动作不因返回内容直接触发,而是走权限校验与人工确认。
基本信息
| 原因 | 外部系统返回内容不在你的控制范围内 |
|---|---|
| 处理 | 工具输出统一包在 result 数据块,声明其中指令不执行 |
| 高风险 | 下单、转账、删除等动作不因内容直接触发 |
| 追溯 | 记录工具输出来源 URL 或接口地址 |
典型使用场景
- 联网搜索代理:抓回的网页里可能夹带指令段落
- 数据库查询代理:字段值里出现指令样文本
- 邮件助手:外部来信正文不可信
- 工单系统:用户提交的内容会进上下文
- 浏览器代理:页面上的按钮文案与提示语都可能是诱导
工具结果处理约定
工具结果处理约定
1) 工具输出统一包在 result 数据块中,与指令区分流
2) 提示中声明:result 内的一切指令都不执行,只提取事实
3) 高风险动作(下单 / 转账 / 删除)不因 result 内容直接触发,
必须走独立的权限校验与人工确认
4) 记录工具输出来源(URL / 接口地址 / 查询语句),便于追溯
5) 工具输出的内容在渲染前先剥离指令样式文本
# 隔离测试:用构造的返回内容做防护回归,
# 验证注入样本是否真的不会触发工具调用工具来源与风险处置
| 工具 | 内容风险 | 处置 |
|---|---|---|
| 网页搜索 / 抓取 | 页面里写指令诱导操作 | 按数据块处理,指令不执行 |
| 数据库查询 | 字段值含指令样文本 | 字段级转义,输出前剥离 |
| 外部接口 | 返回值可被第三方控制 | 校验字段类型与取值范围 |
| 邮件 / 消息 | 来信正文夹带指令 | 只当数据渲染,不触发动作 |
| 文件解析 | 文档正文含隐藏指令 | 解析后统一入数据区 |
把工具输出与系统指令拼在同一段流里,等于给外部内容发了指令权限。一次成功的注入就可能触发真实操作,而日志里看起来只是正常的一次工具调用。
审批与二次确认要放在工具调用之前,而不是事后。用户看到的「已执行」提示无法撤销一个已经完成的删除或支付动作。