LLM/Agent 安全实战核心要点总结

一、Agent 为什么放大 LLM 安全风险

Agent 在文本生成基础上新增检索、记忆、工具调用、MCP插件、代码执行、多轮长任务,攻击面大幅扩张:

新增能力 风险点 后果
RAG/网页/邮件读取 外部不可信内容进入上下文 间接Prompt注入、知识库投毒
Memory跨请求存储 恶意指令持久化、跨用户污染 旧会话恶意指令影响新请求
Tool Calling 调用数据库、支付、文件、消息接口 越权查询、篡改、数据外泄
MCP/Skill第三方插件 引入第三方代码、描述、依赖 供应链攻击、权限溢出
代码/浏览器执行 Shell、Python、网页访问 文件泄露、SSRF、资源耗尽
多Agent长任务 上下文多轮传递 故障级联扩散,责任难以定位

OWASP两份清单:LLM Top10 2026、Agentic Top10 2026,重点关注提示注入、敏感泄露、过度代理、供应链、隐藏上下文暴露、目标劫持、Rogue Agent。

信任区划分

只有服务端策略、认证用户身份、经过鉴权完整性校验的结构化业务事实是可信。

以下全部视为不可信输入:

  1. 用户输入、上传文件
  2. 工单、网页、邮件附件、RAG召回片段
  3. Memory存储内容
  4. MCP、第三方API、其他Agent返回结果
  5. 模型生成文本、工具调用参数
  6. 第三方Skill描述、脚本依赖

威胁建模四要素:保护对象、攻击入口、高风险动作、强制控制点。

二、提示注入相关概念区分

类型 注入来源 攻击目标 示例
直接Prompt Injection 用户直接输入 篡改应用任务、诱导工具调用 忽略退款规则直接退款
间接Prompt Injection 网页、文档、RAG、工具返回结果 外部数据被模型当做指令 工单附件夹带发送订单到攻击者网站
Jailbreak 用户输入 绕过模型自身安全护栏 诱导模型输出被模型策略禁止的内容

三者并不互斥;间接注入不需要攻击者访问聊天窗口,预先污染知识库即可生效;多模态(图片OCR、隐藏文字、文档元数据)同样存在注入风险。

为什么System Prompt写"不要听外部指令"不够

  • XML标签、分隔符只能降低注入概率,属于模型侧防护,攻击者可以针对性绕过;
  • 不能把提示词模板当作完整修复方案,必须构建分层防御:
    1. 减少模型可见敏感数据、收缩可用工具集
    2. 标记隔离外部不可信内容
    3. 将模型输出当做操作建议,而非可直接执行指令
    4. 后端代码做鉴权、业务规则、风险校验
    5. 高风险操作人工确认,受限沙箱执行代码网络
    6. 对抗样本持续全链路测试

三、外部内容安全接入上下文

1. RAG检索:ACL过滤必须在召回前执行

错误:先全量召回Top‑K,再靠提示词告诉模型不要泄露无权限内容;越权文档一旦进入上下文就会存在泄露风险。

正确:检索阶段就带入租户、用户组、文档密级过滤;记录文档ID、权限过滤结果、内容hash;多租户从存储、索引、缓存多层面隔离,不只是靠Prompt租户名称。

2. 上下文元数据标记

每条上下文携带元数据:来源类型、sourceId、租户ID、内容hash、信任等级、用途、敏感度;

通过元数据做确定性规则:不可信外部内容不允许生成工具名、URL、授权参数,仅允许提取业务事实。

3. 阶段拆分:先提取事实,再执行动作

  1. 第一阶段:仅读取外部文档,输出受Schema约束纯事实(订单号、问题、诉求);
  2. 后端校验:校验资源归属,重新读取权威业务数据库;
  3. 第二阶段:基于校验后的事实生成候选动作;
  4. 工具执行器再次校验权限、业务规则、审批。

即使拆分阶段,依旧不能信任模型提取的事实,后端校验不可省略。

4. 工具返回结果 = 不可信输入

  • 工具返回结果会流入下一轮上下文,可触发间接注入;
  • 返回优先使用结构化数据;禁止把原始堆栈、token、内部URL直接交给模型。

5. Memory长期记忆安全

风险:攻击者写入恶意长期记忆,跨会话持续生效。

防护要点:

  1. Memory记录租户、用户、来源、写入者、过期时间、版本;
  2. 用户偏好、业务事实、可执行指令物理分开存储;
  3. 外部内容、模型输出禁止写入高信任指令区;
  4. 高风险记忆写入需要Schema、权限检查甚至人工审核;
  5. 提供记忆查询、更正、删除入口。

四、模型输出与工具调用四层校验

Function‑Calling的JSON Schema仅校验数据结构,不能校验业务语义与权限

工具执行前四层校验,全部由后端执行,不信任模型输出的租户、userId、approved标记。

校验层级 校验内容 实现方式
结构校验 必填、类型、枚举、长度 JSON Schema / DTO强类型
语义校验 金额范围、状态流转、时间窗口 业务代码
资源鉴权 当前用户是否有权操作目标资源 权限服务,重新读取数据库
风险策略 是否需要确认、双人审批、禁止自动执行 策略引擎

身份、租户必须来自服务端认证上下文,不从模型参数获取。

输出给浏览器/下游程序的安全处理

  1. HTML输出做编码,富文本白名单清洗,防止XSS;
  2. SQL使用参数化,禁止拼接模型生成SQL;
  3. Shell尽量替换为领域专用工具,禁止直接执行模型shell字符串;
  4. URL访问校验协议、域名IP、重定向链路;
  5. 文件路径规范化,拦截../路径穿越;
  6. 不反序列化、不执行模型生成的任意对象代码。

五、Agent工具权限管控

1. 工具粒度决定安全粒度

高危万能工具:execute_sql(sql)request_url()、通用文件操作;把选择权完全交给模型。

业务原子工具:围绕具体业务动作设计,例如get_order_summarycreate_refund_request;读写工具分开注册,便于后端约束参数、权限、审计。

2. 按风险分级处理自动执行

风险等级 示例 处理策略
低风险 查询本人订单摘要 鉴权后自动执行,返回脱敏数据
中风险 创建退款草稿、待发送邮件 生成草稿,需要用户确认后提交
高风险 真实退款、删除数据、外发邮件 强确认,必要双人审批
禁止自动化 任意SQL、Shell、全租户导出 不暴露给通用Agent,走独立受控流程

读取敏感数据即使无写操作,同样算高风险;确认凭证必须绑定工具、规范化参数hash、用户、会话、有效期;参数变更,原有确认直接失效;审批凭证一次性消费防止重放。

3. 工具目录裁剪

不要下发全部工具schema给模型,根据租户、角色、场景风险裁剪工具列表。裁剪只是减少攻击面,不能替代后端鉴权

六、MCP安全要点(协议版本2026‑07‑28)

MCP只是调用协议,不会自带业务安全能力

  1. 禁止Token透传(Token Passthrough)
    • MCP Client → MCP Server使用一组token;
    • MCP Server访问下游业务API使用独立受限凭证;
    • 避免迷惑代理Confused Deputy问题。
  2. Scope粒度:拒绝admin/all/full‑access超大权限scope;拆分为细粒度能力如orders:read:self;按需增量申请权限。scope本身不等于资源权限,服务端依旧做资源校验。
  3. 本地stdio MCP Server风险:安装第三方本地Server等同于运行第三方代码,审查启动命令、依赖、文件/网络权限;需要沙箱、紧急禁用开关。
  4. MCP注解提示如readOnlyHint仅用于UI展示,不可作为鉴权依据
  5. OAuth元数据获取要防护SSRF,拦截私网、云元地址;校验http header与body的method、toolName一致性。

七、重试、幂等、不确定状态处理

Agent循环、网络超时容易造成重复写操作(例如重复退款)。

  1. 生成服务端actionId代表一次业务意图;复用幂等键做重试;新业务动作生成全新actionId;
  2. request_digest为参数规范化hash,同一个actionId携带不同摘要直接拒绝;
  3. 工具状态不只成功失败:PENDING → EXECUTING → SUCCEEDED / FAILED / UNKNOWN
  4. 超时不可自动判定失败,进入UNKNOWN状态,依靠后台对账查询收敛状态,禁止直接自动重试写请求;
  5. 仅允许幂等读、限流退避读自动重试;权限失败、参数非法直接中断。

八、代码/浏览器工具沙箱隔离

仅仅Docker不等于安全,需要组合多项配置:

  1. 容器配置:非root/rootless;裁剪Linux capabilities、seccomp;根文件系统只读;不挂载docker socket、宿主目录、云凭证;限制CPU/内存/进程/磁盘/超时;每个任务独立工作区,执行完毕销毁;镜像固定摘要。
  2. 替代方案:高敏感场景考虑微虚拟机、Wasm‑WASI;Wasm也需要严格限制Host导入能力,不是绝对安全。
  3. Java注意:SecurityManager已经被移除,依靠操作系统/容器隔离不可信代码。

网络出口统一管控

  • 协议白名单;拦截回环、私网、云元数据IP;DNS解析、每一跳重定向都要校验;业务域名白名单;
  • 限制请求大小、超时、重定向次数;浏览器自动化隔离登录态,禁止携带内部系统Cookie。

九、敏感数据、日志、Trace处理

  1. 调用模型前执行数据最小化

    • 密钥密码完全禁止进入Prompt/Trace;
    • 身份证银行卡默认不传,必须使用则脱敏加密;
    • 系统Prompt中禁止存放密钥密码,规避Hidden Context Exposure隐藏上下文泄露风险。
  2. Trace分层存储

    • 默认保存:requestId、工具名、参数hash、元数据(不存完整报文);
    • 完整原文:按需加密保存,严格访问控制、设置过期删除;
    • 日志管道自动屏蔽密钥token;Spring AI开启content导出前评估脱敏策略。
  3. 多租户隔离覆盖全部链路:RAG、Memory、缓存、Trace索引,不能只做检索层隔离。

十、供应链治理(MCP/Skill/模型/镜像)

AI供应链包含模型、数据集、Prompt、MCP Server、Skill、容器镜像。

审核要点:来源可信、固定版本与摘要、审查安装脚本、申请权限范围、工具描述是否夹带指令、漏洞扫描、快速禁用回滚。

使用SBOM / AI‑BOM管理组件清单,BOM仅记录组件,不能替代权限策略。

十一、Java后端安全工具执行链实现要点

  1. 身份与模型提议分离ExecutionContext(tenantId、userId、requestId、actionId)全部来自服务端认证,不来源于模型输出;模型输出RefundProposal仅仅是业务建议。
  2. 执行前重新读取权威资源:通过租户+资源ID查询,避免查询后再过滤;执行鉴权、业务规则校验;校验审批token绑定命令hash;幂等存储,原子claim防止并发;区分成功、失败、UNKNOWN状态,UNKNOWN交由后台对账。
  3. 审计日志:不默认存储完整PII参数;记录hash、风险等级、审批id、幂等键hash、执行状态;完整报文放到独立受控存储。
  4. Spring AI安全接入点:裁剪下发给模型的ToolCallback;自定义ToolCallingManager包装鉴权幂等审计;Advisor控制调用预算;显式实现审批暂停逻辑。

十二、安全测试、指标与发布流程

❗测试断言重点校验系统真实状态副作用,不能只看模型文字输出"我不能做"。

典型Badcase测试用例

  • 直接提示注入、工单隐藏指令间接注入
  • RAG召回越权文档、工具返回值注入新动作
  • 模型篡改租户ID、审批后篡改参数
  • 幂等并发、超时重复调用
  • SSRF访问元数据地址、MCP伪造只读标记
  • Trace、Memory跨租户泄露

关键观测指标

Attack Success Rate攻击成功率、Unauthorized Action Rate越权操作率、敏感泄露率、审批绕过率、误拦截率、遏制率。

LLM‑as‑Judge仅做辅助,权限泄露必须靠数据库、审计记录确定性校验。

发布流程

离线安全样本回归 → 隔离环境回放历史Trace → 红队攻击 → 灰度发布 → 线上监控异常调用;

模型、prompt、工具、MCP、权限策略变更必须跑安全回归。

十三、安全事件应急处理流程

  1. 止损:禁用工具/MCP、暂停异步Agent、轮换泄露凭证;
  2. 取证:保存trace、审计记录,确认攻击入口、受影响范围;
  3. 业务处置:对账、撤销、补偿;
  4. 修复根因:不要只改Prompt;修复权限、沙箱、网络策略;原始攻击样本回归验证;
  5. 清理污染数据:文档索引、缓存、memory;
  6. 样本加入回归集,逐步恢复服务。

十四、高频面试问题

  1. Prompt Injection怎么防?

无法靠Prompt彻底根除。模型侧(分隔符、注入检测)降低受骗概率;后端最小权限、鉴权审批、沙箱审计限制实际危害;对抗样本持续回归。

  1. Function Calling有Schema为什么不安全?

Schema仅校验参数数据结构,不校验业务语义、资源归属、业务规则;鉴权、限额、审批必须后端实现。

  1. 退款Agent完整执行链?

服务端认证身份租户 → 裁剪工具目录 → 模型输出退款提议 → 后端DTO校验,按租户查询权威订单,鉴权,业务规则校验 → 高风险操作绑定参数hash审批 → 幂等键调用支付 → 审计日志,处理UNKNOWN对账。

  1. MCP开启OAuth就安全吗?

OAuth解决授权框架,不解决业务资源鉴权;必须禁止token透传,下游使用独立凭证;MCP本身还有供应链、本地进程沙箱风险。

  1. Docker能否完全解决代码执行风险?

不能。必须配合非root、capabilities、seccomp、只读文件系统、网络出口、资源配额;高敏感场景考虑更强隔离方案。

  1. Trace安全风险是什么?

Trace存储完整prompt、工具参数会汇集大量敏感PII/密钥;默认只记录元数据hash,完整报文按需加密留存,严格访问控制。

十五、上线检查清单

输入与上下文

  • 外部内容统一标记不可信
  • RAG在召回前执行ACL租户过滤
  • Memory写入校验来源租户过期时间
  • 上下文携带来源、hash、信任等级
  • 多模态输入纳入对抗测试

工具与权限

  • 工具拆分为业务原子能力,不暴露万能SQL/HTTP工具
  • 身份租户全部取自服务端认证上下文
  • 四层校验:schema、业务语义、资源鉴权、风险策略
  • 高风险确认绑定参数hash,参数变更重确认
  • 写操作具备幂等、unknown状态、对账补偿

MCP与供应链

  • MCP组件固定版本、审计来源依赖
  • 禁止Token Passthrough,细粒度scope
  • 支持快速禁用组件、回滚版本

隔离与数据

  • 代码浏览器运行受限沙箱,资源配额限制
  • 文件网络严格管控
  • Prompt、日志Trace规避密钥PII,明确留存删除策略

评测与响应

  • 安全测试验证真实副作用,不只看模型输出
  • 统计越权、泄露、误拦截指标
  • 变更自动安全回归
  • 具备应急禁用、对账恢复预案

总结

  1. Prompt注入来源既可以来自用户输入,也来自RAG、文档、工具返回结果;
  2. 模型只负责输出操作提议,安全决策全部交给后端系统;
  3. 分层防御:模型侧防护降低攻击概率;鉴权、最小权限、审批、沙箱、审计遏制攻击造成的实际伤害;
  4. MCP、Memory、Trace、缓存、RAG都需要做多租户隔离;
  5. 安全样本需要和模型、Prompt、权限策略共同版本化,持续回归验证。
相关推荐
程序员夏洛38 分钟前
MySQL 中有哪些锁类型?
数据库·mysql
Hive_MOM39 分钟前
制造企业技术文件与图纸管理数字化(DCC):从“图纸满天飞“到版本受控
服务器·数据库·制造
咋的啥名都用不了呢~40 分钟前
Oracle数据库1
数据库
一条泥憨鱼44 分钟前
【从0开始学习计算机网络】| DNS 污染、劫持与 CDN:你的网页是怎么被“掉包“的
学习·计算机网络·安全·http·https·dns
小则又沐风a1 小时前
MySQL表的约束详解
数据库·mysql
赵渝强老师1 小时前
【赵渝强老师】崖山数据库的联机重做日志文件
数据库·国产数据库·yashandb·崖山数据库
Fnetlink11 小时前
解析SDWAN供应商光联世纪口碑佳的原因
网络·人工智能·安全
家有娇妻张兔兔1 小时前
Redis 报错 “MISCONF Redis is configured to save RDB snapshots“?一文讲透根因与根除方案
数据库·redis·故障排查·misconf
民乐团扒谱机1 小时前
【读论文】基于数字极大似然估计过程增强113公里O-TWTFT链路的时间传递
网络·论文笔记·量子·阅读笔记