Agent 的风险,不是一个单点,而是一组互相耦合的问题。
第一类风险,是 Prompt Injection。
一旦 Agent 会读取外部文本、网页、邮件、文档、日志,这些内容就可能夹带恶意或误导性指令。 如果系统把它们直接送进高权限决策链路,风险会迅速扩大。
第二类风险,是越权调用。
系统如果没有严格区分不同动作的权限边界,低风险请求就可能被放大成高风险操作。
第三类风险,是状态污染。
如果错误信息被写入状态层或长期记忆层,它就不再只影响一轮,而可能持续影响后续所有决策。
第四类风险,是错误自动化。
普通错误只是错一次。 Agent 错误如果被自动化执行,就会放大成批量错误、持续错误、跨系统错误。
但如果只是把这四类风险并排罗列,仍然不够。
真正需要理解的是:它们在真实 Agent 系统里,往往不是四个独立问题,而是一条会前后串联的失效链。
一个常见链条是这样的:
- 外部网页或邮件里藏着间接指令
- Agent 把它误当成高优先级上下文
- 模型据此触发了本不该触发的工具
- 工具结果又被写回状态层或记忆层
- 下一轮执行继续把这份被污染的状态当成事实
- 系统在自动化循环里把错误持续放大
所以,第 27 章第一条结论应该是:
Prompt Injection、越权调用、状态污染和错误自动化,真正危险的地方不在于它们分别存在,而在于它们可以互相接力,组成一条完整的失效链。先看 Prompt Injection。
很多人第一次接触这个概念时,会把它理解成“用户说了一句恶意话,试图骗过模型”。这只是最浅的一层。
在 Agent 场景里,更常见也更危险的是间接注入。
攻击者根本不需要直接跟 Agent 对话,只要把恶意指令埋进网页、文档、邮件、知识库、工单、协作文档、技能文件、工具描述甚至其他 Agent 的返回消息里,就可能让系统在读取这些外部内容时完成“数据和指令边界塌陷”。一旦塌陷发生,Agent 就会把本来只是参考材料的内容,当成需要执行的操作性指令。
这就是为什么 Prompt Injection 不是一个单纯的提示词工程问题,而是一个输入信任问题。
只要系统无法稳定区分“谁在下指令”和“谁只是被引用进来”,它就永远暴露在被外部内容劫持的风险里。
再看越权调用。
Prompt Injection 之所以危险,不是因为模型脑子里多了一句错误指令,而是因为这句错误指令后面往往连着真实工具和真实权限。如果 Agent 只有读一个公开网页的能力,攻击影响也许还有限;但如果它还能发邮件、转账、删文件、调用生产 API、访问内部系统,那么问题就会立刻从认知污染升级为执行越权。
所以,很多所谓“模型被注入”的事故,本质上其实是“系统把过多权限交给了一个无法完全验证上下文纯净性的决策体”。
也就是说,越权调用并不只是权限表配置错误,更是自治边界定义错误。
如果系统把读权限、写权限、删除权限、批量权限、外部网络权限和高风险审批动作都绑在同一个 agent loop 上,再聪明的模型也会在一次错误判断里获得过大的破坏半径。
然后是状态污染。
这是 Agent 系统相比普通聊天系统更容易被低估的一层。
聊天系统的很多错误,停留在当前轮次;Agent 不一样,它会把过去的摘要、检索结果、工具输出、执行记录、用户偏好、环境观察、规划中间稿写回 memory 或 state。只要写回层没有被显式保护,错误就会被沉淀成“未来推理的依据”。
于是,一次攻击不再只是“这轮答偏了”,而会变成“未来很多轮都在一个被污染的世界模型上继续行动”。
这就是为什么状态污染如此关键。
它会把即时攻击变成延迟攻击,把局部错误变成持久错误,把一次成功的注入变成后续很多轮都可能再次触发的潜伏条件。知识库投毒、向量库污染、长期记忆注入、工具输出携带恶意痕迹,本质上都属于同一类问题:系统把未经验证的外部内容升级成了内部事实。
最后看错误自动化。
如果前面三层风险只会影响一轮交互,它们当然也危险,但还没有到系统级失控的程度。真正让 Agent 风险跃迁的,是自动化闭环。
一旦系统具备重试、批处理、长链规划、异步执行、跨系统回写、定时触发和多步骤恢复机制,一次错误判断就不再只产生一个错误动作,而会衍生出整串错误动作。它可能自动继续、自动重试、自动同步、自动记忆、自动传播,最后形成跨系统的错误放大。
所以,错误自动化不是第四个独立问题,而是前三个问题的放大器。
Prompt Injection 负责进入系统,越权调用负责放大后果,状态污染负责延长寿命,错误自动化负责扩大规模。四者合在一起,才构成今天 Agent 安全真正困难的核心。
这也是为什么很多传统的软件安全直觉在这里会显得不够。
传统安全更多处理的是输入校验、权限验证、接口保护、漏洞修补;而 Agent 安全还必须处理语义级劫持、动态决策错误、状态演化污染和自动执行链的失控。这不是说旧方法没用了,而是说旧方法必须向上扩展,进入“决策前、决策中、决策后”的全链治理。
因此,本章第二条结论应该是:
治理 Agent 风险,不能只想着“把恶意输入挡在门外”,还必须同时控制权限、状态写入和自动执行链,否则攻击即使穿过一个点,也会沿着系统继续传播。于是,第 27 章真正关心的,已经不是“模型会不会犯错”这种泛化问题,而是四个更具体的问题:
- 外部内容如何被标注为不可信
- 决策体为什么能够触发这个工具
- 这个结果是否允许写入长期状态
- 一旦出现异常,执行链如何被暂停、回滚或升级到人
如果这四个问题没有制度化答案,再强的模型也只能在一个脆弱系统里工作。
这也是为什么今天越来越多的最佳实践开始强调 instruction hierarchy、untrusted data labeling、tool confirmation、least privilege、sandbox、state write guards、tracing 和 human-in-the-loop。它们表面上分散,实则对应的正是这条失效链上的不同阻断点。
在输入口阻断,可以降低注入成功率; 在权限口阻断,可以缩小工具误用半径; 在状态口阻断,可以避免错误沉淀成长期事实; 在执行口阻断,可以防止错误自动化扩散。
到了这里,本章最后要落下的判断就很清楚了:
Agent 的真正风险不是“会出错”,而是“会把一次错误组织成一条持续运行、持续写入、持续扩散的自动化链条”。因此,治理 Agent 不能只靠“模型尽量别犯错”,而要围绕这几类风险建立外部保护结构。