聊天机器人那套安全想象已经不够了

很多人还在用聊天机器人的方式理解 Agent 安全:不要让模型泄露隐私,不要让它输出危险建议,不要让它被提示词注入绕过。

这些都重要,但已经不是问题的中心。

一个能干活的 Agent 不只是输出文字。它会读仓库、改文件、跑测试、执行 shell、访问浏览器、调用 MCP 工具、连数据库、发 HTTP 请求。只要它能对外部世界产生副作用,安全问题就从「回答是否合规」变成「动作是否应该发生」。

这也是最近几篇论文值得放在一起看的原因。Agent Security is a Systems Problem 明确提出,驱动 Agent 的模型应当被视为不可信组件,安全不变量必须在系统层强制执行。Toward Securing AI Agents Like Operating Systems 则直接把 Agent 和操作系统放在同一个视角下看:资源隔离、权限分离、通信调停,这些老问题在 Agent 时代重新出现。AgentTrust 更进一步,把防线放到工具调用前,拦截文件、shell、HTTP、数据库等动作,并给出 allow、warn、block、review 这类结构化判定。

这些论文没有在重复「模型要更安全」。它们真正说的是:当模型开始操作你的机器,模型就不能再当安全边界。

危险的是副作用

一句错误回答通常还有人工判断的机会。一次错误命令可能没有。

AgentTrust 的问题定义很直接:现代 Agent 会通过文件操作、shell 命令、HTTP 请求和数据库查询产生真实副作用。一次不安全动作,可能导致误删、凭证暴露、数据外传或者系统状态被污染。这个风险不是等最终答案出来以后再评分能解决的,因为伤害已经发生。

这和传统 LLM 应用不同。搜索摘要错了,用户可以不采信;客服话术错了,可以回滚流程;代码建议错了,人还可以在 IDE 里看 diff。但一个被授权执行命令的 Agent,如果在错误上下文里执行删除、上传、替换、授权、提交,问题就已经落到系统层。

所以「让模型先解释计划」只是辅助,不是边界。模型可以解释得很合理,动作仍然越权;它可以通过了提示词检查,命令里仍然藏着绕过;它可以每一步看似无害,多步连起来却形成攻击链。

这也是为什么 AgentTrust 讨论 shell 反混淆、RiskChain、多步攻击链和低延迟拦截。它是在问:动作发生之前,系统有没有机会把它挡下来。

把模型当不可信组件,心态会变

传统应用安全里,我们不会假设用户输入可信,也不会假设第三方库可信。可到了 Agent 产品里,很多设计却默认模型「只要被提示好,就会守规矩」。

这个默认值得怀疑。

Agent Security is a Systems Problem 的关键转向,就是把模型放回不可信组件的位置。模型可以参与决策,可以提出计划,可以解释理由,但它不应该自己决定哪些资源可访问、哪些命令可执行、哪些数据可发出、哪些异常可忽略。

一旦接受这个前提,很多产品设计会改变。

  • 权限不应该只写在系统提示词里,而要落到工具层和进程层。
  • 高风险动作不应该只要求模型「谨慎」,而要进入审批或阻断路径。
  • Agent 的中间步骤不应该只留在聊天记录里,而要进入可审计日志。
  • 沙箱不应该只是运行代码的容器,而要理解动作类别、资源范围和数据流向。

这听起来像把 Agent 复杂化。实际上,这是把它正常化。任何能够长期运行、处理私有数据、改变系统状态的软件,都需要这些基本边界。Agent 只是让这些边界重新变得紧迫。

操作系统视角比聊天框视角更准确

把 Agent 当操作系统看,并不是说它真的替代 macOS、Linux 或 Windows。更准确的说法是:Agent 正在获得类似操作系统中介层的地位。

它接收用户意图,调度外部工具,访问多种资源,在不同权限之间穿梭,并把多个动作组合成一个任务。这个位置天然要求资源隔离和权限调停。

Toward Securing AI Agents Like Operating Systems 的价值就在这里。它没有把 Agent 安全简化为 prompt injection,而是把问题拆回几个经典系统安全问题:资源如何隔离,权限如何拆分,组件之间如何通信,第三方技能和工具如何被限制,攻击者在有限能力下能否绕过现有保护。

这比「提示词加粗写三遍不要做坏事」可靠得多。

在操作系统里,应用不会因为声明自己安全就拿到 root 权限。浏览器扩展不会因为介绍页写得可信就随便读取所有数据。数据库用户不会因为请求看起来合理就自动获得管理员权限。Agent 也应该这样。

如果一个 Agent 能读私有仓库、看环境变量、运行本地命令、访问公司内部系统,那它就需要最小权限、显式授权、能力分级和审计轨迹。否则,所谓智能只是把风险包装得更顺手。

Claude Code RCE 讨论说明风险已经很具体

The Register 对 Claude Code Trust Prompt 相关 RCE 的报道,以及随后开发者社区里的复现讨论,之所以值得关注,因为它把抽象风险变成了开发者熟悉的场景:信任目录、项目配置、命令执行、用户点击和本地环境。

这类问题最容易被低估。开发者会觉得「这是我自己的机器」「这是我信任的仓库」「我只是让 Agent 看一下项目」。但 Agent 的运行环境常常比人脑想象得更复杂:它读取的文件可能被污染,项目里的配置可能影响行为,工具链可能触发命令,模型可能把间接指令当成任务上下文。

一旦 Agent 可以跨越「读」和「做」的边界,仓库就不只是代码文本,还是潜在输入面。README、issue、脚本、配置、注释、测试输出,都可能影响模型接下来的动作。

这就是为什么社区复现只能当情绪和案例,不能当唯一证据;但它很适合作为写作入口。它提醒读者:这是已经在开发者机器附近发生的工程问题。

运行时应该默认回答五个问题

如果企业要认真部署 Agent,安全运行时至少要回答五个问题。

第一,Agent 当前拥有什么能力。重点是具体到哪些目录、哪些命令、哪些网络目标、哪些凭证、哪些写权限。

第二,动作发生前如何判定风险。普通读取、构建测试、删除文件、上传数据、修改权限、访问外网,不应走同一条无差别工具调用路径。

第三,谁能批准高风险动作。模型可以建议,系统可以判定,人或策略要能接管。尤其是生产数据、凭证、部署、账单、客户信息这类资源,不应让一次自动推理直接放行。

第四,过程如何审计。最后结果正确不代表过程安全。需要记录工具调用、输入输出、资源访问、风险判定、审批结果和失败路径。

第五,失败后如何回滚。长程 Agent 会试错,如果每次试错都改变真实环境,团队迟早会把它关回演示环境。

这些重点是放权的前提。

长文真正要写的判断

Agent 安全的主线不应写成「模型又被越狱了」。那会把问题带回提示词攻防,最后只剩下一堆技巧。

更清楚的判断是:Agent 正在从文本系统变成行动系统,所以安全边界必须从模型输出前移到运行时执行层。模型越强,这个判断越成立。因为强模型更会调用工具、更会串联步骤、更会找到捷径,也更可能在不完整目标下做出真实动作。

未来可靠的 Agent 平台,竞争点不会只是模型榜单。它要有权限系统、工具策略、沙箱、审计、预算、回滚、审批和组织级配置。谁把这些做成默认能力,谁才有资格说自己能承接生产任务。

提示词仍然有用,但它不是安全边界。边界在运行时。