
Technische Analyse und Proof of Concept für CVE-2026-59827, eine kritische unsichere Java-Deserialisierungsschwachstelle in Metabase, die zu Remote-Code-Ausführung führt.
Schweregrad: Kritisch (CVSS 9.9)
CVE: CVE-2026-59827
Advisory: GHSA-w95f-x9v9-wv36
Reporter: Matheus Gutierre (@Gutierre0x80)
Veröffentlicht: 30. Juni 2026
Ein authentifizierter Benutzer mit Zugriff auf native SQL-Abfragen auf einer H2-Datenbank kann beliebigen Java-Code auf dem Metabase-Server ausführen, indem eine unsichere Deserialisierung von Java-Objekten ausgenutzt wird, die von SELECT CAST(X'...' AS OTHER)-Abfragen zurückgegeben werden.
Die Standardinstallation von Metabase enthält eine H2-Beispieldatenbank, wodurch diese Schwachstelle in allen Standardbereitstellungen ausnutzbar ist.
pip install requestsexploit.py befinden:Stellen Sie sicher, dass alle Voraussetzungen installiert und im PATH verfügbar sind:
# Install Python requests library
pip install requests
# Verify Java is available (OpenJDK 11+)
java -version
# Verify Python 3.7+
python3 --version
Führen Sie den Exploit anschließend aus dem Verzeichnis poc/ aus:
cd poc/
python3 exploit.py <target_url> <username> <password> <command>
Das Skript prüft vor der Ausführung, ob clojure-1.12.3.jar und VarChainPayload.class im Arbeitsverzeichnis vorhanden sind.
python3 exploit.py <target_url> <username> <password> <command>
| Argument | Beschreibung | Beispiel |
|---|---|---|
target_url | URL der Metabase-Instanz | http://127.0.0.1:3000 |
username | Authentifizierter Benutzer (Admin oder mit Zugriff auf native Abfragen) | [email protected] |
password | Benutzerpasswort | SecurePassword123! |
command | Auszuführender Shell-Befehl | id oder whoami |
python3 exploit.py http://127.0.0.1:3000 [email protected] Admin1234! "id > /tmp/pwned.txt"
Der Befehl wird im Kontext des Metabase-Prozesses ausgeführt (normalerweise der Benutzer metabase in Docker).
Der H2-Spaltentyp OTHER deserialisiert Java-Objekte mit einem bloßen ObjectInputStream ohne JEP-290-Filterung. Dadurch ist eine beliebige Klasseninstanziierung möglich.
Die Payload verwendet eine Gadget-Kette auf Basis von Clojures serialisierbaren Klassen (clojure.core$apply, clojure.lang.Var$Serialized und PersistentList) in Kombination mit Javas PriorityQueue, um Codeausführung über clojure.core/eval auszulösen.
Die vollständige technische Analyse finden Sie in writeup/analysis.md.