Spring AI 2.0.1 发布:修复 7 个 CVE 并新增 Agentic Loop Protection,Java Agent 开发必读(含升级清单与
文章目录
摘要:Spring AI 2.0.1 是 2.0.0 GA 后的第一个维护版本,修复 7 个 CVE,并新增
maxToolCalls限制 Agentic Loop。本文拆解漏洞影响、升级路径、ToolCallingAdvisor配置和升级前需要检查的兼容性变更。
一、为什么这次升级不能拖
很多 Java 后端在接入 Spring AI 时,会先关注工具调用、流式输出、RAG 和向量库。但 Spring AI 2.0.1 的发布说明提醒我们:Agent 上线前,工具边界和循环终止必须由运行时兜底。
官方在 2026 年 8 月 21 日发布 Spring AI 2.0.1,这是 2.0.0 GA 之后的第一个维护版本。它解决超过 80 个 issue 和 PR,并修复 7 个 CVE。对正在使用 Spring AI 2.0.0、1.1.x 或 1.0.x 的团队来说,这属于优先级较高的安全升级。
二、核心结论
这版最值得记住的一句话:
Agent 的边界不能只靠“告诉模型”来维持,必须由运行时强制执行。
Spring AI 2.0.1 补上了两个关键能力:
- 工具调用边界:未公开给本次请求的工具,不能被 prompt 诱导调用;
- Agentic Loop 边界:工具调用次数必须可配置,不能无限循环。
三、7 个 CVE 拆解
| CVE | 问题 | 风险点 | 谁最该关心 |
|---|---|---|---|
| CVE-2026-59318 | prompt 注入后调用未公开工具 | 权限提升 | 多租户 Agent、工具按权限隔离 |
| CVE-2026-47851 | 恶意 PDF 目录递归导致 StackOverflow | DoS | PDF 文档上传与问答管道 |
| CVE-2026-59294 | ResourceCacheService 路径穿越 | 任意文件写 | 接受租户/用户传入模型 URI |
| CVE-2026-59279 | MCP Streamable HTTP 会话无上限 | 内存耗尽 | 暴露 MCP 服务的应用 |
| CVE-2026-59308 | 语义缓存哈希截断 | 跨租户缓存命中 | 多租户语义缓存 |
| CVE-2026-59319 | RediSearch tag 注入 | 跨会话数据暴露 | RedisChatMemoryRepository |
| CVE-2026-47852 | 可预测缓存目录 | 本地模型替换 | 共享主机、CI 环境 |
对 Agent 开发者来说,最需要理解的是 CVE-2026-59318。
四、最危险的漏洞:工具没公开,也可能被调用
在 Spring AI 的工具调用机制中,每次请求会向模型公布一组可用工具。团队通常以为这个列表就是边界,但运行时工具派发并不完全遵守这个边界。
官方描述是:某些条件下,一个没有对当前请求开放的工具,仍然可能被调用,进而导致权限提升。
场景化理解:
客服 Agent 本次只公布 queryOrder、refundPolicy
攻击者把恶意内容塞进工单正文或网页摘要
模型被诱导命名 deleteUser
DefaultToolCallingManager 的全局 resolver 兜底
最终 deleteUser 被执行
受影响版本:
- Spring AI 2.0.0;
- Spring AI 1.1.0 到 1.1.8;
- Spring AI 1.0.0 到 1.0.9。
开源修复版本是 2.0.1。官方表示升级后不需要额外缓解措施。
五、Agentic Loop Protection:给循环一个预算
Agentic Loop 是 Agent 开发的隐藏成本。模型反复调用工具、返回无法解析的工具名,或工具结果反复触发新工具,都可能导致一次请求失控。
Spring AI 2.0.1 在 ToolCallingAdvisor 中新增可配置的工具调用次数限制。达到上限时抛出 ToolCallLimitExceededException,错误路径返回单个 Generation,保持正常响应结构。
同时,工具解析失败时是继续兜底还是快速失败,也变成可配置。
5.1 配置工具调用上限
@Bean
ToolCallingAdvisor limitedToolCallingAdvisor(ToolCallingManager manager) {
return ToolCallingAdvisor.builder()
.toolCallingManager(manager)
.maxToolCalls(5)
.build();
}
5.2 在 ChatClient 中使用
var response = chatClient.prompt()
.user("帮我查一下北京天气,并给出穿衣建议")
.advisors(limitedToolCallingAdvisor)
.call();
maxToolCalls(5) 就是给每次请求的工具调用预算。即使模型和工具之间出现异常循环,也不会无限执行。
六、升级前要检查的兼容性变更
从 2.0.0 升到 2.0.1,大部分项目改版本号即可,但下面几个点容易踩坑:
| 变更 | 影响 |
|---|---|
| OpenAI tool-calling strict mode 默认值改为 false | 可选参数工具可能不再 400 |
| Redis chat memory 自动配置 artifact 改名 | 需要更新 artifactId |
| 废弃的 Mistral AI 聊天模型被移除 | 使用常量引用会编译失败 |
| Media builder 改成类型化重载 | 旧的 Object 调用可能不兼容 |
| DeepSeekApi 接口重写 | 相关客户端 API 有调整 |
| Couchbase vector store 使用 Spring Boot 托管客户端 | 配置方式变化 |
如果你还在 Spring AI 1.0.x 或 1.1.x,需要特别注意:官方修复版本 1.0.10 和 1.1.9 属于 Enterprise Support Only。也就是说,无法只靠免费版本号升级获得修复,需要考虑 Spring Boot 4 / Spring Framework 7 的迁移路径。
七、一个可落地的升级清单
- 先用构建工具搜索项目中的
spring-ai依赖,确认版本线; - 如果在 2.0.0,直接升 2.0.1;
- 如果在 1.x,评估 Spring Boot 4 迁移或企业支持;
- 给每个
ToolCallingAdvisor配置maxToolCalls; - 检查工具权限边界,不要只依赖“模型没有被告知”;
- 升级后重点回归:工具调用、PDF 文档读取、Redis 聊天记忆、语义缓存隔离。
八、常见问题
Q1:Spring AI 2.0.1 是不是只是安全修复?
不只是。除了修复 7 个 CVE,还新增工具调用上限、OpenAI 音频流式、Google GenAI 工具选择和图像生成、PDF 页范围读取等能力。
Q2:我还在 Spring Boot 3,能直接升 Spring AI 2.0.1 吗?
不能。Spring AI 2.0 需要 Spring Boot 4 或 4.1,以及 Spring Framework 7。Spring Boot 3 项目需要先评估框架升级。
Q3:maxToolCalls 应该设置多少?
没有统一值。简单查询 Agent 可以设 3 到 5 次;复杂多步 Agent 根据实际链路评估。关键是把值显式写出来,而不是依赖默认或希望模型自己停。
Q4:工具解析失败应该兜底还是快速失败?
对权限敏感场景,建议快速失败;对容错要求高的场景,再考虑配置兜底。不要保留“无声兜底执行错误工具”的行为。
九、总结
Spring AI 2.0.1 真正提醒我们的是:Agent 的工具边界、缓存上下文、会话和聊天记忆,都必须被运行时真正约束。
给 Java Agent 开发者这周的两件事:
升到 Spring AI 2.0.1
给 ToolCallingAdvisor 配 maxToolCalls
这样既堵住已知 CVE,也给自己加上一层循环保护。
更多推荐

所有评论(0)