
SONiC gNMI में एक fail-open प्रमाणीकरण दोष का दस्तावेजीकरण और पुनरुत्पादन करता है, जहाँ एक खाली UserAuth map अनधिकृत gNMI Set और gNOI writes की अनुमति देता है, साथ में एक loopback lab harness भी।
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 नहीं। कमेटी CVE जारी नहीं करती। gnmi-native.sh जानता है कि --client_auth छोड़ने से पहले प्रमाणीकरण पूरी तरह बंद हो जाता था, इसलिए जब user_auth अनुपस्थित होता है तो यह cert मोड को बाध्य करता है। फेल-क्लोज़्ड। फिर जब certs अनुपस्थित होते हैं तो यह कभी --ca_crt पास नहीं करता। setupFlags cert को unset करता है क्योंकि कोई CA नहीं है। authenticate() खाली map को सफलता मानता है। Native और translib writes कंपाइल्ड-इन रहते हैं (ENABLE_NATIVE_WRITE=y)। दो प्रोडक्शन फ्लैग सेट, वही स्किप: डिफ़ॉल्ट ToR --noTLS --bind_address 127.0.0.1; SmartSwitch DPU --insecure --allow_no_client_auth, खाली bind, सभी इंटरफ़ेस, पोर्ट 8080।
cert unset के बाद खाली UserAuth का अर्थ है अनप्रमाणित gNMI Set और gNOI writes। बिना certs वाला 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 no-cert)। डिफ़ॉल्ट ToR 127.0.0.1:8080 पर वही स्किप है (High, लोकल)। |
| उत्पाद | sonic-gnmi / sonic-buildimage |
| प्रभावित | sonic-gnmi master f13a08e0440f तक; launcher 9495839742e4 |
| प्रमाणीकरण | अनप्रमाणित |
| लाइसेंस | GNU Affero GPL v3.0 |
| लैब | केवल 127.0.0.1 |
बिना gNMI certs वाले SmartSwitch DPU पर: नेटवर्क से, TCP :8080, कोई JWT नहीं, कोई PAM नहीं, कोई client cert नहीं। gnmi.gNMI/Set कॉल करें (native CONFIG_DB / translib)। gnoi.debug.Debug कॉल करें। रीबूट करें। फैक्टरी रीसेट करें। /tmp, /var/tmp, /host के अंतर्गत File.Put करें।
बिना certs वाले डिफ़ॉल्ट ToR/leaf पर: कोई भी प्रोसेस जो 127.0.0.1:8080 तक पहुँच सकती है, वही कर सकती है। gnmi कंटेनर host net है, इसलिए वह loopback होस्ट का है।
यह स्विच कॉन्फ़िग रीराइट है, और admin के रूप में होस्ट कमांड, बिना प्रमाणीकरण के। Debug whitelist में docker, config, redis-cli, sonic-installer, reboot शामिल हैं। डिफ़ॉल्ट admin docker और %sudo में है। दस्तावेज़ित डिफ़ॉल्ट admin पासवर्ड नहीं। खाली UserAuth पर KillProcess अभी भी Unauthenticated लौटाता है। इसे सफलता के oracle के रूप में उपयोग न करें।
मैंने पहले SECURITY.md पढ़ा। sonic-net/SONiC विकी है। कोड सहोदर sonic-net/* ट्री में है। फिर उन pins पर दस hunts: CLI injection, REST auth, gNMI Set, hostcfgd PAM, RESTCONF, ZTP, image Redis/sshd/sudo, FEATURE defaults, GCU/SSTI, DHCP/LLDP/SNMP। कोई लाइव स्विच नहीं। मानक था Critical/High।
उस बार का अधिकांश हिस्सा पहले से ही बंद है या डिफ़ॉल्ट नहीं है। sonic-restapi INCLUDE_RESTAPI ?= n है। RESTCONF का प्रोडक्शन लॉन्चर PAM को बाध्य करता है। होस्ट Redis 127.0.0.1 पर है और इसमें कोई requirepass नहीं है, जो कि पहला हॉप है, कोई निष्कर्ष नहीं। gnmi कंटेनर वैकल्पिक नहीं है। INCLUDE_SYSTEM_GNMI = y। FEATURE gnmi सक्षम है। होस्ट नेट, होस्ट pid, होस्ट userns।
मैंने पूरा sonic-vs इमेज नहीं खड़ा किया। लैब एक पतला gRPC है जो पिन f13a08e0440f से setupFlags और authenticate() के SHA256-जाँचे गए एक्सट्रैक्ट को रैप करता है। दोनों लिसनरों ने auth_enabled=false और enable_native_write=true के साथ SONIC-GNMI-NOAUTH-WITNESS लौटाया। बिना क्रेड्स के पासवर्ड UserAuth Unauthenticated है। यही असली स्किप है, कोई ऐसा स्टब नहीं जो हमेशा सफल होता है।
पहले से दर्ज गलत मोड़: KillProcess Unauthenticated (वह RPC पहले से ही खाली UserAuth को अस्वीकार करता है - लैब के लिए Set-path authenticate() स्किप आवश्यक है); पासवर्ड UserAuth चालू होने और क्रेड्स न होने पर Probe OK (तब ओरेकल एक स्टब है); एक gNOI Debug docker गैजेट, nsenter पेलोड, रिवर्स शेल। नाटक। इसे किसी Dell Enterprise SONiC बॉक्स, या SonicWall पर इंगित करना। गलत उत्पाद।
cd lab
./run.sh
केवल 127.0.0.1:18080 (ToR plaintext) और 127.0.0.1:18081 (DPU TLS-insecure) को लक्षित करें। पतला 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 लेखन को सेव न करें, या लूपबैक से बाहर सुनना न करें। --noTLS पथ पर भी UserAuth की प्रतिलिपि बनाएँ। सर्वर प्रमाणपत्र और एक CA प्रावधान करें ताकि --ca_crt सेट हो और प्रमाणपत्र मोड अनसेट न रहे। किसी पहुँच-योग्य :8080 पर SmartSwitch DPU बिना-प्रमाणपत्र (--insecure --allow_no_client_auth खाली CA के साथ) न चलाएँ। लेखन पथ पर खाली UserAuth के लिए दोनों लिसनरों को Unauthenticated लौटाना चाहिए।
telemetry.go · server.go · whitelist.go · command.gognmi-native.sh · rules/config · init_cfg.json.j2GNU Affero GPL v3.0. देखें LICENSE। केवल लूपबैक लैब। कोई वारंटी नहीं।