
Script de détection de sécurité d'authentification Milvus : CVE-2025-64513 (backdoor sourceid) / CVE-2026-26190 (token faible /expr) / port interne 53100
Script de détection de sécurité d'authentification Milvus. Détecte trois défauts d'authentification :
| Défaut | CVE | Versions affectées | Méthode de détection |
|---|---|---|---|
| Contournement d'authentification par backdoor sourceid | CVE-2025-64513 | < 2.4.24 / < 2.5.21 / < 2.6.5 | gRPC ListDatabases + injection sourceid |
| Jeton faible /expr sur le port d'administration | CVE-2026-26190 | < 2.5.27 / < 2.6.10 | HTTP /expr?code=1%2B1&auth=by-dev (le paramètre code doit être encodé en URL) |
| Port interne rootcoord 53100 sans authentification | — | < 2.6.10 (plus écouté depuis 2.6.10) | Connexion directe 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
Paramètres :
--host : adresse du proxy Milvus--port : port gRPC du proxy (défaut 19530)--mgmt-port : port d'administration (défaut 9091, /expr s'y trouve)--internal-port : port interne (rootcoord défaut 53100, passer 0 pour ignorer)--cve-check : affiche les informations sur les versions affectées par les CVEpip install grpcio protobuf
Les appels gRPC nécessitent le code Python généré à partir des définitions proto (milvus_pb2_grpc.py, root_coord_pb2_grpc.py, etc.), placé dans le sous-répertoire proto/ du répertoire du script. Génération :
# 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() vérifie le header sourceId ; lorsque sa valeur décodée en base64 est égale à @@milvus-member@@, toute la branche d'authentification est contournée. C'est un mécanisme de confiance entre composants internes (PerRPCCredentials de grpcclient/auth.go), mais sans validation de la source, il peut être falsifié de l'extérieur. Chaîne d'exploitation complète : sourceid + authorization=base64("root:假密码") = full admin (le proxy ignore la vérification et transmet la fausse identité telle quelle)./expr du port d'administration 9091 utilise un jeton d'authentification provenant de etcd.rootPath (défaut by-dev), entièrement prévisible, permettant d'exécuter des expressions expr-lang arbitraires. Depuis 2.6.10, il est contrôlé par common.security.exprEnabled et désactivé par défaut.À utiliser uniquement pour des tests de sécurité dans des environnements autorisés. Ne pas utiliser sur des systèmes non autorisés.
AuthenticationInterceptor