
Technical analysis and proof of concept for CVE-2026-59827, a critical unsafe Java deserialization vulnerability in Metabase leading to remote code execution.
重大度: Critical (CVSS 9.9)
CVE: CVE-2026-59827
アドバイザリ: GHSA-w95f-x9v9-wv36
報告者: Matheus Gutierre (@Gutierre0x80)
公開日: 2026年6月30日
H2 データベース上のネイティブ SQL クエリにアクセスできる認証済みユーザーは、SELECT CAST(X'...' AS OTHER) クエリから返された Java オブジェクトの安全でない逆シリアル化を介して、Metabase サーバー上で任意の Java コードを実行できます。
デフォルトの Metabase インストールには H2 サンプルデータベースが含まれており、この脆弱性はすべてのデフォルトデプロイメントで悪用可能です。
pip install requestsexploit.py と同じディレクトリにあること:すべての前提条件がインストールされ、PATH で利用可能であることを確認してください:
# Install Python requests library
pip install requests
# Verify Java is available (OpenJDK 11+)
java -version
# Verify Python 3.7+
python3 --version
次に、poc/ ディレクトリからエクスプロイトを実行します:
cd poc/
python3 exploit.py <target_url> <username> <password> <command>
スクリプトは実行前に、作業ディレクトリに clojure-1.12.3.jar と VarChainPayload.class が存在することを検証します。
python3 exploit.py <target_url> <username> <password> <command>
python3 exploit.py http://127.0.0.1:3000 [email protected] Admin1234! "id > /tmp/pwned.txt"
コマンドは Metabase プロセスのコンテキストで実行されます(通常は Docker 内の metabase ユーザー)。
H2 の OTHER 列タイプは、JEP-290 フィルタリングなしの素の ObjectInputStream を使用して Java オブジェクトを逆シリアル化します。これにより、任意のクラスのインスタンス化が可能になります。
ペイロードは、Clojure のシリアライズ可能なクラス(clojure.core$apply、clojure.lang.Var$Serialized、PersistentList)と Java の PriorityQueue を組み合わせたガジェットチェーンを使用して、clojure.core/eval 経由でコード実行をトリガーします。
詳細な技術分析については writeup/analysis.md を参照してください。
| Argument | Description | Example |
|---|
target_url | Metabase インスタンスの URL | http://127.0.0.1:3000 |
username | 認証済みユーザー(管理者またはネイティブクエリアクセス権限を持つユーザー) | [email protected] |
password | ユーザーパスワード | SecurePassword123! |
command | 実行するシェルコマンド | id or whoami |