Selon un avis GitHub Security Advisory (dépôt LangChain) publié le 23 déc. 2025, une vulnérabilité critique (GHSA-c67j-w6g6-q2cm, CVE-2025-68664, CVSS 9.3) affecte les API de sérialisation/désérialisation de LangChain. Le défaut d’échappement du champ interne ’lc’ dans dumps()/dumpd() permet à des données contrôlées par un attaquant d’être interprétées comme des objets LangChain lors de load()/loads(), ouvrant la voie à l’exfiltration de secrets et à l’instanciation de classes au sein d’espaces de noms « de confiance ». ⚠️

La vulnérabilité réside dans l’absence d’échappement des dictionnaires contenant la clé ’lc’. Lorsqu’un tel contenu est désérialisé, il est traité comme un objet LangChain légitime. Exemple d’exploitation fourni: injection de {“lc”: 1, “type”: “secret”, “id”: [“OPENAI_API_KEY”]} qui, avec secrets_from_env=True (ancien défaut), charge et révèle la valeur de la variable d’environnement ciblée.

Surface d’attaque (exemples indiqués) :

  • astream_events(version=“v1”) et Runnable.astream_log() (utilisent la sérialisation vulnérable) ; v2 n’est pas concernée.
  • dumps()/dumpd() sur des données non fiables suivis de load()/loads().
  • Désérialisation directe de données non fiables via load()/loads().
  • Composants internes: RunnableWithMessageHistory, InMemoryVectorStore.load() pour documents non fiables, caches langchain-community, hub.pull (manifestes non fiables), StringRunEvaluatorChain, create_lc_store / create_kv_docstore, MultiVectorRetriever (byte stores non fiables), LangSmithRunChatLoader.
  • Vecteur courant: champs de réponse LLM (additional_kwargs, response_metadata) manipulables par injection de prompt.

Impact: exfiltration de secrets d’environnement lorsque secrets_from_env=True (ancien réglage par défaut) et instanciation de classes Serializable dans les espaces de noms autorisés (langchain_core, langchain, langchain_community) avec paramètres contrôlés, pouvant déclencher des effets de bord (appels réseau, opérations fichiers). TTPs observés: désérialisation non sécurisée/serialization injection, abus de mécanismes de chargement de secrets, prompt injection via champs LLM. IOCs: aucun indicateur d’infection spécifique fourni.

Correctifs et durcissements (changements incompatibles): correction de l’échappement dans dumps()/dumpd(); nouveaux défauts de sécurité dans load()/loads(): allowed_objects=“core” (liste d’autorisation restreinte), secrets_from_env=False par défaut, blocage Jinja2 via init_validator. Versions corrigées: langchain-core 1.2.5 et langchain 0.3.81. Crédits: signalement du bug de dumps par @YardenPorat; durcissements inspirés par @0xn3va et @VladimirEliTokarev; remédiation par eyurtsev, ccurme, mdrxy, hntrl. Type: rapport de vulnérabilité visant à décrire la faille, son impact et les correctifs publiés.

🧠 TTPs et IOCs détectés

TTP

désérialisation non sécurisée/serialization injection, abus de mécanismes de chargement de secrets, prompt injection via champs LLM

IOC

aucun indicateur d’infection spécifique fourni


🔗 Source originale : https://github.com/langchain-ai/langchain/security/advisories/GHSA-c67j-w6g6-q2cm