系统:运行中
← 返回所有攻击
INFRASTRUCTURE CRITICAL NEW

Spring AI 中向量库元数据过滤器是一个注入汇聚点

Spring AI 将用户可控的过滤字符串和文档 ID 直接拼入各后端的原生查询语言,使 RAG 元数据过滤在五种向量库上退化为经典的 SQL 与查询注入。

2026-07-16 // 5 min affects: spring-ai, pgvector, elasticsearch, opensearch, gemfire, cosmosdb

这是什么?

Spring AI 是 Spring 框架用于在 Java 应用中集成 LLM 功能的官方抽象层,如今已成为 JVM 上检索增强生成(RAG)的事实标准。其向量库抽象允许存储嵌入向量,然后通过元数据过滤器进行查询——即一个类似「仅返回 tenant = Xyear > 2024 的文档」的小表达式。在 2026 年 4 月至 6 月间,Spring 发布了一系列公告,表明其中若干向量库集成在构造底层查询时,直接把用户输入拼接进后端的原生查询语言。结果就是一个教科书式的注入缺陷,在 AI 技术栈内部重现:本应收窄搜索范围的元数据过滤器,变成了对存储执行任意查询的通道。

两则公告概括了这一模式。第一则于 2026 年 4 月 27 日发布,是 Spring AI 的 Azure Cosmos DB 向量库中的 SQL 注入,当应用把用户提供的值作为文档 ID 传入删除路径时即可触发。第二则于 2026 年 6 月 12 日发布,涉及 Elasticsearch、OpenSearch 和 GemFire 向量库,过滤字符串中的特殊字符可迫使这些引擎执行任意查询。两者均被评为「High」。

工作原理

抽象层总是在同一处出问题:将可移植的元数据过滤器翻译为针对某一具体存储的实际查询。当这种翻译采用原始字符串拼接、而非使用后端的参数绑定时,任何由用户控制的运算符字符都会改变查询的语义,而不是被当作数据处理。

在 Cosmos DB 一例中,受影响的代码路径依据文档 ID 构造了一条删除用的 SQL 语句。若应用将最终用户输入作为 ID 转发,就等于给了攻击者一个杠杆,得以跳出预期的 WHERE 子句、触及本不应访问的记录。在 Elasticsearch、OpenSearch 和 GemFire 一例中,过滤表达式内被构造的字符逃逸了预期的查询结构,并被目标引擎解释执行。该漏洞并不在向量库本身——Postgres/pgvector、Elasticsearch、OpenSearch、GemFire 与 Cosmos DB 都提供了安全的参数化查询路径——而在于以拼接方式组装查询的胶水代码。我们只描述机理,不提供可用的攻击载荷。

这一点对 RAG 尤为重要,因为元数据过滤器通常由请求上下文驱动:租户、用户、文档范围。这正是经典注入所依赖的、每个请求各不相同的不可信输入,而 RAG 管线会把它送往一个包含应用已摄取全部文档的存储。

为何重要

元数据过滤器注入会瓦解 RAG 部署所依赖的隔离。若攻击者能够改写过滤器,就有可能读取其他租户的文档、绕过访问范围控制,或——视操作与存储而定——删除或篡改已存储的向量及其源记录。在一个多租户 Java 应用中,这是本应隔离各客户数据的那一层直接发生的机密性与完整性失效。Cosmos DB 问题在机密性、完整性和可用性上均达到高影响;Elasticsearch/OpenSearch/GemFire 问题在受影响配置下无需事先认证即可触及。

时间点并非巧合。围绕 UberConf 2026 大会(2026 年 7 月 14 日)的 Java 生态报道指出,2026 年 4 月 Spring 安全公告数量较常态激增逾十七倍,很大程度上是因为 AI 辅助的漏洞扫描器开始以前所未有的速度在 Spring 依赖图中发现缺陷——促成了 Broadcom 所称该框架历史上最大的一批安全更新。同一报道还提到 RAG 管线代码中另有一处表达式语言注入,在概念验证中达到了远程代码执行,进一步说明如今受攻击的活跃面是 RAG 的「管道」本身,而不只是模型。

防御

  • 升级。 迁移到已修复的 Spring AI 版本——Cosmos DB 为 1.0.6 / 1.1.5,Elasticsearch、OpenSearch 与 GemFire 为 1.0.9 / 1.1.8。维护者表示打补丁后无需其他缓解措施。
  • 切勿用拼接方式构造存储查询。 使用各后端的参数化查询或预编译语句 API,使受用户影响的值始终作为数据绑定,绝不被解释为语法。这是整类问题的根因修复。
  • 将元数据过滤器视为不可信输入。 当过滤器或 ID 源自请求上下文时,在其到达存储之前,用一份包含预期字段、运算符和值类型的白名单进行校验。对意外的运算符字符应予拒绝,而非试图转义。
  • 将数据库凭据限定为最小权限。 RAG 服务所用的存储账户应仅限于真正需要的集合与操作,使一次成功的注入无法触及无关数据或破坏性操作。
  • 在过滤器之下强制租户隔离。 不要把应用层的过滤字符串当作租户之间的唯一边界;用行级安全、按租户分库或独立索引作为支撑,使被改写的过滤器不等于跨租户读取。
  • 记录并监控查询。 捕获生成的查询,并对异常告警——意外运算符、超大过滤器、带有可疑 ID 的删除操作——以发现利用尝试和回归。

状态

项目
类别RAG 框架中经由元数据过滤器 / 文档 ID 的注入
受影响框架Spring AI 1.0.x 与 1.1.x 的向量库集成
涉及存储Azure Cosmos DB;Elasticsearch、OpenSearch、GemFire(缺陷在胶水代码,而非数据库本身)
影响跨租户读取,并视操作可导致数据篡改或删除
修复版本1.0.6 / 1.1.5(Cosmos DB);1.0.9 / 1.1.8(Elasticsearch / OpenSearch / GemFire)
披露2026 年 4 月 27 日与 6 月 12 日(厂商公告);负责任披露
参考CVE-2026-40978、CVE-2026-47835

关键日期:2026 年 4 月 27 日——Cosmos DB 向量库 SQL 注入公告(CVE-2026-40978),由 SharlongWen 报告。2026 年 6 月 12 日——Elasticsearch/OpenSearch/GemFire 过滤器注入公告(CVE-2026-47835),由阿里云的 Nitro Cao 报告。2026 年 7 月 14 日——Java 生态对 2026 年 4 月 Spring 公告激增及 RAG 管线表达式语言注入(记为 CVE-2026-22738)的报道。版本号与致谢均以厂商公告所载为准。

Sources