Milvus 认证安全检测脚本。检测三个认证缺陷:
| 缺陷 | CVE | 影响版本 | 检测方式 |
|---|---|---|---|
| sourceid 后门绕过认证 | CVE-2025-64513 | < 2.4.24 / < 2.5.21 / < 2.6.5 | gRPC ListDatabases + sourceid 注入 |
| 管理端口 /expr 弱 token | CVE-2026-26190 | < 2.5.27 / < 2.6.10 | HTTP /expr?code=1%2B1&auth=by-dev(code 参数需 URL 编码) |
| 内部端口 rootcoord 53100 无认证 | — | < 2.6.10(2.6.10 起不再监听) | gRPC 直连 RootCoordService |
# proxy 层检测(sourceid 后门 + /expr 弱 token)
python3 milvus-auth-audit.py --host 127.0.0.1 --port 19530 --mgmt-port 9091
# 完整检测(含内部端口,需容器网络内可达)
python3 milvus-auth-audit.py --host <容器IP> --port 19530 --mgmt-port 9091 --internal-port 53100
参数:
--host:Milvus proxy 地址--port:proxy gRPC 端口(默认 19530)--mgmt-port:管理端口(默认 9091,/expr 在这里)--internal-port:内部端口(rootcoord 默认 53100,传 0 跳过)--cve-check:输出 CVE 影响版本说明pip install grpcio protobuf
gRPC 调用需要 proto 定义生成的 Python 代码(milvus_pb2_grpc.py、root_coord_pb2_grpc.py 等),放在脚本同目录的 proto/ 子目录下。生成方式:
# 1. 拉 milvus-proto 仓库
git clone https://github.com/milvus-io/milvus-proto.git
# 2. 拉 milvus 源码(内部 proto:root_coord.proto / internal.proto / proxy.proto 等)
git clone https://github.com/milvus-io/milvus.git
# 3. 生成(milvus 内部 proto 在 milvus/pkg/proto/ 下)
pip install grpcio-tools
python3 -m grpc_tools.protoc -I milvus-proto/proto -I milvus/pkg/proto \
--python_out=proto --grpc_python_out=proto \
milvus-proto/proto/milvus.proto milvus/pkg/proto/root_coord.proto \
milvus/pkg/proto/internal.proto milvus/pkg/proto/proxy.proto
=== 2.6.4 ===
[*] 目标: 172.22.0.4:19530 管理端口: 9091
[check] 认证状态: 已开启认证(authorizationEnabled=true)
[verify] sourceid 后门绕过认证, 数据库=['default'] -> HIT
[verify] /expr 任意表达式执行 (auth=by-dev) -> HIT
[exploit] 内部端口未认证, 数据库=['default'] -> HIT
[!] 发现 3 个可利用认证缺陷
=== 2.6.5 ===
[check] 认证状态: 已开启认证(authorizationEnabled=true)
[verify] sourceid 被拒绝 -> SAFE
[verify] /expr 任意表达式执行 (auth=by-dev) -> HIT
[exploit] 内部端口未认证, 数据库=['default'] -> HIT
[!] 发现 2 个可利用认证缺陷
=== 2.6.10 ===
[check] 认证状态: 已开启认证(authorizationEnabled=true)
[verify] sourceid 被拒绝 -> SAFE
[verify] /expr 已默认禁用 -> SAFE
[exploit] 端口不可达 -> SAFE
[+] 未发现认证缺陷
internal/proxy/authentication_interceptor.go 中 validSourceID() 检查 sourceId header,值 base64 解码等于 @@milvus-member@@ 时跳过整个认证分支。这是内部组件互信机制(grpcclient/auth.go 的 PerRPCCredentials),但无来源校验,外部可伪造。完整利用链:sourceid + authorization=base64("root:假密码") = full admin(proxy 跳过校验,假身份原样透传)。/expr debug 端点,认证 token 来自 etcd.rootPath(默认 by-dev),完全可预测,可执行任意 expr-lang 表达式。2.6.10 起由 common.security.exprEnabled 控制,默认禁用。AuthenticationInterceptor 只注册在 proxy(19530),rootcoord 内部 gRPC server(53100)无认证。容器网络内未认证直连即可 full admin。2.6.10 起该端口不再监听。仅用于授权环境的安全检测。请勿对未授权的系统使用。