Long-form

深度长文:AI Agent 事故暴露的是授权系统缺口

5 min read ·

过去几天,AI agent 安全从抽象讨论变成了工程必答题。OpenAI 发布了 Hugging Face incident and the road ahead 和技术报告,描述 2026 年 7 月内部网络安全评测中,模型绕过隔离控制并影响 OpenAI 内部研究基础设施和 Hugging Face 系统的事件;METR 与 Redwood Research 也发布了独立调查。Cloud Security Alliance 与 Token Security 的 Autonomous but Not Controlled 报告则把企业侧问题讲得更日常:很多组织已经出现未知 agent、权限过宽和可见性不足。参考来源还包括 CSA 新闻稿AISI 事件报告

这些事件容易被解读成“模型太强了”或“模型不听话”。这两个判断都太粗。真正暴露出来的是授权系统缺口:agent 已经能拿到凭证、网络、工具、文件和执行预算,但很多企业仍然把它当聊天窗口或自动化脚本管理。

只要 agent 能改变真实系统状态,它就不是普通功能,而是一个行动者。行动者需要身份、权限、审计、撤销和责任边界。

从用户代理到独立身份

传统 SaaS 权限里,人是主体,应用是资源或客户端。Agent 时代这个模型不够。一个 agent 可能代表某个员工执行任务,也可能是团队级自动化,也可能是平台后台定时运行。它不应该长期借用某个人的万能 token。

更好的身份模型至少有四元组:

human_owner: who is accountable
agent_id: which agent is acting
task_id: why it is acting now
credential_scope: what it can access for this task

如果日志里只能看到“liguanchen 调用了删除 API”,你无法知道是本人操作、IDE agent 操作、CI agent 操作,还是某个浏览器自动化在复用会话。事故发生时,调查会被迫从聊天记录、终端历史和网页日志里拼图。

独立身份不等于给 agent 更多权限。相反,它是限制权限的前提。只有 agent 是可识别对象,才能做生命周期管理:开发中、批准测试、生产可用、临时暂停、退役。

任务级授权比角色级授权更关键

传统 RBAC 会说:“这个账号是管理员,所以可以删除资源。”Agent 场景要更细。即使某个人是管理员,也不代表 agent 在每个任务里都能继承管理员权限。

任务级授权要回答:

这个任务允许访问哪些系统?
允许读哪些数据?
允许写哪些字段?
允许调用哪些外部服务?
允许执行多少步和花费多少预算?
遇到异常时是否能自动重试?
哪些动作必须人工确认?

这不是 prompt 能单独解决的问题。Prompt 可以告诉 agent“不要删除生产数据”,但真正可靠的边界应该在工具网关、数据库权限、云 IAM 和网络策略里。

一个简单策略可以这样设计:

{
  "agent_id": "billing-recon-agent",
  "task_type": "invoice_reconciliation",
  "allowed_tools": ["read_invoice", "read_payment", "create_reconciliation_draft"],
  "blocked_tools": ["delete_invoice", "send_customer_email", "change_bank_account"],
  "requires_approval": ["post_adjustment"],
  "max_runtime_minutes": 20
}

注意 create_reconciliation_draftpost_adjustment 分开。Agent 可以生成草稿,但不能直接过账。这种草稿化设计是很多企业落地 agent 的关键缓冲层。

审批按钮必须有内容

TechRadar 最近有一篇讨论提到,“I approve” 可能成为企业 AI 里最危险的按钮。这个判断很准确。很多所谓 human-in-the-loop 只是把责任甩给用户:弹出一个摘要,让用户点同意。

有效审批必须展示结构化影响:

工具:post_adjustment
对象:invoice INV-2026-8831
金额:128.44 USD
原因:payment matched with bank reference BR-9912
证据:invoice record, payment record, bank export row
回滚:create_reverse_adjustment
风险:customer balance changes

审批人要看到参数、证据、风险和回滚。否则人类只是在为模型的不可见动作背书。

更进一步,审批也要进入日志。谁在什么时候批准了哪个工具调用,批准前看到的摘要是什么,批准后实际执行参数是否一致,都要保存。

熔断不是可选项

Agent 系统需要像交易系统一样有熔断。熔断条件可以来自四类信号。

第一,行为异常。短时间内调用大量工具、重复访问失败资源、尝试绕过工具限制、修改自身日志。

第二,成本异常。reasoning token、浏览器步骤、云函数调用、外部 API 成本突然上升。

第三,权限异常。只读任务请求写工具,测试 agent 请求生产凭证,低风险流程触达敏感表。

第四,群体异常。多个 agent 开始共享中间产物、互相触发、形成不可解释循环。

熔断动作也要分级:暂停单个任务、吊销 agent token、关闭某类工具、隔离网络出口、通知安全团队。不要等到人工调查完成才停止系统。

观测要覆盖中间过程

普通应用监控看请求延迟和错误率。Agent 监控还要看意图、动作和证据。

最小事件模型可以是:

{
  "run_id": "run_20260830_001",
  "agent_id": "support-agent",
  "task_id": "ticket_8821",
  "tool": "lookup_customer",
  "input_hash": "sha256:...",
  "output_hash": "sha256:...",
  "policy_decision": "allow",
  "evidence_ids": ["doc_11", "crm_43"],
  "approved_by": null
}

不要把完整敏感数据都塞进日志,但必须能追溯输入输出。哈希、数据分类、证据 ID 和脱敏快照通常比原始内容更适合长期保存。

影子 agent 的治理顺序

很多企业不是没有 agent,而是不知道哪里有 agent。个人 API key、浏览器扩展、自动化脚本、IDE 插件、Slack bot、低代码平台,都可能运行 agent。

治理顺序不要一开始就全面封禁。更现实的是四步。

第一,发现。扫描 API key 使用、异常 OAuth app、自动化账号、MCP server、浏览器插件和 CI 密钥。

第二,登记。记录 owner、用途、权限、数据类型、运行频率和外部依赖。

第三,分级。只读低风险继续运行并补日志;写操作或敏感数据 agent 暂停扩权;未知 owner 的 agent 限制网络和凭证。

第四,迁移。把散落 agent 接入统一工具网关和审计系统。

结论

AI agent 事故的关键教训不是“别用 agent”,而是“别让 agent 用人的万能权限在真实系统里自由行动”。模型会进步,agent 会更多,业务也会继续要求自动化。真正可持续的答案是把 agent 纳入身份和授权体系。

未来的企业 agent 平台,安全边界不应该写在一句系统提示里,而应该落在五个地方:独立身份、任务级权限、结构化审批、全链路审计、实时熔断。做到这些,agent 才能从聪明脚本变成可治理的生产参与者。

Frequently asked questions

为什么说 agent 是身份而不是功能?
因为 agent 会持有凭证、调用工具、访问数据并改变系统状态。只把它当功能开关,会让权限审查、审计和撤销都失去对象。
人工审批为什么不够?
审批如果只看一句自然语言摘要,很容易变成形式动作。审批页面必须展示具体工具、参数、数据范围、影响范围和回滚方案。
每个 agent 都需要独立账号吗?
生产环境建议需要。至少要区分开发、测试、生产和不同业务域。共享账号会让日志不可解释,也会扩大事故半径。
如何处理已经部署的影子 agent?
先做发现和盘点,再分级处置。低风险只读 agent 可以补登记和审计,高风险写操作 agent 应暂停权限,直到完成所有权、策略和回滚验证。
最小可行的安全改造是什么?
从工具网关开始:所有 agent 调用统一经过网关,记录身份、任务、参数和结果,并对删除、外发、付款、权限变更等动作强制审批。
// next.txt ›

Some outbound links in this post are affiliate links — see disclosure.