
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.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.Nur für Sicherheitstests in autorisierten Umgebungen. Nicht gegen nicht autorisierte Systeme verwenden.