
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
SONiC gNMI f13a08e0440f - SONiC Foundation / sonic-net
Community SONiC NOS। Dell Enterprise SONiC नहीं। SonicWall SonicOS नहीं। समिति CVE जारी नहीं करती। gnmi-native.sh जानता है कि --client_auth को छोड़ने से प्रमाणीकरण पूरी तरह से अक्षम हो जाता था, इसलिए जब user_auth अनुपस्थित होता है तो यह cert मोड को बाध्य करता है। Fail-closed। फिर जब certs अनुपस्थित होते हैं तो यह कभी --ca_crt पास नहीं करता। setupFlags cert को unset करता है क्योंकि कोई CA नहीं है। authenticate() खाली map को सफलता मानता है। Native और translib writes कंपाइल में बने रहते हैं (ENABLE_NATIVE_WRITE=y)। दो production flag सेट, समान skip: default ToR --noTLS --bind_address 127.0.0.1; SmartSwitch DPU --insecure --allow_no_client_auth, खाली bind, सभी interfaces, port 8080।
cert unset के बाद खाली UserAuth का अर्थ है unauthenticated gNMI Set और gNOI writes। बिना certs वाला DPU :8080 पर remote है।
| ID | अभी तक कोई CVE नहीं |
| CWE | CWE-306, CWE-287 |
| CVSS | Critical: 9.8 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H (DPU no-cert)। Default ToR 127.0.0.1:8080 पर वही skip है (High, local)। |
| Product | sonic-gnmi / sonic-buildimage |
| Affected | sonic-gnmi master f13a08e0440f तक; launcher 9495839742e4 |
| Auth | unauthenticated |
| License | GNU Affero GPL v3.0 |
| Lab | केवल 127.0.0.1 |
बिना gNMI certs वाले SmartSwitch DPU पर: नेटवर्क से, TCP :8080, कोई JWT नहीं, कोई PAM नहीं, कोई client cert नहीं। gnmi.gNMI/Set कॉल करें (native CONFIG_DB / translib)। gnoi.debug.Debug कॉल करें। Reboot करें। Factory reset करें। /tmp, /var/tmp, /host के अंतर्गत File.Put करें।
बिना certs वाले default ToR/leaf पर: कोई भी प्रक्रिया जो 127.0.0.1:8080 तक पहुँच सकती है, वही कर सकती है। gnmi container host net है, इसलिए वह loopback host का है।
यह switch config rewrite है, और बिना प्रमाणीकरण के admin के रूप में host commands है। Debug whitelist में docker, config, redis-cli, sonic-installer, reboot शामिल हैं। Default admin docker और %sudo में है। दस्तावेज़ित default admin password नहीं। खाली UserAuth पर KillProcess अभी भी Unauthenticated लौटाता है। इसे success oracle के रूप में उपयोग न करें।
मैंने पहले SECURITY.md पढ़ा। sonic-net/SONiC wiki है। कोड sibling sonic-net/* trees में है। फिर उन pins पर दस hunts: CLI injection, REST auth, gNMI Set, hostcfgd PAM, RESTCONF, ZTP, image Redis/sshd/sudo, FEATURE defaults, GCU/SSTI, DHCP/LLDP/SNMP। कोई live switch नहीं। बार Critical/High था।
उस बार का अधिकांश हिस्सा पहले से ही बंद है या default नहीं है। sonic-restapi INCLUDE_RESTAPI ?= n है। RESTCONF का production launcher PAM को बाध्य करता है। Host Redis 127.0.0.1 पर है बिना requirepass के, जो एक first hop है, कोई finding नहीं। gnmi container वैकल्पिक नहीं है। INCLUDE_SYSTEM_GNMI = y। FEATURE gnmi सक्षम है। Host net, host pid, host userns।
मैंने पूरा sonic-vs image खड़ा नहीं किया। Lab एक पतला gRPC है जो pin f13a08e0440f से setupFlags और authenticate() के SHA256-सत्यापित extracts को wrap करता है। दोनों listeners ने auth_enabled=false और enable_native_write=true के साथ SONIC-GNMI-NOAUTH-WITNESS लौटाया। बिना creds वाला password UserAuth Unauthenticated है। यही असली skip है, कोई stub नहीं जो हमेशा सफल होता है।
पहले से दर्ज गलत मोड़: KillProcess Unauthenticated (वह RPC पहले से ही खाली UserAuth को अस्वीकार करता है - lab को Set-path authenticate() skip चाहिए); password UserAuth चालू होने और creds न होने पर Probe OK (तब oracle एक stub है); एक gNOI Debug docker gadget, nsenter payload, reverse shell। नाटक। इसे Dell Enterprise SONiC box, या SonicWall पर इंगित करना। गलत product।
cd lab
./run.sh
लक्ष्य केवल 127.0.0.1:18080 (ToR plaintext) और 127.0.0.1:18081 (DPU TLS-insecure)। पतला gRPC, पूरा DPU image नहीं। Pin extracts build के समय sonic-gnmi f13a08e0440f के विरुद्ध hashed।
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
यदि cert हटाने के बाद UserAuth खाली है, तो Set/gNOI write को serve न करें, या loopback से बाहर listen न करें। --noTLS path पर भी UserAuth को copy करें। Server certs और एक CA प्रावधान करें ताकि --ca_crt सेट हो और cert मोड unset न हो। SmartSwitch DPU no-cert (--insecure --allow_no_client_auth खाली CA के साथ) को पहुँचने योग्य :8080 पर न चलाएँ। write path पर खाली UserAuth के लिए दोनों listeners को Unauthenticated लौटाना चाहिए।
telemetry.go · server.go · whitelist.go · command.gognmi-native.sh · rules/config · init_cfg.json.j2GNU Affero GPL v3.0। देखें LICENSE। केवल Loopback lab। कोई वारंटी नहीं।