
SONiC gNMI における fail-open 認証脆弱性を文書化・再現します。空の UserAuth マップにより、未認証での gNMI Set および gNOI 書き込みが可能になる問題を、ループバックラボハーネスを用いて検証します。
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 が欠落している場合には証明書モードを強制する。フェイルクローズである。しかし、証明書が存在しない場合には --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 パスワードではない。空の UserAuth では KillProcess は依然として 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 は有効です。ホスト net、ホスト pid、ホスト userns。
完全な 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-path の 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 非セキュア)のみを対象とします。完全な DPU イメージではなく、シン gRPC です。ビルド時に 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 の証明書なし構成(空の 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 を参照してください。ループバックラボ専用です。保証はありません。