Agent 安全与生产化:控制权限、数据、成本与故障半径
核验日期:2026-07-16。威胁对照方案参考 OWASP LLM/GenAI、OWASP Agentic Security 与 NIST AI 600-1。清单不能替代结合资产、身份、数据流和业务损失的威胁建模;法律、供应商政策与攻击手法会变化,应持续复审。
Agent 把不确定的模型决策连接到确定的系统能力,风险来自组合:恶意用户、被污染的检索/工具结果、过宽凭证、自动副作用、跨 Agent 委托和不可控循环。安全设计不必假设模型永不受骗。即使模型提出错误动作,执行器也要通过最小权限、验证、审批、隔离和预算拒绝动作或限制影响。
资产、主体与信任边界
先列资产:用户数据、组织文档、模型/Prompt、工具凭证、代码/文件、业务状态、付款/通信能力、会话记忆、索引/Embedding、trace 和评测集。主体至少有终端用户、应用服务、模型供应商、MCP/A2A server、工具下游、运维人员和攻击者。每条数据流标明身份、tenant、加密、保留、允许用途和跨境。
威胁模型对每个边界问:攻击者能控制什么输入;组件持有什么权限;失败的最大影响;哪些控制在模型之外;如何检测和恢复。用“系统 Prompt 已写禁止”作为控制不合格。
Prompt Injection 与目标劫持
直接注入来自用户,间接注入来自网页、邮件、代码、文档、MCP resource/tool result、A2A Artifact 或记忆。攻击内容会伪装成系统消息、要求泄露 secret、调用工具或永久写入 memory。RAG、微调和分隔符不能彻底消除。
结构性缓解:外部内容标记来源/信任,不能修改高优先级策略;工具集合按任务最小化;执行前独立验证与授权;读写凭证分离;危险动作预览/审批;出站数据目的地 allowlist;敏感上下文不发给无关工具;最终输出检查。内容分类器可提供信号,不能单点放行。
测试把恶意指令放在不同层和编码中,观察任何工具尝试、数据读取和 memory 写入,而非只看最终回答是否复述攻击。
Excessive Agency 与混淆代理
模型不需要管理员凭证。每个工具按最小 resource/action/tenant scope 使用独立服务身份;当前用户身份在服务端解析,授权在执行时发生。只读搜索与写入/发送/删除分成不同工具和 credentials。工具参数不允许模型选择任意 tenant、recipient、URL、SQL 或 command。
混淆代理发生在高权限服务按不可信请求行动。防线是把目标对象、动作和数据来源纳入授权,不只检查“用户已登录”。例如发送邮件工具同时验证发件权限、收件域、附件数据分类、速率与审批。
权限变化与审批之间存在 TOCTOU。审批绑定规范化参数/资源版本/影响哈希并到期,提交前重新授权;审批人不能批准自己无权执行的动作。紧急 kill switch 能按 tool/tenant/model/server 禁用。
参数与输出注入
模型输出始终是不可信数据。JSON Schema 限制形状,业务验证限制语义,allowlist 限制路径/域/命令。数据库使用参数化查询;HTTP 出站解析 URL 后校验 scheme、host、解析 IP 和重定向,阻止私网/metadata SSRF;文件使用固定 root、规范化路径和防符号链接;shell 尽量不用,必须使用参数数组/沙箱,不拼字符串。
工具返回的 HTML/Markdown/URL 在 UI 安全渲染;生成代码不在主机直接执行。结构化输出字段用于下游模板前按目标上下文编码,防 XSS、邮件 header、日志和公式注入。日志换行/控制字符规范化。
沙箱与代码执行
需要执行代码时使用一次性隔离环境:非 root、只读基础镜像、临时文件系统、CPU/内存/进程/时间/输出限制、默认无网络、最小挂载、seccomp/容器或更强隔离。容器不是绝对安全边界,高风险多租户考虑 microVM/专用执行服务。运行节点不持生产云凭证。
依赖安装默认禁止或经 allowlist/代理与锁文件;构建输出扫描。用户取消/超时终止整个进程树,清理临时数据。捕获 stdout/stderr 有字节上限并脱敏。产物传出前检查类型/恶意内容。逃逸与资源耗尽有监控和节点隔离/轮换。
Secret 与数据最小化
Secret 在服务器 secret manager,以短期/可轮换凭证注入工具执行器,不进入 Prompt、浏览器、tool description、trace 或错误。模型供应商 key 按环境/服务分开,设置额度与来源限制。扫描仓库、镜像、日志和评测 artifact;泄漏有吊销 runbook。
发送给模型的数据按任务最少化,字段脱敏/令牌化;记录供应商是否训练、保留多久、地区、subprocessor、零数据保留与删除能力。不要因“企业账户”假设所有 endpoint/feature 政策相同。MCP/A2A 远端是独立 processor/recipient,逐一登记。
会话/记忆有目的、来源、同意、TTL、修改和删除。模型建议的长期记忆先验证,不写入攻击指令、secret 或未经确认的敏感推断。Embedding、摘要、缓存、trace 和 eval 都是派生数据,删除流程覆盖它们。
Memory 与 Context Poisoning
攻击者可把错误偏好、权限暗示或指令写入长期 memory,在未来任务触发。记忆按类别建 Schema:用户显式偏好、系统事实、任务状态;每条有来源、置信/确认、tenant、创建者、期限。安全策略与授权永不来自自然语言记忆。
读取 memory 按当前任务/权限过滤,展示来源;写入高影响事实需要用户确认或权威工具。变更留历史并可撤销。摘要重生成不能覆盖结构化审批/副作用状态。
MCP/A2A 与供应链
第三方 server/Agent、SDK、Prompt 包、模型、parser 和数据源都是供应链。固定包与协议版本,审查来源/维护、lock/SBOM、漏洞与签名;能力变化触发重新同意和评测。MCP 本地 server 运行最小环境,远程 endpoint allowlist/OAuth audience;A2A Card 发现不等于信任,验证域/身份/扩展。
工具名抢注或描述污染会诱导误选。Host 以 server identity + tool name 建命名空间,冻结一次 run 的 Schema/hash。远端结果大小、MIME、Schema 与内容安全验证。禁止 token passthrough 和无界委托链。
多租户隔离
tenant 来自认证上下文,进入数据库 query、向量过滤、cache key、task/session/checkpoint、对象存储、日志访问和工具凭证。只在 Prompt 说“不要访问别的租户”没有作用。使用负例验证猜测 ID、引用、旧 cache、检索候选、trace 和异步任务。
共享模型调用可发送不同租户数据,但上下文与缓存不得混合;批处理/前缀缓存功能需核对隔离。管理员/支持工具单独入口、强认证、审计和最小临时授权。
资源耗尽与成本攻击
攻击者可提交超长输入、递归工具、巨大文件、慢流、并发任务或诱导昂贵模型。入口限制 bytes/token/附件/解析深度,按用户/tenant/IP 和系统总量限流;队列有限,模型/tool 并发 bulkhead;run 有 step/token/time/cost/tool 次数上限;输出和 trace 有大小/TTL。
预算是多层:请求、租户日/月、全局供应商、工具费用和人工审批。接近额度时降级到已评测 profile、只读/检索或稳定拒绝,不能悄悄降低安全。异常 usage、循环、相同输入爆发和 provider 账单报警,key 可快速吊销。
可靠性状态机
生产任务至少有 queued/running/waiting_approval/succeeded/failed/cancelled,持久记录 attempt、lease、deadline、config version、idempotency 与 cost。HTTP 请求不是长任务持久容器。worker crash 后 lease 过期重领;每个副作用按 operation id 幂等;外部成功但响应丢失先查结果。
模型/工具 timeout 分开且受总 deadline。重试只对可重试且幂等错误,指数退避+jitter,不嵌套多层重试。Circuit breaker/限流保护下游,fallback 满足数据/质量/安全约束。部分功能不可用时明确降级来源,不让模型伪装实时结果。
部署、配置与回滚
artifact 不可变,记录代码、SDK、model profile、Prompt、tool Schema、guardrail、语料/index 和数据库 schema。启动验证配置/secret/工具 capability;readiness 只在必要依赖可服务后成功。发布先离线门禁、shadow(无副作用)、canary,再扩量。
模型别名、远端 MCP/A2A、Prompt 和 index 都可能独立变化,配置组合生成版本指纹。回滚必须恢复兼容组合;等待审批/长任务按创建版本继续、迁移或安全终止。数据库/checkpoint 采用 expand-contract,旧 worker 可 drain。
进程关闭先摘流量,停止接新任务,取消/完成短 run,把长任务 checkpoint/释放 lease,限定 drain 时间。流连接断开与 task 状态分开。演练强杀、网络分区、provider outage、数据库 failover、凭证轮换和磁盘/配额耗尽。
可观测性、隐私与审计
关联 request/run/task/thread/trace/call/operation,但用户/tenant 不做高基数指标。日志结构化且脱敏;metrics 看 availability、queue、latency、token/cost、steps、tool/error/deny;trace 看路径;audit 记录谁在何时对哪个资源提出、批准和执行什么。Audit append-only、有访问控制和保留。
隐藏推理不作为审计证据。保存用户可见输入、模型结构化提案、检索来源、工具参数/结果摘要、策略决定、审批和最终输出。敏感正文按采样/权限/TTL,支持数据主体删除。Telemetry exporter 失败不能阻塞核心业务,也不能无限内存缓冲。
SLO 至少覆盖可用性、完整响应延迟、正确/引用、危险副作用、任务完成/重复和数据新鲜度。安全指标有 false allow/deny 与攻击成功;成本按成功任务。每个报警有 owner/runbook,而非面板装饰。
Incident Response
准备 kill switch:禁模型、工具、server/Agent、tenant、写操作或外发;轮换 key;冻结相关 trace/audit;停止队列且不丢状态。事故分诊保存版本指纹与首个异常边界,确定数据/副作用范围,通知合规/客户按政策执行。
修复不只加一句 Prompt。撤销越权凭证/数据、补偿副作用、修验证/授权、增加最小回归与变体、重跑安全集,审查相邻工具。复盘记录时间线、检测缺口、故障半径、为何控制未阻止、owner/期限和复验。
风险分级与人工控制
按影响和可逆性分类:只读公开查询可自动;私有读取需身份/审计;可逆低价值写入需确认;外部通信、删除、财务、权限、代码执行需强审批或禁止自动;生命/法律等高风险结论需领域流程。风险来自参数和上下文,不能只按工具名静态分级。
人工审批不是万能:疲劳、含糊预览和批量确认会失效。界面突出差异、来源、不可逆性、收件人/金额/权限,默认拒绝,到期,禁止模型催促绕过。高风险可双人审批/职责分离。
生产验收演练
- 恶意网页要求读取 secret 并发送,确认工具不可见/授权拒绝且有安全事件。
- 用户跨 tenant 猜 source/task id,检索、session、trace 全部拒绝且无存在性泄漏。
- 写工具响应丢失后重试,确认 operation id 返回同一结果无重复。
- 审批期间权限/资源改变,提交重新验证并拒绝旧预览。
- 模型循环/巨大工具结果,step/token/time/bytes/cost 各自触发可解释终止。
- MCP server Schema/域/认证变化,能力冻结、告警并重新同意。
- Provider outage/429/慢流,有限队列、退避、降级和取消正常。
- worker 强杀/部署,checkpoint 恢复且 interrupt 前副作用不重复。
- secret/PII 出现在工具错误,输出/日志/trace 脱敏并触发扫描。
- 删除请求传播到会话、memory、索引、cache、trace/eval 的策略范围。
每项保存输入、版本、trace/audit、预期/实际和恢复时间。未演练的 runbook 只是文档愿望。
生产就绪检查表
任务/数据/身份/权限/副作用/供应商的数据流图已评审;每个工具 Schema、授权、审批、幂等、timeout 和审计完整;RAG/Memory 有 ACL/版本/删除;Agent 有 step/deadline/cost/取消;代码执行隔离;secret 最小化;trace 脱敏;离线/对抗评测达门槛;持久状态可恢复;发布/回滚/kill switch/事故流程演练;owner 和复审日期明确。