摘要: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.101.1.9 属于 Enterprise Support Only。也就是说,无法只靠免费版本号升级获得修复,需要考虑 Spring Boot 4 / Spring Framework 7 的迁移路径。

七、一个可落地的升级清单

  1. 先用构建工具搜索项目中的 spring-ai 依赖,确认版本线;
  2. 如果在 2.0.0,直接升 2.0.1;
  3. 如果在 1.x,评估 Spring Boot 4 迁移或企业支持;
  4. 给每个 ToolCallingAdvisor 配置 maxToolCalls
  5. 检查工具权限边界,不要只依赖“模型没有被告知”;
  6. 升级后重点回归:工具调用、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,也给自己加上一层循环保护。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐