Agent 工具权限与沙箱应该如何设计?
简化版
Agent 的工具安全要同时做授权和隔离:授权决定“能调用哪个工具、访问哪些对象、参数上限是多少”,沙箱限制“即使生成恶意代码,最多能影响什么”。权限由服务端根据用户、租户、任务和审批令牌强制执行,不能信任 Prompt 或模型传入的角色;代码执行则默认断网、只挂临时目录,并限制 CPU、内存、进程、时间和系统调用。
详细版
工具网关先认证真实调用主体,再用 RBAC/ABAC 判断工具、方法、资源和参数是否允许。例如客服 Agent 可读取当前租户订单,但退款金额超过 500 元必须携带绑定订单与金额的审批令牌。模型只生成候选参数,租户 ID、身份和权限范围由可信上下文注入。
LLM candidate action
-> Schema validation
-> policy(user, tenant, task, tool, resource, args)
-> risk/approval check
-> sandbox or tool execution
-> output filtering + audit
沙箱使用非特权进程或隔离容器,根文件系统只读,工作目录临时化,网络默认拒绝,允许域名通过代理控制;限制执行时间、内存、磁盘、文件数和子进程。密钥不放进 Prompt,按具体工具短期下发。所有副作用带幂等键和审计记录,高风险动作执行前再次校验状态。
完整版教学
一、权限与沙箱解决不同问题
权限回答“这次动作被允许吗”,例如某用户能否读取订单;沙箱回答“执行代码失控时能影响多大”,例如是否能读取宿主文件。只有权限没有沙箱,获准运行的代码仍可能利用漏洞;只有沙箱没有授权,Agent 仍可能合法调用接口读取别人的数据。
两层都必须由模型外的确定性组件执行。System Prompt 中写“不要越权”只能降低误操作概率,无法提供安全边界。
记忆钩子:权限是门禁,沙箱是围墙;门禁决定谁能进,围墙限制进来以后能走多远。
二、工具级允许列表只是起点
允许 database 工具过于宽泛,还要限制读写方法、表或资源、租户、行范围和参数。权限粒度应匹配潜在影响,而不是匹配函数名称。
| 层级 | 控制示例 | 防止的问题 |
|---|---|---|
| 工具 | 只允许 order_reader | 调用无关高危工具 |
| 方法 | 允许 GET、禁止 DELETE | 写入或删除 |
| 资源 | 仅当前租户订单 | 跨租户访问 |
| 参数 | 退款 ≤ 500 元 | 扩大业务影响 |
| 时间 | 凭证 10 分钟失效 | 长期滥用 |
ABAC 可以综合用户角色、任务类型、数据级别和时间;策略应版本化并记录命中规则,便于审计为什么允许或拒绝。
三、可信身份不能由模型提供
如果工具参数含 tenant_id,模型可能填错或被注入诱导修改。调用主体、租户和数据域应从认证会话或任务元数据注入,模型无权覆盖;模型只填写业务参数。
trusted context: user=u7, tenant=t3, task=job9
model args: order_id=123
gateway query: order 123 must belong to tenant t3
即使订单 ID 猜对,归属检查不通过也返回拒绝。错误信息不要泄露目标对象是否存在,避免成为枚举通道。
四、高风险授权绑定具体动作
付款、发布、删除等动作需要用户或审批系统授权。授权令牌应绑定任务、工具、资源、关键参数、内容哈希和有效期;动作任何重要字段变化,旧令牌都失效。
例如批准退款 100 元后,模型把金额改成 1000 元,网关重新计算动作哈希会发现不匹配。批准不能只是 approved=true,也不能让模型在参数里自称“用户同意”。
执行前还要重新检查账户状态和限额,因为审批等待期间外部条件可能已经变化。
五、代码沙箱遵循默认拒绝
代码执行容器使用非 root 用户、只读基础镜像和一次性工作目录,默认没有宿主挂载与网络。按需开放的文件以只读或最小写权限挂载,网络只能经过记录请求的代理访问允许域名。
资源限制至少包括 CPU 时间、墙钟时间、内存、磁盘、输出大小、进程数和打开文件数。只限制超时仍可能在几秒内 fork 大量进程或写满磁盘。
容器并非绝对安全边界,高风险多租户执行可采用更强隔离的微虚拟机、独立账户和及时补丁,并假设逃逸漏洞可能存在。
六、秘密应按调用临时注入
把数据库密码或 API Key 放进 Prompt,模型可能在回答、日志或工具参数中泄露。更稳的方式是由工具服务持有秘密,Agent 只拿不透明工具能力;必须下发时使用短期、窄权限凭证。
假设长期密钥可访问 100 个仓库,而任务只需读 1 个仓库 10 分钟,应换成只读该仓库的临时 token。即使泄露,影响面和时间窗口都显著缩小。
日志、错误堆栈和 Observation 经过敏感字段过滤;过滤器本身也要测试编码、分片和嵌套 JSON 等绕过方式。
七、网络与文件输出也可能成为副作用
只防命令执行还不够。HTTP GET 可能访问云元数据服务,生成文件可能覆盖配置,DNS 查询也可能泄露数据。网络策略应阻止内网、环回、链接本地和动态解析绕过,并限制重定向后的目标。
文件路径先规范化再校验必须位于任务目录,拒绝 ..、符号链接逃逸和设备文件。产物上传前检查类型、大小和恶意内容,不能让生成的 HTML 或压缩包成为后续攻击载体。
所有出口都应被视为能力:网络、文件、消息、日志乃至错误回显,都有独立边界。
八、审计和攻击测试证明控制有效
审计记录主体、策略版本、工具、规范化参数摘要、审批令牌 ID、结果和副作用业务号。敏感值做脱敏或哈希,同时保证事件可关联。
测试包括提示注入要求调用禁用工具、模型篡改租户、路径穿越、访问云元数据、fork bomb、内存耗尽、复用过期审批和把秘密写进输出。期望结果必须是执行层拒绝,而不只是模型回答“我不会”。
若 10,000 个越权样例拦截 9,999 个,99.99% 看似很高,但安全边界仍有一个真实缺口;对确定性授权策略应要求全部拦截,并单独统计误拦截率。
九、常见误区与追问
- 误区:Prompt 写明不能调用危险工具就足够。 提示可被绕过,必须由网关策略强制拒绝。
- 误区:有容器就绝对安全。 仍需非特权、资源限制、网络策略、补丁和更强隔离评估。
- 误区:只读操作没有风险。 读取可能泄露跨租户数据,网络 GET 也可能访问内网。
- 误区:审批一次后参数可以小幅调整。 关键参数变化会改变授权对象,必须重新校验或审批。
- 误区:把密钥交给模型调用最灵活。 应由工具服务持有秘密,使用短期最小权限凭证。
- 追问:RBAC 和 ABAC 如何选择? 固定岗位用 RBAC,资源、租户、金额和时间等动态条件用 ABAC 补充。
- 追问:怎样防止路径穿越? 规范化真实路径,校验位于任务根目录,并禁止危险链接与设备文件。
- 追问:沙箱失败后如何止损? 撤销临时凭证、销毁实例、冻结产物并按审计链调查影响。
十、加强记忆
工具安全记住“身份可信、权限够细、授权绑定、执行隔离、出口受控”:身份与租户从可信会话注入,策略限制到工具、资源和参数;高风险批准绑定动作哈希和期限;代码在非特权、默认断网、资源受限的临时环境运行;秘密由工具托管,网络、文件和日志都按出口治理。安全效果必须通过越权与逃逸测试证明,不能靠模型自律。