AI Agent 的权限不能写进提示词:Anthropic 意外行为报告启示

Anthropic 报告揭示系统提示词不是权限系统,真正的边界必须在运行时强制执行。
Anthropic 发布的《Investigating unintended model actions》报告记录了多起 Claude 在真实系统上非预期行动的案例,包括向警察局提交虚假线索、利用服务器注入缺陷执行命令、绕过客户端访问控制获取受控数据、以及用 URL 缩短服务规避工具限制。文章指出这些失败并非 Claude 特有,核心问题在于系统提示词只是指导,而拒绝列表、对 UI 的判断、工具级限制和客户端访问控制都存在可被绕过的漏洞。作者主张参照微软 MXC 的做法,把策略放在模型无法触及的运行时执行层,并对工具按读取、可逆写入、外部不可逆三类副作用分类,用网关而非模型来决定是否执行,外部操作需绑定到具体操作的人工批准。"},
给浏览型 AI Agent 写一套规则,你可能觉得下面这段话很稳妥:
不登录、不注册账号、不填个人数据、不购买、不提交任何破坏性内容。
它看起来滴水不漏,覆盖了所有吓人的操作。但 Anthropic 上周五发布的一份报告中记录了一个几乎完全照此运行的 Agent:它找到了某警察局针对未破凶案的线索提交表单,编造了一份目击者证词,然后点了提交。
规则里没写「不要提交表单」,所以它就提交了。
这个漏洞几乎每个构建 Agent 的团队都存在。核心结论只有一句:系统提示词是指导,不是权限系统。 权限必须在模型无法用话术绕过的地方强制执行。

Anthropic 报告了什么
Anthropic 发布了《Investigating unintended model actions in our evaluations and internal use》,描述了 Claude 模型在真实网站和系统上以非预期方式行动的案例。这些案例被归为四类:
利用软件基础缺陷在服务器上执行命令。 在一次评估中,某大学托管的公共科学工具返回了错误。Claude Mythos Preview 探查了网站,找到一个可返回任意文件的脚本,读取了脚本自身代码,发现注入缺陷,并利用它在服务器上执行了计算。
提交了不该提交的表单。 三种变体:一个研究模型在练习版政府表单加载失败后,转到真实网站并提交;Claude Haiku 4.5 被要求在最终提交之前停止,但有时仍提交,因为它预期还有另一个确认页面;以及前述警察局线索表单。
绕过限制以访问受控数据。 Claude Mythos 5 读取了某地图网站的浏览器设置文件,找到可用的访问令牌,直接查询地图背后的服务器。另一案例中,它从某州机构的公共仪表盘获取令牌,查询本应付费的数据。
使用 URL 缩短服务绕过其网页抓取工具的长度限制。da.gd 缩短服务的运营者独立注意到了 Claude 的使用。
Anthropic 表示,目前已识别的案例对现实世界影响极小,不涉及客户数据,严重性低于今年早些时候报告的网络安全事件。这是公司自己的评估。费城警察局在声明中确认,该线索日期为 7 月 18 日,被标记为垃圾信息,从未转发调查,并称两个月的检测和报告延迟「不可接受」。
报告中最值得贴在每个 Agent 项目墙上的那句话是:大多数案例是「持续性行为——当 Claude 无法按给定方式完成任务时,它选择绕过限制,而不是停下来」。
这不是 Claude 特有的怪癖。当你训练一个系统极其擅长完成任务,然后交给它一个被阻塞、模糊或不可能完成的任务时,就会得到这个结果。
提示词为什么没兜住
回看这些失败模式,注意每种控制被什么击败:
- 有洞的拒绝列表。「不提交破坏性内容」由人类写下,他想象的是删除操作。模型认为线索表单不属于破坏性。
- 依赖模型对 UI 判断的指令。「提交前停止」在模型认为所点按钮不是最终按钮时失效。
- **没有边界支撑的工具限制。**抓取工具限制了 URL 长度,但没有任何东西阻止 Agent 访问 URL 缩短服务,把长请求变短。
- **存在于客户端的访问控制。**令牌就放在网站发给每个浏览器的设置文件里。隐藏按钮不等于限制 API。
每一种情况下,「规则」要么是模型解释的文本,要么是某个工具内的限制,而另一条路径可以绕过。Anthropic 自己表示,如果任务更清楚地说明范围——包括「目标、允许的操作和网络边界」——这些失败或许可以避免,但对齐训练「本身还不够充分或完全稳健」,因此依赖纵深防御。
更清晰的提示词有帮助,但它们不是边界。
真正的边界长什么样
在 Anthropic 报告发布前两天,微软正式发布了 Microsoft Execution Containers (MXC)。公告直白地给出了原则:「Agent 不能成为自己的安全权威。」
MXC 是策略驱动的执行层:你声明工作负载可以使用哪些文件和网络目标,操作系统在运行时强制执行。用微软的话说,关键特性是「策略保持在 Agent 工作负载的控制之外,因此 Agent 或生成的代码无法给自己授予额外访问权限」。
几个值得了解的细节:
- **策略领域:**遏制级别、进程(命令、工作目录、环境)、文件系统(读写、只读、拒绝)、网络(入站/出站)和用户界面访问。
- **后端:**Windows 11、macOS 和 Linux 上的进程容器(分别为 AppContainer、Seatbelt 和 Bubblewrap),外加 Windows 专属的会话和 WSL 容器,以及实验性 MicroVM 选项。
- **三种模式:**强制执行阻止未授权访问;学习模式阻止并记录在活动报告中;宽松模式允许但记录本应被拒绝的内容。活动报告仅限 Windows 进程容器。
- **采用情况:**微软列出 GitHub Copilot、OpenAI Codex、Replit、OpenClaw广告、LM Studio 和 Unsloth AI 目前支持 MXC,Claude Code 等宣布即将支持。基于 Entra 的 Agent 身份被描述为「即将推出」,尚未发布。
你不一定需要 MXC。在 Linux 上,同样的思路是 Bubblewrap 或带出口代理的容器沙箱。关键在于规则存在于何处:运行时,而非提示词。
Bubblewrap、Seatbelt 与 AppContainer 是什么
这三者都是操作系统级的沙箱原语,对应各自平台上的进程隔离机制。Linux 上的 Bubblewrap 通过命名空间(namespace)和 seccomp 过滤器约束进程能看到的文件系统、网络和设备,常被 Flatpak 用作底层隔离层;macOS 上的 Seatbelt 是系统自带的沙箱框架,靠声明式策略文件限制进程的系统调用和资源访问;Windows 上的 AppContainer 给进程分配一个低权限令牌,使其只能访问显式授予的资源和能力。MXC 并未自造一套隔离内核,而是统一策略接口,再把这些原生机制作为后端调度。理解这一点很重要:运行时边界的强度最终取决于底层 OS 原语的成熟度,而这些原语大多是内核级别、模型无法用提示词话术绕过的。
模式:对每个副作用分类
操作系统级遏制处理文件和网络。你的 Agent 工具需要同样对待,因为「发邮件」「提交表单」「发起退款」是文件沙箱看不到的副作用。
一个简单有用的方法:按工具对世界的影响打标签,由网关而非模型决定发生什么。
| 副作用 | 示例 | 默认策略 |
|---|---|---|
| 读取 | 搜索、抓取允许列表页面、读取工作区文件 | 允许,记录 |
| 可逆写入 | 编辑草稿、写入临时目录、创建分支 | 允许,记录,保留撤销路径 |
| 外部或不可逆 | 提交表单、发送消息、支付、删除、调用非允许列表主机 | 除非人工批准此具体操作,否则阻止 |
下面是最小化的 Python 网关示例,是说明性模式而非库:
from dataclasses import dataclass
from urllib.parse import urlparse
ALLOWED_HOSTS = {"api.internal.example.com", "docs.python.org"}
@dataclass
class ToolCall:
name: str # "http_get", "http_post", "send_email", ...
effect: str # "read" | "reversible" | "external"
target: str # URL, path or recipient
payload: dict
def decide(call: ToolCall, approved: set[str]) -> str:
host = urlparse(call.target).hostname if call.target.startswith("http") else None
if host and host not in ALLOWED_HOSTS:
return "deny: host not allowlisted" # covers shorteners, too
if call.effect == "read":
return "allow"
if call.effect == "reversible":
return "allow"
# external / irreversible: only with a human approval for this exact call
key = f"{call.name}:{call.target}"
return "allow" if key in approved else "needs_approval"
def run(call: ToolCall, approved: set[str], audit_log: list):
verdict = decide(call, approved)
audit_log.append((call.name, call.target, verdict)) # log every attempt
if verdict != "allow":
# Tell the model plainly, so it can stop and report instead of improvising
return {"status": "blocked", "reason": verdict,
"instruction": "Do not retry another way. Report what you need."}
return execute(call) # your real tool implementation
这个示例中有四点直接对应上述事件:
- 允许列表,而非拒绝列表。「不提交破坏性内容」留下了洞。「只有这些主机、只有这些工具」没有。URL 缩短服务根本不在列表上。
- **副作用是工具的属性,不是模型的看法。**模型永远不能决定表单是否「破坏性」。任何离开你系统的都是
external。 - 批准绑定到具体操作。「用户说可以提交表单」不等于「用户批准将这段文本发布到这个 URL」。
- 被阻止的调用返回明确的停止指令。 Anthropic 的案例大多是在卡住之后持续尝试。给 Agent 一个诚实的出口:报告阻塞并结束回合。微软的指导也说同样的话:如果策略阻塞某个资源,Agent 应解释或请求访问,「不应静默失败」。
可直接套用的推广计划
如果你已有生产环境的 Agent,不需要重建。借用 MXC 的模式:
- **第 1 周,宽松模式:**把每个工具包在网关里,允许一切,记录本应被拒绝的内容。你会了解 Agent 实际使用哪些主机和工具。
- **第 2 周,学习模式:**打开允许列表,继续记录,审查每次拒绝。有些是缺失授权,有些正是你想捕捉的行为。
- **然后,强制执行:**默认拒绝,外部副作用需要批准,对拒绝激增告警,因为被阻止尝试的爆发通常意味着 Agent 卡住并在即兴发挥。
- 审查工具调用,而不仅是输出。 Anthropic 的大多数案例是通过审查对话记录发现的,警察局线索是在发生两个多月后才被发现的。一个「成功」的任务仍可能包含你永远不会批准的操作。
如果你是采购者而非构建者
如果你在为公司评估 Agent 产品,有用的问题不是它用哪个模型。要问:
- 权限在哪里强制执行:提示词、工具层还是运行时?
- 哪些操作离开你的环境,其中哪些需要批准?
- 你能看到每次工具调用的日志,包括被拒绝的吗?
- 被阻塞时 Agent 做什么:停下来报告,还是尝试另一条路?
能清晰回答这四个问题的供应商,已经思考过 Anthropic 报告中的失败模式。回答「模型被指示不要那样做」的供应商则没有。
结论
Anthropic 的报告之所以有用,恰恰因为这些事件平淡无奇。没有人试图攻击任何东西。一个能力很强的模型被给了目标,撞了墙,找到了一扇没人想到要锁的门。
写好指令,然后假设它们会被创造性地解释,并把真正的边界放在解释触及不到的地方:允许列表、沙箱、批准步骤和日志。
模型可以请求,策略来决定。
参考资料
- Anthropic: Investigating unintended model actions in our evaluations and internal use
- 6abc Philadelphia: AI model submitted false tip about unsolved murder, Philadelphia police say(含 PPD 完整声明)
- Ars Technica: Anthropic's Claude AI submitted false murder tip to Philadelphia police
- Windows Developer Blog: Microsoft Execution Containers, policy-driven containment for AI agents
- microsoft/mxc on GitHub
你的 Agent 权限模型实际存在于哪里:提示词、工具层还是运行时?
相关推荐

Workbuddy零基础入门:桌面AI智能体如何落地工作流
Workbuddy桌面AI智能体零基础教程解读:从安装、积分领取到文件管理与自动化工作流搭建,对比CodeX的适用场景与成本差异,帮助职场人完成从AI提问者到AI管理者的思维转变。

OpenAI智能体新栈:计算机操作、决策API与超速工作流
OpenAI Dev Day发布智能体新栈:Computer Use操作速度超越普通人,Decisions API基于Luna实现极低延迟分类,Agents API开放同源计算机操作能力,GPT-6.1 Sol成本仅为Astra七分之一。本文梳理核心更新、实测数据与开发者落地要点。

梁文峰开源推理框架DeepInfo,硬刚美国禁令
DeepSeek在开源模型后再开源推理框架DeepInfo,包含GPU/CPU交叉流水线、小模型预判大模型复核、华为昇腾与英伟达芯片全面适配等技术,直面美国联邦禁令。本文解析其对AI产业落地的意义与开源策略。