
SONiC gNMI における fail-open 認証脆弱性を文書化・再現します。空の UserAuth マップにより、未認証での gNMI Set および gNOI 書き込みが可能になる問題を、ループバックラボハーネスを用いて検証します。
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · 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 が欠落している場合は証明書モードを強制する。フェイルクローズド。しかし証明書が存在しない場合、--ca_crt を渡すことは決してない。setupFlags は CA が存在しないため証明書を unset する。authenticate() は空のマップを成功として扱う。ネイティブおよび translib の書き込みはコンパイルされたまま残る(ENABLE_NATIVE_WRITE=y)。2 つの本番フラグセット、同じスキップ:デフォルト ToR は --noTLS --bind_address 127.0.0.1、SmartSwitch DPU は --insecure --allow_no_client_auth、bind は空、全インターフェース、ポート 8080。
証明書 unset 後の空の UserAuth は、認証されていない gNMI Set および gNOI 書き込みである。証明書のない DPU は :8080 でリモートに公開される。
| 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 証明書なし)。デフォルト ToR は 127.0.0.1:8080 上の同じスキップ(High、ローカル)。 |
| Product | sonic-gnmi / sonic-buildimage |
| Affected | sonic-gnmi から master f13a08e0440f まで、ランチャー 9495839742e4 |
| Auth | 認証なし |
| License | GNU Affero GPL v3.0 |
| Lab | 127.0.0.1 のみ |
gNMI 証明書のない SmartSwitch DPU 上では、ネットワークから TCP :8080、JWT なし、PAM なし、クライアント証明書なしで、gnmi.gNMI/Set(ネイティブ CONFIG_DB / translib)を呼び出せる。gnoi.debug.Debug を呼び出せる。再起動。工場出荷時リセット。/tmp、/var/tmp、/host 配下への File.Put。
証明書のないデフォルト ToR/リーフでは、127.0.0.1:8080 に到達できる任意のプロセスが同じことを行える。gnmi コンテナはホストネットワーク上にあるため、そのループバックはホストのものである。
つまり、認証なしでスイッチ設定の書き換えと admin としてのホストコマンド実行が可能である。デバッグのホワイトリストには docker、config、redis-cli、sonic-installer、reboot が含まれる。デフォルトの admin は docker および %sudo に属する。ドキュメント化されたデフォルトの admin パスワードではない。KillProcess は空の UserAuth に対して依然として Unauthenticated を返す。これを成功の判定基準として使用しないこと。
最初に SECURITY.md を読んだ。sonic-net/SONiC は wiki である。コードは兄弟の sonic-net/* ツリーにある。次にそれらのピンに対して 10 回の調査を行った:CLI インジェクション、REST 認証、gNMI Set、hostcfgd PAM、RESTCONF、ZTP、イメージの Redis/sshd/sudo、FEATURE デフォルト、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、ホストユーザー名前空間。
完全な sonic-vs イメージは立ち上げていない。ラボは、ピン f13a08e0440f の setupFlags と authenticate() の SHA256 検証済み抽出物を薄く gRPC でラップしたものである。両方のリスナーは auth_enabled=false および enable_native_write=true で SONIC-GNMI-NOAUTH-WITNESS を返した。認証情報なしのパスワード UserAuth は Unauthenticated である。これが実際のスキップであり、常に成功するスタブではない。
すでに記録済みの誤った方向:KillProcess Unauthenticated(その RPC はすでに空の UserAuth を拒否する - ラボは Set パスの authenticate() スキップを必要とする)、パスワード UserAuth がオンで認証情報がない場合の Probe OK(その場合の判定基準はスタブである)、gNOI Debug docker ガジェット、nsenter ペイロード、リバースシェル。すべて茶番である。これを Dell Enterprise SONiC ボックスや SonicWall に向けるのは誤った製品である。
cd lab
./run.sh
対象は 127.0.0.1:18080(ToR 平文)と 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 が設定され、証明書モードが unset されないようにすること。到達可能な :8080 上で SmartSwitch DPU の証明書なし(空の CA で --insecure --allow_no_client_auth)を実行しないこと。書き込みパスで空の UserAuth に対して両方のリスナーが Unauthenticated を返さなければならない。
telemetry.go · server.go · whitelist.go · command.gognmi-native.sh · rules/config · init_cfg.json.j2GNU Affero GPL v3.0。LICENSE を参照。ループバックラボのみ。無保証。