Agent 工具调用安全是什么
工具调用把模型输出变成了真实动作,安全边界从「读」扩展到「写」。核心原则是最小权限:每个工具只给完成任务所需的最小范围,能查的不能改,能改的不能删,能删的要二次确认。权限要绑定调用者身份而不是模型会话;所有参数在后端做白名单校验,不信任模型给出的值;涉及资金、删除、对外发消息这类不可逆动作必须有二次确认或双人复核。工具返回的内容同样要当外部输入处理,防止注入把后续步骤带偏。
基本信息
| 最小权限 | 每个工具只授予完成任务必需的范围 |
|---|---|
| 身份绑定 | 权限随调用者身份,而非模型会话 |
| 参数校验 | 后端白名单校验,不信任模型生成的参数 |
| 不可逆动作 | 删除、支付、外发消息需二次确认或审批 |
| 回包处理 | 工具返回值视为外部输入,防提示注入 |
| 审计要求 | 记录调用者、参数、结果与时间 |
典型使用场景
- 数据库操作类工具:只允许受限查询,禁止无 where 的更新与删除
- 文件与脚本执行:沙箱内运行,限制可访问路径
- 对外消息发送:发送前人工确认,防止误发与越权外发
- 订单与资金动作:走审批流,模型只提交申请不直接执行
- 检索类工具:按调用者身份过滤结果,避免越权读取
工具定义与参数校验
工具定义与参数校验
TOOLS = {
"search_docs": {"scope": "read", "permission": "doc.read"},
"update_ticket": {"scope": "write", "permission": "ticket.write"},
"delete_record": {"scope": "dangerous", "permission": "record.delete"},
}
def invoke(user, name, args):
tool = TOOLS[name]
assert tool["permission"] in user.permissions, "越权调用"
args = whitelist_validate(name, args) # 参数白名单与类型校验
if tool["scope"] == "dangerous":
require_human_approval(user, name, args) # 不可逆动作必须人工确认
return run_tool(name, args)工具风险分级
| 级别 | 示例 | 管控要求 |
|---|---|---|
| 只读 | 文档检索、查询状态 | 记录审计日志即可 |
| 低风险写 | 创建草稿、写临时文件 | 参数校验加幂等控制 |
| 高风险写 | 修改配置、对外发消息 | 二次确认并收紧权限范围 |
| 不可逆 | 删除数据、支付、退款 | 人工审批与双人复核 |
模型可能被文档或网页内容诱导调用工具:工具权限必须由后端强制校验,不能靠提示词约定「不要做某事」来兜底。
工具的返回内容会进入模型上下文,同样可能携带注入指令;对回包做长度限制与格式校验,能降低被利用的空间。