IPBUF安全漏洞报告
English
CVE-2026-41705 CVSS 8.6 高危

CVE-2026-41705 Spring AI Milvus过滤表达式注入漏洞

披露日期: 2026-05-09

漏洞信息

漏洞编号
CVE-2026-41705
漏洞类型
过滤表达式注入
CVSS评分
8.6 高危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
Spring AI

相关标签

注入漏洞Spring AIMilvus高危CVE-2026-41705NoSQL注入

漏洞概述

Spring AI 项目中的 MilvusVectorStore 组件存在严重的安全漏洞。该漏洞源于 `doDelete` 方法的实现未能对传入的文档 ID 进行适当的清理和消毒。攻击者可以通过利用这一缺陷,在文档 ID 中注入恶意的过滤表达式。由于该漏洞无需认证且无需用户交互即可被利用,远程攻击者可构造特制的数据包发动攻击。成功的利用可能导致 Milvus 向量数据库中的敏感信息泄露(高机密性影响),或导致数据被篡改和删除(完整性与可用性影响)。此问题影响了 Spring AI 1.0.x 和 1.1.x 的多个版本。

技术细节

该漏洞的核心原理是典型的注入攻击,具体发生在 Spring AI 与 Milvus 向量数据库交互的 `MilvusVectorStore#doDelete(List)` 接口中。当应用程序调用该方法以删除指定的文档时,它会接收一个包含文档 ID 的列表。在受影响的版本中,代码直接将这些 ID 拼接到 Milvus 的查询表达式中,而没有进行严格的输入验证或转义。

Milvus 数据库使用特定的表达式语言来过滤数据。攻击者可以利用这一机制,将原本应该作为纯文本处理的 ID 参数修改为包含逻辑运算符(如 `&&`, `||`)或特定函数的恶意表达式。例如,攻击者可以注入一个逻辑表达式,使得删除条件永远为真,从而删除数据库中的所有记录,或者通过盲注技术提取敏感数据。由于 CVSS 评分为 8.6,且攻击向量为网络(AV:N),攻击者只需能够向受影响的应用端点发送 HTTP 请求即可触发漏洞,无需任何权限。

攻击链分析

STEP 1
侦察
攻击者识别出目标应用程序正在使用受影响版本的 Spring AI,并且暴露了 MilvusVectorStore 的删除接口。
STEP 2
武器化
攻击者构造包含恶意过滤表达式的文档 ID,旨在绕过正常的 ID 检查并操纵底层数据库查询。
STEP 3
交付
攻击者向目标服务器的 `doDelete` 接口发送包含恶意 ID 列表的 HTTP POST 请求。
STEP 4
利用
Spring AI 未经清理直接将恶意 ID 传递给 Milvus。Milvus 解析并执行该注入的表达式,导致非预期的数据操作。
STEP 5
影响
利用漏洞导致数据被意外删除、篡改,或通过布尔盲注导致敏感数据泄露。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import requests import json # Target URL (Example) target_url = "http://vulnerable-app/api/delete" # Malicious payload simulating a filter expression injection. # Instead of a normal ID, we inject a logical expression. # Note: The exact syntax depends on the Milvus expression language implementation. malicious_ids = [ "normal_id_123", "' or '1'='1" # Attempting to inject a tautology to affect all records ] payload = { "ids": malicious_ids } headers = { "Content-Type": "application/json" } try: # Send the malicious request response = requests.post(target_url, data=json.dumps(payload), headers=headers) # Check response status if response.status_code == 200: print("[+] Request sent successfully. Check database for impact.") else: print(f"[-] Request failed with status code: {response.status_code}") except Exception as e: print(f"[!] An error occurred: {e}")

影响范围

Spring AI 1.0.0 至 1.0.x (最新版)
Spring AI 1.1.0 至 1.1.x (最新版)

防御指南

临时缓解措施
如果无法立即升级版本,建议在网关层或应用层面对传入 `doDelete` 方法的 ID 参数进行深度清洗。应拒绝包含特殊字符(如单引号、双引号、逻辑运算符 `&&`, `||` 等)的 ID。此外,限制对删除接口的网络访问权限,仅允许受信任的内网服务调用,也可以降低风险。

参考链接