本博客日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.x | 1.0.0 – 1.0.4 | 1.0.5 | 已发布 |
| 1.1.x | 1.1.0 – 1.1.3 | 1.1.4 | 已发布 |
注意,只有使用了SimpleVectorStore并且将用户输入作为过滤表达式键的应用才会受到影响。
风险分析
下面我们展开一下本次#CVE-2026-22738漏洞的风险分析。
攻击面评估
根据 CVSS 评分和官方公告,该漏洞具有以下特征。
- 攻击向量(AV):网络(N)—— 可通过网络远程利用
- 攻击复杂度(AC):低(L)—— 无需特殊条件
- 权限要求(PR):无(N)—— 无需认证
- 用户交互(UI):无(N)—— 无需用户参与
- 影响范围(S):不变(U)—— 仅影响当前系统
- 机密性影响(C):高(H)
- 完整性影响(I):高(H)
- 可用性影响(A):高(H)
潜在危害
对应的,该漏洞的潜在危害如下所示。
- 完全系统接管:攻击者可获得服务器 shell 权限
- 数据泄露:访问数据库、配置文件、敏感业务数据
- 横向移动:以内网服务器为跳板攻击其他系统
- 服务中断:删除文件、停止服务造成业务中断
如何检测与复现
下面排查清单与复现步骤,供大家参考。
自查清单
首先检查依赖版本。
# 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()));
漏洞复现思路
如果存在上述清单中的问题,则可以按照下面的复现思路进行复现尝试。
这里要特别提醒一下,以下信息仅供安全研究和修复验证使用,请勿用于非法目的。
根据安全研究员的分析,复现该漏洞需要以下环境。
- 环境准备:搭建一个使用 Spring AI 1.0.0-1.0.4 或 1.1.0-1.1.3 的应用
- 漏洞入口:找到接受用户输入并传递给
SimpleVectorStore过滤器的接口 - 载荷构造:构造包含 SpEL 表达式的恶意键名
- 触发执行:发送请求观察表达式是否被执行
对应的示例测试载荷(概念性)如下。
# 假设接口接受 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.5和1.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