过去一年,大量团队把 LLM 从"对话框"推进到了"执行体":Agent 能读文件、调接口、发邮件、改数据库、跑代码。Demo 阶段的评价标准是"能不能跑通"——任务完成率、工具调用成功率、响应延迟。
但上线是另一回事。Agent 与聊天机器人的根本差异在于:聊天机器人的错误止于一段文本,Agent 的错误会变成对外部世界的真实副作用——一封发出去的邮件、一条被删除的记录、一笔被提交的工单、一次对内部接口的越权访问。
本文给出一套可落地的能力清单:先建立 Agent 专属的威胁模型,再逐层补齐身份、输入、工具、沙箱、记忆、可观测六个维度的控制能力,最后给出上线前检查表和成熟度分级。
先把定义收敛。本文所说的 Agent,指同时具备以下四个要素的系统:
要素 | 含义 | 引入的风险性质 |
|---|---|---|
模型 | 负责推理与决策 | 输出不可靠、可被诱导 |
工具 | 可调用外部接口/函数 | 副作用、越权 |
记忆 | 跨会话持久化状态 | 污染长期生效 |
自主循环 | 自主规划、多步执行 | 失控、成本爆炸 |
四要素中,"工具"是质变点。没有工具的模型只能输出文本,最坏结果是"说了不该说的话";有工具的模型可以"做了不该做的事"。而"自主循环"是放大器:一次错误的决策会被后续步骤继承并放大,且人类介入的机会窗口被压缩。
一个便于记忆的判断框架是"致命三要素"(Lethal Trifecta):当一个 Agent 同时具备
那么它就具备了被间接注入攻击、并把私有数据外带出去的完整链路。上线前必须回答的第一个问题是:这三者是否同时成立?如果成立,隔离措施是什么?
按数据流顺序梳理,Agent 的攻击面比传统 Web 应用多出两层(模型层、编排层):
这张清单的用途不是逐条打勾,而是驱动设计:任何一条没有对应控制措施的攻击面,都应当在架构评审中被显式记录为已知风险。
这是所有控制措施里性价比最高的一条,也是很多团队最先欠下的技术债。
反模式:Agent 用一个高权限服务账号(Service Account)访问所有后端系统,然后在 Prompt 里写"你只能查询当前用户的数据"。
这是用自然语言实现的访问控制,而自然语言是可被覆盖的。正确做法是让权限落在基础设施层:
tenant_id 必须来自凭据,而不是来自模型输出或请求体。一条经验判据:如果一条权限约束只存在于 Prompt 里,它就等于不存在。
间接注入无法靠"让模型更聪明"来解决。当前工程上唯一可靠的思路是架构隔离,而非语义检测。
把处理流程拆成两个角色:
角色 | 输入 | 权限 | 输出 |
|---|---|---|---|
特权模型(Privileged) | 只接收用户请求与结构化数据 | 可决策、可规划 | 工具调用计划 |
隔离模型(Quarantined) | 处理不可信内容(网页、文件、第三方返回) | 无工具权限 | 结构化数据(字段值、分类标签、摘要) |
关键约束:隔离模型的输出必须是结构化数据,绝不能是自然语言指令。这样即使恶意内容成功劫持了隔离模型,它也只能污染"数据字段",而无法生成"可执行的下一步动作"。
在进入上下文前给每段内容打上来源与可信级别标记,并在系统提示中明确区分"数据区"与"指令区":
说明:这种标记能降低但不能消除风险,它属于纵深防御的一层,不能替代隔离。
工具参数在进入真实系统前必须重新校验。"模型说这是合法 SQL"不构成任何保证——详见下一节。
如果 Agent 直接调用后端 SDK,那么策略无处安放。正确结构是:所有工具调用必须经过一个统一网关,网关承担校验、授权、限流、审计四项职责。
策略不应写死在业务代码里,而应可审计、可评审、可版本化:
additionalProperties: false)。否则攻击者可以通过"多传一个参数"改变下游行为。"弹窗确认"不是安全措施,除非它满足:
只要 Agent 能生成或执行代码、能处理用户上传的文件,沙箱就是必需的,而不是可选项。
边界 | 要求 |
|---|---|
计算隔离 | 与业务服务不同进程/不同内核边界;避免在同一容器内执行不可信代码 |
文件系统 | 只读根文件系统 + 独立临时目录;禁止挂载宿主敏感路径 |
网络出口 | 默认拒绝,白名单放行;禁止访问元数据服务与内网网段 |
凭据 | 沙箱内不注入任何长期凭据;确需外部调用的,走带作用域的代理 |
记忆让 Agent 更好用,也让一次攻击的影响从"单次会话"变成"长期驻留"。
所有要写入长期记忆的内容,应经过:
记忆条目建议采用固定 Schema:
字段化带来的直接好处:可检索、可审计、可过期、可批量回滚。不可回滚的记忆等于不可修复的漏洞。
记忆与向量库必须按租户物理或逻辑隔离,检索阶段强制注入 tenant_id 过滤条件,且该条件来自凭据而非模型输出。
涉及敏感数据的处理链路,应在架构层面就明确:数据存在哪里、留存多久、谁可以读。这部分既是安全要求,也是合规要求(见第十一节)。
"可控"的第一定义是:任意一次 Agent 行为,事后可完整还原;任意时刻,可立即中止。
以 trace_id 贯穿一次任务的全部步骤,每步记录:
注意 decision_reason 与 policy_result 两个字段:它们让审计从"发生了什么"升级为"为什么被允许发生",这是事后定责与策略调优的关键输入。
制动阀 | 作用 | 建议阈值策略 |
|---|---|---|
步数上限 | 防死循环 | 按任务类型设硬上限 |
成本上限 | 防成本爆炸 | 单任务 + 单用户 + 全局三级 |
速率限制 | 防滥用 | 按工具 + 按用户维度 |
Kill Switch | 应急止血 | 全局开关 + 单会话开关,均需可在秒级生效 |
新工具、新策略上线前,先以"只记录不执行"的方式运行一段时间,对比"Agent 想做什么"与"人实际会做什么"。这是成本最低的灰发方式,能拦住相当一部分设计缺陷。
告警应绑定明确的处置动作(自动降级 / 暂停工具 / 通知值班),否则只是噪音。建议优先监控:策略拒绝率突增、单任务成本异常、工具错误率、确认被拒绝率(后者的突增通常意味着 Agent 行为偏离预期)。
按优先级分为三档。P0 未完成不应上线。
级别 | 特征 | 典型缺口 | 适用场景 |
|---|---|---|---|
L0 能跑 | 能调工具、能完成任务 | 无上限、无审计、无隔离 | 内部 Demo、无副作用场景 |
L1 可观测 | 有全链路日志、有步数与成本上限 | 权限仍为服务账号,无沙箱 | 内部工具、低风险读取 |
L2 可控制 | 权限最小化 + 工具网关 + 沙箱 + 高危确认 | 策略未代码化,红队不常态 | 面向内部员工的业务系统 |
L3 可证明 | 策略即代码 + 全量审计 + 红队回归 + 可回滚 | —— | 面向公众、涉及资金或用户数据 |
常见误区:把"L1 的日志"当成"L2 的控制"。日志解决的是事后追溯,控制解决的是事中拦截,两者不可互相替代。
技术控制措施同时也是合规义务的落地载体。对生成合成类服务而言,以下三条对应关系值得在上线前明确:
另需注意:Agent 的安全机制若发生重大变更(权限模型、审核链路、对外能力范围),可能触发备案变更程序,建议将此类变更纳入发布流程的评审清单。
上述为工程视角的映射建议,不构成法律意见;具体义务范围与期限请以现行有效规定及属地监管口径为准。
从"能跑"到"可控",本质上是从功能视角切换到风险视角。两者的评价指标不同:
一句话概括优先级:
先收权限,再管输入,然后统一工具出口,最后补上沙箱、记忆治理和制动阀——并且让每一层都留下可审计的痕迹。
Agent 的能力边界会持续扩张,但安全能力不需要一次做全。先完成 P0,再谈演进。把上面那张 P0 清单跑通,多数"上线后才发现"的事故,都能在上线前被拦下。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。