
Analisi tecnica e proof of concept per CVE-2026-59827, una vulnerabilità critica di deserializzazione Java non sicura in Metabase che porta a esecuzione di codice remoto.
Gravità: Critica (CVSS 9.9)
CVE: CVE-2026-59827
Avviso: GHSA-w95f-x9v9-wv36
Segnalatore: Matheus Gutierre (@Gutierre0x80)
Pubblicato: 30 giugno 2026
Un utente autenticato con accesso alle query SQL native su un database H2 può eseguire codice Java arbitrario sul server Metabase tramite deserializzazione non sicura di oggetti Java restituiti dalle query SELECT CAST(X'...' AS OTHER).
L'installazione predefinita di Metabase include un database di esempio H2, rendendo questa vulnerabilità sfruttabile su tutte le installazioni predefinite.
pip install requestsexploit.py:Assicurati che tutti i prerequisiti siano installati e disponibili nel PATH:
# Install Python requests library
pip install requests
# Verify Java is available (OpenJDK 11+)
java -version
# Verify Python 3.7+
python3 --version
Quindi esegui l'exploit dalla directory poc/:
cd poc/
python3 exploit.py <target_url> <username> <password> <command>
Lo script verifica che clojure-1.12.3.jar e VarChainPayload.class esistano nella directory di lavoro prima dell'esecuzione.
python3 exploit.py <target_url> <username> <password> <command>
| Argomento | Descrizione | Esempio |
|---|---|---|
target_url | URL dell'istanza Metabase | http://127.0.0.1:3000 |
username | Utente autenticato (admin o con accesso alle query native) | [email protected] |
password | Password dell'utente | SecurePassword123! |
command | Comando shell da eseguire | id o whoami |
python3 exploit.py http://127.0.0.1:3000 [email protected] Admin1234! "id > /tmp/pwned.txt"
Il comando viene eseguito nel contesto del processo Metabase (tipicamente l'utente metabase in Docker).
Il tipo di colonna OTHER di H2 deserializza gli oggetti Java utilizzando un ObjectInputStream semplice, senza filtri JEP-290. Ciò consente l'istanziazione arbitraria di classi.
Il payload utilizza una catena di gadget basata sulle classi serializzabili di Clojure (clojure.core$apply, clojure.lang.Var$Serialized e PersistentList) combinata con PriorityQueue di Java per attivare l'esecuzione di codice tramite clojure.core/eval.
Vedi writeup/analysis.md per l'analisi tecnica completa.