
Milvus 認証セキュリティ検出スクリプト:CVE-2025-64513 (sourceidバックドア) / CVE-2026-26190 (/expr弱いトークン) / 内部ポート53100
Milvus 認証セキュリティ検出スクリプト。3つの認証欠陥を検出します:
| 欠陥 | CVE | 影響バージョン | 検出方法 |
|---|---|---|---|
| sourceid バックドアによる認証バイパス | CVE-2025-64513 | < 2.4.24 / < 2.5.21 / < 2.6.5 | gRPC ListDatabases + sourceid インジェクション |
| 管理ポート /expr の弱いトークン | 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 が検証をスキップし、偽のIDがそのまま透過されます)。/expr デバッグエンドポイントでは、認証トークンが etcd.rootPath(デフォルト by-dev)に由来しており、完全に予測可能で、任意の expr-lang 式を実行できます。2.6.10 以降は common.security.exprEnabled によって制御され、デフォルトで無効です。AuthenticationInterceptor は proxy(19530)にのみ登録されており、rootcoord の内部 gRPC server(53100)には認証がありません。コンテナネットワーク内で認証なしに直接接続するだけで full admin になります。2.6.10 以降はこのポートはリッスンされません。認可された環境でのセキュリティ検出にのみ使用してください。認可されていないシステムには使用しないでください。