Java基础、中级、高级、架构面试资料

一个请求攻破 Spring AI 9.8 分高危 SpEL 注入漏洞 CVE-2026-22738

JAVA herman 13浏览
公告:“业余草”微信公众号提供免费CSDN下载服务(只下Java资源),关注业余草微信公众号,添加作者微信:xttblog2,发送下载链接帮助你免费下载!
本博客日IP超过2000,PV 3000 左右,急需赞助商。
极客时间所有课程通过我的二维码购买后返现24元微信红包,请加博主新的微信号:xttblog2,之前的微信号好友位已满,备注:返现
受密码保护的文章请关注“业余草”公众号,回复关键字“0”获得密码
所有面试题(java、前端、数据库、springboot等)一网打尽,请关注文末小程序
视频教程免费领
【腾讯云】1核2G5M轻量应用服务器50元首年,高性价比,助您轻松上云

马上就要假期了,安全部门扔过来一封邮件,说 Spring AI 爆出了一个严重的 SpEL 注入漏洞(CVE-2026-22738),可导致远程代码执行。让各项目团队排查,尽快升级。

好在是节前发布通知,要是节中通知,又要被迫加班了。这会空闲一下,我就花点时间赶在下班前,给大家整一篇《CVSS 9.8!Spring AI“零成本”RCE 漏洞,1.0.x/1.1.x 全中招,修复方案速看》,分享给大家。

漏洞速览

文章配图参考 https://mp.weixin.qq.com/s/0SJxIDnYZ8981kYEY2g2Yw

2026 年 3 月 26 日,Spring 官方安全团队发布了一则严重级别(Critical)安全公告。CVE-2026-22738,这是一个存在于 Spring AI 框架中的SpEL(Spring Expression Language)注入漏洞,可导致攻击者在受影响系统上执行任意代码(RCE)。

该漏洞 CVSS 评分高达9.8 分(CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H),属于“网络可访问、无需认证、低复杂度攻击”的顶级威胁。

下面我们展开一下这个漏洞的原理,以及 SpEL 注入是什么?

什么是 SimpleVectorStore?

熟悉 Spring AI 的应该知道,#SimpleVectorStore是 Spring AI 提供的一个内存向量存储组件,用于在 AI 应用中存储和检索向量嵌入(Embeddings)。它支持通过过滤表达式(Filter Expression)来筛选向量数据。

漏洞触发点

使用SimpleVectorStore要小心了,它的问题出在过滤表达式键(Filter Expression Key)的处理上。当应用程序将用户提供的输入直接作为过滤表达式的键时,Spring AI 没有对这些输入进行充分的转义或验证。

看下面这段再正常不过的 Java 代码。

// 假设这是存在漏洞的代码示例
// 用户可控输入
String userInput = request.getParameter("filterKey");
FilterExpression expression = Filter.builder()
    .key(userInput)  // 危险:直接将用户输入作为 key
    .value("someValue")
    .build();
vectorStore.similaritySearch(SearchRequest.query("query")
.withFilter(expression));

SpEL 注入如何导致 RCE?

上面的代码看起来普普通通,平淡无奇。只是其中用到了 SpEL,而问题就出现在这个 SpEL 上。

Spring Expression Language(SpEL)是一个功能强大的表达式语言,支持方法调用、属性访问、构造器调用等。现在攻击者可以通过构造恶意的 SpEL 表达式来实现:

  • 调用任意 Java 方法
  • 访问系统属性
  • 执行系统命令
  • 读取/写入文件

典型的攻击载荷可能类似于下面这样:

T(java.lang.Runtime).getRuntime().exec('calc.exe')

当这个表达式被注入到过滤键中并被 SpEL 解析器执行时,攻击者就获得了在服务器上执行任意代码的能力。

受影响版本

根据官方的公告,这次受影响的版本如下表格所示。

版本分支受影响版本安全版本修复状态
1.0.x1.0.0 – 1.0.41.0.5已发布
1.1.x1.1.0 – 1.1.31.1.4已发布

注意,只有使用了SimpleVectorStore并且将用户输入作为过滤表达式键的应用才会受到影响。

风险分析

下面我们展开一下本次#CVE-2026-22738漏洞的风险分析。

攻击面评估

根据 CVSS 评分和官方公告,该漏洞具有以下特征。

  • 攻击向量(AV):网络(N)—— 可通过网络远程利用
  • 攻击复杂度(AC):低(L)—— 无需特殊条件
  • 权限要求(PR):无(N)—— 无需认证
  • 用户交互(UI):无(N)—— 无需用户参与
  • 影响范围(S):不变(U)—— 仅影响当前系统
  • 机密性影响(C):高(H)
  • 完整性影响(I):高(H)
  • 可用性影响(A):高(H)

潜在危害

对应的,该漏洞的潜在危害如下所示。

  1. 完全系统接管:攻击者可获得服务器 shell 权限
  2. 数据泄露:访问数据库、配置文件、敏感业务数据
  3. 横向移动:以内网服务器为跳板攻击其他系统
  4. 服务中断:删除文件、停止服务造成业务中断

如何检测与复现

下面排查清单与复现步骤,供大家参考。

自查清单

首先检查依赖版本。

# Maven 项目
mvn dependency:tree | grep spring-ai-vector-store

# Gradle 项目
gradle dependencies | grep spring-ai-vector-store

其次,检查代码模式。搜索项目中是否存在以下危险模式。

// 危险模式 1:直接使用用户输入作为 filter key
.filter(userInput)

// 危险模式 2:动态构建 FilterExpression 且 key 来自外部输入
Filter.builder().key(externalData)

// 危险模式 3:从 HTTP 请求参数直接传递到 VectorStore
String filterKey = request.getParameter("key");
vectorStore.search(query.withFilter(Filter.builder().key(filterKey).build()));

漏洞复现思路

如果存在上述清单中的问题,则可以按照下面的复现思路进行复现尝试。

这里要特别提醒一下,以下信息仅供安全研究和修复验证使用,请勿用于非法目的

根据安全研究员的分析,复现该漏洞需要以下环境。

  1. 环境准备:搭建一个使用 Spring AI 1.0.0-1.0.4 或 1.1.0-1.1.3 的应用
  2. 漏洞入口:找到接受用户输入并传递给 SimpleVectorStore 过滤器的接口
  3. 载荷构造:构造包含 SpEL 表达式的恶意键名
  4. 触发执行:发送请求观察表达式是否被执行

对应的示例测试载荷(概念性)如下。

# 假设接口接受 filterKey 参数
GET /api/search?filterKey=T(java.lang.Runtime).getRuntime().exec('id')&query=test

如果应用返回了系统命令的执行结果或表现出异常行为,说明存在漏洞。

修复方案

下面列举两种修复方案,供大家参考。

方案一,立即升级

这是官方推荐的首选方案。对应的 Maven 配置如下。

<!-- 1.0.x 分支用户 -->
<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-vector-store</artifactId>
    <version>1.0.5</version>
</dependency>

<!-- 1.1.x 分支用户 -->
<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-vector-store</artifactId>
    <version>1.1.4</version>
</dependency>

官方已在1.0.51.1.4版本中修复了此漏洞,修复提交记录可查看 GitHub commit ba9220b22383e430d5f801ce8e4fa01cf9e75f29

方案二,临时缓解措施

如果暂时无法升级,可采取以下措施降低风险。

对输入验证与过滤。

  • 对所有传入 SimpleVectorStore 的过滤键进行白名单验证
  • 拒绝包含 SpEL 特殊字符(如 ${, T(, # 等)的输入

或者避免直接使用用户输入。使用预定义的常量键名映射,不直接传递用户输入。

// 安全的做法:使用映射而非直接传递
Map<String, String> allowedKeys = Map.of(
   "category", "category",
   "author", "author"
);
String safeKey = allowedKeys.get(userInput);
if (safeKey != null) {
   Filter.builder().key(safeKey)...;
}

也或者是增强 WAF 防护。

  • 在 Web 应用防火墙中添加规则,拦截包含 SpEL 特征的请求
  • 监控异常访问日志

社区反响与安全讨论

该漏洞披露后,各安全社区反应迅速。

  • Nessus 扫描器已在 2026年3月30日发布检测插件(Plugin ID: 304267),可自动识别受影响版本
  • GitLab 依赖扫描已集成对该漏洞的检测
  • OpenCVE 等平台已将该漏洞标记为“需立即修补(Patch Immediately)”级别

此外,多家安全厂商发布紧急警报。

对于系统管理员来说,CVE-2026-22738 这类漏洞直接威胁 Linux 服务器和 Web 应用的安全完整性。被入侵的服务器不仅会导致基础设施暴露,还会危及所服务的客户。

结语

CVE-2026-22738 是一个典型的表达式注入漏洞。它提醒我们,在 AI 应用开发中,即使是最基础的过滤功能也可能成为严重的安全漏洞。随着 Spring AI 在 RAG(检索增强生成)应用中的广泛使用,此类漏洞的影响面可能会迅速扩大。

安全无小事,修补要及时,毕竟一个小小的 HTTP 请求就能搞垮这个 RCE。我建议所有使用 Spring AI 的团队在本周内完成漏洞排查和修复工作。

业余草公众号

最后,欢迎关注我的个人微信公众号:业余草(yyucao)!可加作者微信号:xttblog2。备注:“1”,添加博主微信拉你进微信群。备注错误不会同意好友申请。再次感谢您的关注!后续有精彩内容会第一时间发给您!原创文章投稿请发送至532009913@qq.com邮箱。商务合作也可添加作者微信进行联系!

本文原文出处:业余草: » 一个请求攻破 Spring AI 9.8 分高危 SpEL 注入漏洞 CVE-2026-22738