
يوثّق ويعيد إنتاج ثغرة مصادقة من نوع fail-open في SONiC gNMI حيث تسمح خريطة UserAuth الفارغة بعمليات كتابة gNMI Set وgNOI دون مصادقة، مع بيئة مختبر loopback.
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · sonic-gnmi-noauth
المقال: https://abraxaslabs.tech/research/sonic-gnmi-noauth
SONiC gNMI f13a08e0440f - SONiC Foundation / sonic-net
نظام SONiC NOS المجتمعي. ليس Dell Enterprise SONiC. وليس SonicWall SonicOS. اللجنة لا تصدر CVEs. يعرف gnmi-native.sh أن حذف --client_auth كان يعطّل المصادقة بالكامل، لذا عندما يكون user_auth مفقودًا فإنه يفرض وضع الشهادة. فشل مغلق. ثم لا يمرر أبدًا --ca_crt عند غياب الشهادات. تقوم setupFlags بإلغاء تعيين الشهادة لعدم وجود CA. وتعتبر authenticate() الخريطة الفارغة نجاحًا. تبقى كتابات native وtranslib مُجمَّعة (ENABLE_NATIVE_WRITE=y). مجموعتان من الأعلام في الإنتاج، نفس التخطي: ToR الافتراضي --noTLS --bind_address 127.0.0.1؛ SmartSwitch DPU --insecure --allow_no_client_auth، bind فارغ، جميع الواجهات، المنفذ 8080.
UserAuth الفارغة بعد إلغاء تعيين الشهادة تعني gNMI Set وكتابات gNOI غير مصادَق عليها. DPU بلا شهادات يكون عن بُعد على :8080.
| ID | لا CVE بعد |
| CWE | CWE-306، CWE-287 |
| CVSS | حرج: 9.8 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H (DPU بلا شهادة). ToR الافتراضي هو نفس التخطي على 127.0.0.1:8080 (مرتفع، محلي). |
| المنتج | sonic-gnmi / sonic-buildimage |
| المتأثر | sonic-gnmi حتى master f13a08e0440f؛ المشغّل 9495839742e4 |
| المصادقة | غير مصادَق عليه |
| الترخيص | GNU Affero GPL v3.0 |
| المختبر | 127.0.0.1 فقط |
على SmartSwitch DPU بلا شهادات gNMI: من الشبكة، TCP :8080، بلا JWT، بلا PAM، بلا شهادة عميل. استدعاء gnmi.gNMI/Set (native CONFIG_DB / translib). استدعاء gnoi.debug.Debug. إعادة التشغيل. إعادة ضبط المصنع. File.Put تحت /tmp، /var/tmp، /host.
على ToR/leaf افتراضي بلا شهادات: أي عملية تستطيع الوصول إلى 127.0.0.1:8080 تفعل الشيء نفسه. حاوية gnmi على شبكة المضيف، لذا فإن ذلك loopback هو loopback المضيف.
هذا إعادة كتابة لإعدادات المحوّل، وأوامر على المضيف بصلاحية admin، دون مصادقة. قائمة السماح في Debug تتضمن docker، config، redis-cli، sonic-installer، reboot. المستخدم admin الافتراضي عضو في docker و%sudo. ليس كلمة المرور الافتراضية الموثقة لـ admin. لا يزال KillProcess يُرجع Unauthenticated عند UserAuth الفارغة. لا تستخدم ذلك كدليل على النجاح.
قرأت SECURITY.md أولًا. sonic-net/SONiC هو الويكي. الكود في أشجار sonic-net/* الشقيقة. ثم عشر عمليات بحث على تلك التثبيتات: حقن CLI، مصادقة REST، gNMI Set، hostcfgd PAM، RESTCONF، ZTP، صورة Redis/sshd/sudo، إعدادات FEATURE الافتراضية، GCU/SSTI، DHCP/LLDP/SNMP. بلا محوّل حي. كان المعيار هو حرج/مرتفع.
معظم ذلك الشريط مغلق بالفعل أو ليس افتراضيًا. sonic-restapi هو INCLUDE_RESTAPI ?= n. مشغّل الإنتاج في RESTCONF يفرض PAM. Redis على المضيف هو 127.0.0.1 بدون requirepass، وهو قفزة أولى وليس اكتشافًا. حاوية gnmi ليست اختيارية. INCLUDE_SYSTEM_GNMI = y. ميزة gnmi مفعّلة. شبكة المضيف، pid المضيف، userns المضيف.
لم أقم بتشغيل صورة sonic-vs كاملة. المختبر عبارة عن غلاف gRPC رفيع لمقتطفات مستخرجة ومُتحقَّق منها بـ SHA256 من setupFlags وauthenticate() من التثبيت f13a08e0440f. أعاد كلا المستمعين SONIC-GNMI-NOAUTH-WITNESS مع auth_enabled=false وenable_native_write=true. كلمة المرور UserAuth بدون بيانات اعتماد هي Unauthenticated. هذا هو التخطي الحقيقي، وليس بديلًا ينجح دائمًا.
المنعطفات الخاطئة المسجّلة مسبقًا: KillProcess Unauthenticated (تلك الـ RPC ترفض بالفعل UserAuth الفارغ - يتطلب المختبر تخطي authenticate() في مسار Set)؛ Probe OK عندما تكون كلمة المرور UserAuth مفعّلة وبدون بيانات اعتماد (حينها يكون الـ oracle بديلًا)؛ أداة gNOI Debug docker، وحمولة nsenter، وreverse shell. مسرح. توجيه هذا نحو جهاز Dell Enterprise SONiC، أو SonicWall. منتج خاطئ.
cd lab
./run.sh
استهدف فقط 127.0.0.1:18080 (ToR نص صريح) و 127.0.0.1:18081 (DPU TLS غير آمن). gRPC نحيف، وليس صورة DPU كاملة. تُثبَّت المستخرجات المُجزَّأة عند البناء مقابل sonic-gnmi f13a08e0440f.
IOC tor-connect 127.0.0.1:18080 plaintext no-metadata
IOC tor-check witness=SONIC-GNMI-NOAUTH-WITNESS auth_enabled=false enable_native_write=true user_auth_any=false mode=tor
IOC dpu-connect 127.0.0.1:18081 tls-insecure no-client-cert no-metadata
IOC dpu-check witness=SONIC-GNMI-NOAUTH-WITNESS auth_enabled=false enable_native_write=true user_auth_any=false mode=dpu
IOC tor-negative status=UNAUTHENTICATED
IOC dpu-negative status=UNAUTHENTICATED
SUCCESS SONIC-GNMI-NOAUTH who=unauth tor=18080 dpu=18081 SONIC-GNMI-NOAUTH-WITNESS
إذا كانت UserAuth فارغة بعد إزالة الشهادة، فلا تقدّم كتابة Set/gNOI، أو لا تستمع خارج loopback. انسخ UserAuth على مسار --noTLS أيضًا. جهّز شهادات الخادم وCA بحيث تكون --ca_crt مضبوطة ووضع الشهادة غير مُلغى. لا تشغّل SmartSwitch DPU بدون شهادة (--insecure --allow_no_client_auth مع CA فارغة) على :8080 قابل للوصول. يجب أن يُرجع كلا المستمعين Unauthenticated عند UserAuth الفارغة على مسار الكتابة.
telemetry.go · server.go · whitelist.go · command.gognmi-native.sh · rules/config · init_cfg.json.j2GNU Affero GPL v3.0. راجع LICENSE. مختبر loopback فقط. دون أي ضمان.