système : OPÉRATIONNEL
← retour à tous les hacks
INFRASTRUCTURE MEDIUM NEW

Path traversal dans LangChain Core : load_prompt lit des fichiers arbitraires

CVE-2026-34070 permet à une config de prompt forgée de parcourir le système de fichiers via load_prompt et d'exposer des secrets .txt/.json/.yaml. Divulguée le 27 mars 2026, corrigée dans langchain-core 1.2.22.

2026-06-19 // 6 min affects: langchain-core, langchain, llm-orchestration-frameworks

De quoi s’agit-il ?

CVE-2026-34070 est une vulnérabilité de type path traversal (traversée de répertoire) dans langchain-core, le paquet fondateur du framework d’orchestration LLM très répandu LangChain. Elle a été divulguée le 27 mars 2026 par les chercheurs de Cyera dans le cadre de leur analyse « LangDrained », et porte l’identifiant d’avis GHSA-qh6h-p6c9-ff54. La faille réside dans un ensemble d’API héritées et non documentées de chargement de prompts : load_prompt(), load_prompt_from_config() et la méthode .save() des classes de prompt, toutes dans langchain_core.prompts.loading.

La classification est des plus banales — CWE-22, « Limitation incorrecte d’un chemin vers un répertoire restreint » — et c’est précisément l’intérêt. Ce n’est pas une attaque IA exotique, mais une vulnérabilité web classique, vieille de plusieurs décennies, qui resurgit dans la plomberie d’un framework d’IA, où elle s’atteint via des données de configuration de prompt plutôt que via une URL. Le NVD la note CVSS 3.1 à 7.5 (élevée) ; l’évaluation CVSS 4.0 de Snyk la situe à 8.7.

Comment ça marche

Les fonctions vulnérables lisent des fichiers à partir de chemins intégrés dans des dictionnaires de configuration désérialisés. Lorsqu’une application charge un prompt depuis un objet de configuration, ces fonctions résolvent un chemin de fichier et en lisent le contenu — sans valider le chemin contre les séquences de traversée ni l’injection de chemin absolu.

Si une application transmet à load_prompt() ou load_prompt_from_config() une configuration de prompt influençable par l’utilisateur, un attaquant qui contrôle cette configuration peut fournir un chemin contenant des séquences ../ (ou un chemin absolu) et lire des fichiers arbitraires sur le système hôte. La seule contrainte est une vérification d’extension : les templates sont lus en .txt, et les fichiers d’exemples en .json ou .yaml. Dans la limite de ces extensions, rien n’empêche une requête de sortir du répertoire de prompts prévu pour atteindre des fichiers de configuration, des exports d’environnement ou des stockages de secrets utilisant une extension autorisée.

# Forme illustrative du schéma dangereux — ne JAMAIS charger une config de prompt non fiable
from langchain_core.prompts import load_prompt

# 'config' est influençable par l'attaquant (uploadée, récupérée ou templatée)
config = {
    "_type": "prompt",
    "template_path": "../../../../[CHEMIN_SENSIBLE_REDACTE].yaml",
}
prompt = load_prompt(config)   # lit le fichier traversé, limité par la seule extension

La précondition d’exploitation est la nuance essentielle : le danger ne se concrétise que lorsqu’une application alimente ces chargeurs hérités avec une configuration non fiable. L’impact est une divulgation d’information (confidentialité), pas un accès en écriture ni une exécution de code — le vecteur CVSS retient un impact élevé sur la confidentialité, nul sur l’intégrité et la disponibilité.

Pourquoi c’est important

C’est le troisième élément d’un schéma mis en évidence par Cyera à travers LangChain et LangGraph : des défauts de validation d’entrée dans la « plomberie fondatrice et invisible » qui relie les modèles aux flux métier. Cyera a analysé CVE-2026-34070 aux côtés d’une faille antérieure de désérialisation non sûre dans langchain-core (CVE-2025-68664, notée 9.3, décembre 2025) et d’une injection SQL dans le checkpointer de LangGraph (CVE-2025-67644, 7.3). Chacune correspond à une couche différente et à une classe de données différente — fichiers locaux, secrets d’exécution, état persistant de l’agent.

La leçon plus large : les frameworks d’orchestration d’IA héritent de toute la surface d’attaque des logiciels ordinaires, plus de nouveaux points d’entrée. Un path traversal qui exigeait autrefois un paramètre HTTP malveillant peut désormais arriver via un template de prompt récupéré depuis un dépôt, une configuration d’agent fournie par l’utilisateur, ou un objet sérialisé extrait d’une base de données. Le même thème traverse la SQLi pré-auth de LiteLLM, le path traversal de LangFlow et la faille LLM-API de pgAdmin : des bugs traditionnels logés inhabituellement près des identifiants et du trafic des modèles, dans du code qui n’existait pas il y a trois ans.

Défenses

La première mesure, concrète, est de mettre à jour : langchain-core 1.2.22 corrige le problème, avec un backport dans la branche 0.3.x en 0.3.86. Toutes les versions antérieures sont affectées.

Au-delà du correctif, la remédiation des mainteneurs indique la voie. La famille héritée load_prompt est désormais formellement dépréciée et destinée à être supprimée ; elle est remplacée par les API de sérialisation dumpd / dumps / load / loads de langchain_core.load, qui n’effectuent aucune lecture de fichier et reposent sur un modèle de sécurité par liste d’autorisation. Migrer hors des chargeurs hérités supprime entièrement la primitive dangereuse, plutôt que de tenter de l’assainir.

Pour les équipes qui ne peuvent pas migrer immédiatement, traitez la configuration de prompt comme une entrée non fiable. Ne transmettez jamais à load_prompt() ou load_prompt_from_config() un dictionnaire de configuration d’origine utilisateur, réseau ou dépôt sans validation. Imposez une liste d’autorisation de répertoires de prompts permis, résolvez et canonicalisez tout chemin avant usage, et rejetez les chemins absolus et les composantes ... Comme le note Cyera, la consigne ici relève simplement des bonnes pratiques de codage sécurisé appliquées aux pipelines d’IA : valider les chemins, restreindre les frontières de répertoires, éviter la désérialisation non sûre, et préférer des interfaces paramétrées et pilotées par liste d’autorisation à celles qui interprètent des chaînes brutes influençables par l’attaquant.

Statut

ÉlémentValeur
CVECVE-2026-34070 (GHSA-qh6h-p6c9-ff54)
Affectélangchain-core, toutes versions antérieures à 1.2.22 (0.3.x avant 0.3.86)
Corrigé danslangchain-core 1.2.22 (backport 0.3.86)
FaiblesseCWE-22 Path Traversal
SévéritéCVSS 3.1 7.5 (NVD) / CVSS 4.0 8.7 (Snyk)
ImpactLecture de fichier arbitraire (.txt/.json/.yaml), confidentialité uniquement
Divulgation27 mars 2026 (Cyera « LangDrained »)
StatutCorrigé ; API héritées dépréciées pour suppression

Le correctif est publié et les API affectées étaient des interfaces héritées non documentées : l’exposition pratique se limite donc aux applications qui les appellent encore sur une configuration non fiable. Auditez votre code à la recherche des appels load_prompt, load_prompt_from_config et .save() de prompt, vérifiez votre version de langchain-core, et planifiez la migration vers langchain_core.load.

Sources