大模型工具调用安全:从开放 API 到可控 Agent 的权限治理

发布时间:2026/7/6 13:19:38
大模型工具调用安全:从开放 API 到可控 Agent 的权限治理 大模型工具调用Tool Use / Function Calling让 LLM 从“会说话”进化为“能做事”。Agent 可以调用搜索引擎、数据库、代码执行器、邮件系统甚至直接操作企业 API。但能力越强风险越大。一个不加以约束的 Agent 可能会泄露敏感数据、执行未授权操作、被恶意 prompt 诱导调用危险工具。工具调用安全已经成为 LLM 应用从 demo 走向生产的关键门槛。一、工具调用带来的新风险与传统 API 调用不同LLM Agent 的工具调用具有以下风险特征-意图不可控模型可能误解用户意图调用不应使用的工具。-参数不可信模型生成的参数可能包含错误、越界或恶意内容。-链式风险一次工具调用可能触发后续调用形成不可预见的操作链。-权限模糊Agent 通常以某个身份运行但其调用行为可能超出用户授权范围。-数据泄露工具返回的数据可能包含敏感信息被模型泄露给无权用户。这些风险不是单一安全措施可以解决的需要建立从工具设计、调用校验、权限控制到审计追踪的完整治理体系。## 二、工具权限治理的四个层级### 1. 工具声明与 Schema 控制工具的首要安全属性是其声明。每个工具都应该有清晰的名称、描述、参数 Schema 和适用场景。Schema 不仅是调用格式的约束也是权限控制的基础。json{ name: send_email, description: 向指定收件人发送邮件仅用于用户明确请求的场景, parameters: { type: object, properties: { to: {type: string, format: email}, subject: {type: string, maxLength: 200}, body: {type: string, maxLength: 5000} }, required: [to, subject, body] }}text通过限制参数类型、长度、枚举值可以在源头减少模型生成危险参数的可能。### 2. 调用前审批与沙箱执行对于高风险工具应引入调用前审批机制。例如- 发送邮件需要用户确认- 删除数据库记录需要二次认证- 调用支付接口需要风控校验pythonclass ToolGatekeeper: def __init__(self): self.high_risk_tools {delete_record, transfer_money, send_email} def approve(self, tool_name, params, user_context): if tool_name in self.high_risk_tools: return self.request_human_approval(tool_name, params, user_context) return Truetext除了审批工具执行还应在沙箱或受限环境中进行。例如代码执行工具应运行在隔离容器网络访问应受限文件系统只暴露必要目录。### 3. 基于角色的权限控制不同用户或 Agent 应该拥有不同的工具权限。可以借鉴 RBACRole-Based Access Control模型pythonPERMISSIONS { guest: [search, read_document], analyst: [search, read_document, query_database, generate_chart], admin: [*]}def can_invoke(user_role, tool_name): allowed PERMISSIONS.get(user_role, []) return * in allowed or tool_name in allowedtext权限控制应在 Agent 调用工具前执行而不是依赖工具后端自身的权限。这可以防止 prompt 注入导致的越权调用。### 4. 输入校验与输出过滤即使权限配置正确参数本身仍可能被污染。输入校验需要覆盖- 参数类型和格式- 参数范围如 ID 是否在合法集合- 危险模式如 SQL 注入、路径遍历、命令注入- 敏感数据如身份证号、密码是否出现在不应出现的位置工具返回的数据也需要过滤防止敏感信息被模型泄露或返回给用户。pythondef sanitize_output(data, user_role): if user_role ! admin and salary in data: data[salary] REDACTED return datatext## 三、Prompt 注入与工具劫持防御Prompt 注入是工具调用安全中最难防御的攻击之一。攻击者可能通过用户输入诱导模型调用本不应调用的工具或传递恶意参数。常见防御策略包括-工具描述最小化避免在工具描述中暴露敏感信息或内部实现细节。-用户输入隔离将用户输入与系统提示、工具描述严格分离使用明确的分隔符。-调用意图确认在调用高风险工具前要求模型说明调用理由并由规则引擎复核。-白名单校验工具的参数值只能从白名单中选择避免开放文本参数。pythondef validate_params(tool_name, params): schema TOOL_SCHEMAS[tool_name] for key, prop in schema[parameters][properties].items(): if enum in prop and params.get(key) not in prop[enum]: raise ValueError(f参数 {key} 不在允许值列表中)text## 四、审计与可追溯性工具调用的每一次执行都应被记录包括- 调用时间、调用者、用户会话- 工具名称、参数、执行结果- 调用前的审批状态- 执行耗时和错误信息这些日志不仅是安全审计的依据也是优化 Agent 行为的数据来源。通过分析高频异常调用团队可以发现工具 Schema 设计缺陷或 prompt 漏洞。## 五、总结工具调用让 LLM Agent 真正具备了行动力但也把安全边界从模型输出扩展到了外部世界。生产级 Agent 必须建立完整的工具权限治理体系清晰的 Schema 声明、严格的调用审批、基于角色的权限控制、输入输出过滤以及全面的审计追踪。安全不是 Agent 的附加功能而是其架构设计的核心约束。只有可控的 Agent才值得信赖。