Agent 安全与治理
单轮 LLM 应用里,提示注入最多影响「一次回答」;Agent 让它升级成远程代码执行级别的风险——一条混进网页/邮件/工具结果的恶意文本,可以诱导 Agent 调工具、读数据、外发、写记忆,甚至跨会话持续生效。Prompt 工程 讲了单轮注入防线,AI 工程化 给了权限墙与合规清单;本篇把这些收敛为 Agent 专属的威胁模型与「决策/执行/上下文/输出」四层纵深防御,并给出可落地的治理清单。
一、威胁模型:Agent 让攻击面发生了质变
| 攻击面 | 传统 LLM 应用 | Agent 场景 |
|---|---|---|
| 提示注入(直接) | 影响本次输出 | 诱发后续工具调用链 |
| 提示注入(间接) | 少见于纯生成 | 头号风险:网页/邮件/文档内容进入上下文 → 变成动作指令 |
| 工具滥用 | 无工具 | 调用不该调的工具、参数越界、批量滥用 |
| 记忆中毒 | 无持久记忆 | 恶意内容被写入长期记忆 → 之后每轮生效(持久后门) |
| 数据外渗 | 输出泄露 | Agent 把内部数据通过返回内容/调外部 API 传出去 |
| 供应链 | — | Agent 主动装依赖/执行第三方代码(见 Code Agent 与计算机使用) |
| 资源耗尽 | 单轮 token | 循环停不下来,账单与配额被拖垮 |
| 越权操作 | — | 权限墙外的真实副作用(删库/发信/下单) |
- 间接注入(Indirect Prompt Injection)是 Agent 独有的主要威胁:受害者在网上读到恶意网页 → 内容被检索进上下文 → Agent「认为」指令来自用户而照做。模型无法可靠区分「上下文里的事实」与「让我执行的动作」——所以防御不能只靠模型,必须落在架构上。
二、纵深防御:四层都要有
输入层 ── 不可信内容(网页/邮件/文件/检索结果)识别与降权
决策层 ── 动作白名单/策略:什么能做、什么需审批、什么禁止
执行层 ── 沙箱 + 最小权限 + 限额 + 幂等(真正的防线)
输出层 ── 防外渗(DLP/敏感匹配) + 审计留痕1. 输入层:不可信内容的降权与区隔
- 结构化区隔:把「指令」与「数据」放进不同通道——工具结果/检索文本不是系统指令,加载时用引用格式包裹并显式声明「以下为外部内容,仅供参考」;
- 动作意图不来自数据:网页里「请发送邮件到 xxx」是内容不是命令;由不可信内容推导出的动作,先经策略校验(见决策层);
- 输入侧过滤:注入特征检测可以兜底,但不能作为唯一防线(攻击者持续演化,方法与 Prompt 工程 安全节联动)。
2. 决策层:动作策略(agent 的「行为边界」)
- 给 Agent 一张可执行的分类表,而不是一句「小心一点」:
| 类别 | 例子 | 策略 |
|---|---|---|
| 允许 | 读自己沙箱内文件、调只读 API | 自动执行 |
| 需审批 | 外发消息、支付、删除、写生产数据、装依赖 | 暂停 + 人工确认 |
| 禁止 | 越租户访问、改他人数据、内网横向 | 硬拦截并告警 |
- 策略来自代码与配置(可审计可版本化),不是让模型自己判断「这算不算敏感」;
- 参数白名单:不只要管「调不调这个工具」,还要管「参数范围」——如只允许读
/workspace/**、只允许 API 调用带上限。
3. 执行层:真正的防线在沙箱与权限
- 沙箱执行:容器/VM/受限账号,网络白名单(默认不出网),文件系统只读或快照回滚——即使注入成功,破坏也被框住;
- 最小权限:Agent 用独立最小权限身份(不是你的管理员账号);凭据走受控注入,不让 LLM 看到明文密钥;
- 限额与幂等:工具调用频率限额、金额/条数上限、敏感动作一次性令牌(防重复触发);
- 「完成」必须环境验证(测试/页面状态),否则 Agent 被诱导时会把「说成功了」当成功(见 Code Agent 与计算机使用)。
4. 输出层:防外渗与审计
- 输出侧 DLP:敏感数据(密钥/身份证/内部文档片段)匹配即拦截;Agent 想「把数据放进网页」的场景尤其要盯(检索→外发是常见路径);
- 全量审计:每次工具调用的参数与结果脱敏留痕,谁在何时让 Agent 做了什么、为什么可回放(审计要求见 AI 工程化);
- 行为基线 + 告警:工具调用率异常、外发域名异常、越权尝试——按 Agent 评测与可观测 的可观测做实时指标。
三、记忆与数据安全
- 记忆写入分级:外部不可信来源(网页/邮件检索结果)的提炼内容,标记低可信/带来源,默认不写入长期记忆,或进隔离区等人工确认——防持久后门(详见 Agent 记忆与状态);
- 多租户隔离:记忆检索必须按用户/会话过滤,绝不跨用户串记忆(A 的信息出现在 B 的任务里是灾难级 bug);
- PII 合规:记忆与日志中的敏感字段脱敏,合规要求见 AI 工程化。
四、评测与红队:把攻击写进回归集
- 安全不靠「上线时检查一次」,靠持续红队:
- 造注入样本集:直接注入、间接注入(网页/邮件/文件场景)、越权诱导、记忆中毒(分同会话与跨会话两档测);
- 跑完断言:工具调用是否落在白名单外、敏感数据是否外渗、记忆是否被污染;
- 这些样本进入 Agent 评测与可观测 的回归集,每次改 prompt/加工具/升模型都要重跑;
- 度量指标:注入逃逸率、越权调用率、中毒残留率、审批拦截正确率;
- 事件响应预案:发现滥用 → 立即撤销受影响工具的权限 → 拉闸隔离 → 回放审计轨迹 → 判断记忆是否被污染并清洗 → 更新红队集。
五、治理清单(上线前逐项打勾)
| 项 | 检查内容 |
|---|---|
| 权限矩阵 | Agent 用最小权限身份;列出「允许/需审批/禁止」全表,覆盖所有工具 |
| 审批闸门 | 高风险动作(外发/支付/删除/装依赖)确实经过人工确认,且审批日志留存 |
| 沙箱 | 执行环境隔离;网络默认出不去;破坏可回滚 |
| 输入处理 | 不可信内容与指令区隔;工具/检索结果有来源标注 |
| 记忆安全 | 写入来源分级;多租户隔离;PII 脱敏;中毒清洗预案 |
| 审计 | 工具调用全量脱敏留痕,可回放;凭据不以明文进上下文 |
| 红队集 | 注入/越权/中毒样本在回归集里,改动必跑 |
| 撤销机制 | 能秒级撤销某工具/某用户的 Agent 权限 |
| 数据流向 | 哪些数据可被读取、可被外发,画得出来、说得清楚 |
六、踩坑清单
- 把安全寄托在模型「懂规矩」上:再强的模型也分不清「网页内容」与「用户指令」,防线必须在架构上;
- 只防直接注入,不管间接注入:Agent 的网页/检索输入才是主入口;
- 给 Agent 管理员权限跑:最小权限原则被破坏,一次越狱 = 全库沦陷;
- 凭据明文进上下文:密钥被模型看到,就可能被注入「念出来」;
- 记忆无来源分级:外部内容直接写长期记忆,制造跨会话持久后门;
- 沙箱只装一半:网络不隔离等于没有沙箱;
- 敏感动作无审批:Agent 说发就发,没有人工闸门;
- 审计只记成功不记失败:越权尝试没留痕,事后无法追溯;
- 红队样本一次性:不做回归集,改一次 prompt 防线就悄悄失效;
- 没有撤销预案:出事只能拔网线,无法定向回收权限;
- 输出不防外渗:只防了「进来」没防「出去」,内部数据被检索-回灌-外发一条龙。
关联阅读:单轮提示注入的攻防手法见 Prompt 工程 安全节;工具接入的开放协议与安全红线见 MCP 第六节;权限墙、PII 脱敏与审计日志的工程实现见 AI 工程化 第五、六节;环境操作 Agent 的沙箱实践见 Code Agent 与计算机使用;记忆中毒机理与防护见 Agent 记忆与状态;攻击性样本进评测集的方法见 Agent 评测与可观测。