Agent 比聊天机器人危险一档
聊天机器人的输出是文字,错了顶多误导人。Agent(能自主规划步骤并调用工具完成任务的 AI 系统)的输出是动作:读写文件、执行命令、调用 API、花钱下单。能力升级带来的不是等比例的风险增长,而是质的跨越——一次提示注入或误操作的爆炸半径,从「一段错误回答」变成「被删的数据库、被转走的余额、被外发的客户资料」。给 Agent 上锁因此不是可选项,而是上线前的必修课。
最小信任三问
每接入一个工具,先过三问:
- 这个工具必须存在吗? 每个工具都是一条攻击面。能靠检索解决就不给执行能力,能靠模板生成就不给写权限。
- 必须这么强吗? 收窄参数与作用域:给只读变体而非读写通用版;限定可操作的目录、数据表、资源 ID;给金额与频次设上限。
- 必须自动执行吗? 高危操作(删除、支付、外发、生产变更)一律挂人工确认,Agent 只负责「拟稿」,人负责「签发」。
三问的顺序有意义:先砍存在性,再收强度,最后才谈流程,不要一上来就设计审批流。实践中还有一个好用的信号:某个工具的用途如果你一句话说不清,它大概率不该出现在工具列表里。
权限分级
把能力按风险分四级,逐级收紧:
| 级别 | 示例 | 确认方式 |
|---|---|---|
| 只读 | 查知识库、读工作区文件、搜索 | 自动执行 |
| 工作区写入 | 写代码文件、改草稿、提交到分支 | 自动执行,事后可回滚 |
| 系统变更 | 执行 shell 命令、改配置、调内部管理接口 | 逐次人工确认 |
| 网络与支付 | 外发请求、调用付费 API、下单转账 | 白名单加限额,外加人工确认 |
原则:新工具默认落在最低档,升级要有明确理由并记录在案;确认方式跟着风险走,而不是跟着开发进度走。
沙箱:假定它会犯错
权限设计管「允许做什么」,沙箱管「越界之后会发生什么」。三件事最关键:
- 文件系统隔离:容器或独立工作目录挂载,Agent 可见的世界就是它能破坏的世界。
- 进程隔离:工具调用在受限进程里执行,限制 CPU、内存与运行时长,避免一条失控命令拖垮宿主。
- 网络出口白名单:默认断网、按需放行域名。这一条直接封死「目标劫持」类注入的外传通道。
实现取舍一句话:容器是工程性价比的起点;对强隔离需求可以上 microVM(以 Firecracker 为代表的轻量虚拟机,毫秒级启动、内核级隔离),代价是链路更复杂。数据越敏感,隔离边界越要往硬件层推。还有一种常被漏掉的边界是时间:给任务设截止时间与步数上限,失控的循环和失控的命令一样危险。
审计与回滚
锁也要给事后看。所有工具调用全量留痕:谁(会话与用户)、何时、什么参数、返回结果,构成可追责的操作日志。同时把「可回滚」做进操作设计:代码改动走 git(先建分支再动手)、文件变更前打快照、危险命令先跑 dry-run(只打印将执行的动作而不真正执行)。有了回滚能力,事故从「灾难」降级为「工单」。
困惑代理人
安全领域有个经典概念叫困惑代理人(Confused Deputy):一个持有合法权限的执行者,被欺骗后用自己的权限做了坏事。被注入的 Agent 就是典型——它不是叛徒,而是被骗的诚实员工。这个视角决定防御姿态:你审不了它的「动机」,只能限制被骗员工的行动能力——没给钥匙,骗了也偷不走。前面所有设计,最终都落到这一句上。
部署自查清单
- 每个工具都回答过最小信任三问,砍掉了非必需工具。
- 高危操作全部挂人工确认,不存在静默执行路径。
- 有权限分级记录,新增工具默认最低档。
- 网络出口默认拒绝,白名单定期复审。
- 文件与进程隔离实测过,越界访问被验证拒绝。
- 工具调用全量留痕,日志包含参数与结果。
- 关键操作可回滚,回滚流程演练过。
- 注入与滥用用例进了红队清单,换模型或改提示后回归。
小结
Agent 的安全性不取决于模型多聪明,而取决于你给它多大的舞台。最小信任三问收窄能力,四级权限划清边界,沙箱兜住越界,审计与回滚降低事故成本。记住困惑代理人:防御的目标不是骗不到,而是骗到之后也损失有限。
读者留言
COMMENTS 暂无还没有留言,来说第一句?