Un framework de test pour identifier et démontrer les vulnérabilités de désérialisation dans LangChain Core (<0.3.81). Usage éducatif uniquement.
LangGrinch-PoC/ │ ├── README.md # Main documentation & writeup ├── PAYLOADS.md # Complete payload arsenal (55+) ├── langgrinch_fuzzer.py # Python payload generator & tester ├── requirements.txt # Python dependencies └── LICENSE # MIT License
## 🚀 Démarrage rapide
### Installation```bash
# Clone the repository
git clone https://github.com/Ak-cybe/LangGrinch-PoC.git
cd LangGrinch-PoC
# Install dependencies
pip install -r requirements.txt
python langgrinch_fuzzer.py --list
python langgrinch_fuzzer.py --category recon python langgrinch_fuzzer.py --category ssrf python langgrinch_fuzzer.py --category rce
python langgrinch_fuzzer.py --secret MY_API_KEY
python langgrinch_fuzzer.py --ssrf http://your-webhook.com/
python langgrinch_fuzzer.py --export payloads.json
---
<p align="center">
<img src="https://assets.kitploit.com/production/public/readmes/15055/a59cc259070b0a6930250b423ecf6befeab7fd75694091738ff5f8d2899b56ad.gif" width="200" alt="GIF Hacker"/>
<img src="https://assets.kitploit.com/production/public/readmes/15055/0751965da24039c9facbe6006461ec38a66ff560b42dc590d1964f43f7f9853d.gif" width="200" alt="GIF Sécurité"/>
GIF Matrix
</p>
---
## 🎯 Résumé Exécutif
**CVE-2025-68664 (Nom de code : LangGrinch)** est une **vulnérabilité critique d'injection de sérialisation** découverte dans le package Python **LangChain Core**. Cette vulnérabilité permet aux attaquants d'injecter des marqueurs `lc` malveillants via les sorties des LLM ou des dictionnaires contrôlés par l'utilisateur, permettant :
1. 🔑 **Extraction de secrets d'environnement** (clés API, mots de passe de base de données)
2. 🌐 **Attaques SSRF** (ciblant les services internes)
3. 💀 **Exécution de code à distance** (via la chaîne SSTI Jinja2)
4. 📂 **Accès au système de fichiers** (lecture de fichiers sensibles)
<table align="center">
<tr>
<td>
### ⚡ Statistiques rapides
| 🔥 Métrique | 📊 Valeur |
|-----------|----------|
| **CVE ID** | CVE-2025-68664 |
| **Nom de code** | LangGrinch |
| **Type d'attaque** | Injection de désérialisation |
| **Authentification requise** | Non (Injection par invite) |
| **Complexité** | FAIBLE |
</td>
<td>
### 🎯 Versions affectées
| 📌 Propriété | 📝 Valeur |
|-------------|----------|
| **Package** | langchain-core |
| **Vulnérable** | < 0.3.81, >= 1.0.0 < 1.2.5 |
| **Corrigé** | 0.3.81+, 1.2.5+ |
| **Impact** | Secrets + RCE |
| **CWE** | CWE-502 |
</td>
</tr>
</table>
---
## 🐛 Plongée technique dans la vulnérabilité
<p align="center">
<img src="https://assets.kitploit.com/production/public/readmes/15055/fb07ef9946fd69ee29be7a85737fa8b18fa02c8ec40293de8a4994d5e8419a6a.gif" width="300" alt="GIF Bogue"/>
</p>
### 📋 Aperçu technique
| Propriété | Valeur |
|----------|-------|
| 🆔 **CVE ID** | CVE-2025-68664 |
| 🏷️ **Nom de code** | LangGrinch |
| 📊 **Gravité** | CRITIQUE 🔴 |
| 🔗 **CWE** | CWE-502 (Désérialisation de données non fiables) |
| 📦 **Package affecté** | `langchain-core` |
| ⚠️ **Versions vulnérables** | `< 0.3.81` ET `>= 1.0.0, < 1.2.5` |
| ✅ **Versions corrigées** | `0.3.81+`, `1.2.5+` |
### 🤖 Qu'est-ce que LangChain ?
LangChain est un framework Python populaire utilisé pour construire des applications avec **Grands Modèles de Langage (LLM)**. Il est largement déployé dans diverses industries :
| 🏢 Cas d'utilisation | 📝 Description |
|-------------|----------------|
| 🤖 **Chatbots IA** | Service client, agents de support |
| 🔍 **Systèmes RAG** | Génération augmentée par récupération |
| 🔧 **Agents IA** | Exécution autonome de tâches |
| 📊 **Traitement de données** | Analyse de documents, résumé |
| 🔄 **Automatisation de flux de travail** | Pipelines alimentés par IA |
### 🔧 Cause racine technique
Le format de sérialisation interne de LangChain utilise un marqueur spécial - la **clé `lc`**. Lorsqu'un dictionnaire contient la clé `lc`, le désérialiseur de LangChain le traite comme un "objet sérialisé de confiance de LangChain".
**Le bogue est :**
- Les fonctions `dumps()` / `dumpd()` n'échappent/ne neutralisent PAS la clé `lc` dans les dictionnaires contrôlés par l'utilisateur ou le LLM
- Lors de la réhydratation via `load()` / `loads()`, la structure injectée est traitée comme un **objet interne**```
🔓 VULNERABILITY CHAIN:
┌─────────────────────────────────────────────────────────────────┐
│ 📝 User/LLM Input → Dictionary with malicious "lc" marker │
│ ↓ │
│ 💾 Application serializes data (dumps/dumpd) │
│ ↓ │
│ ⚠️ "lc" key NOT escaped - remains in serialized form │
│ ↓ │
│ 🔄 Later: Data deserialized (load/loads) │
│ ↓ │
│ 🎯 Deserializer sees "lc" → Treats as LangChain object! │
│ ↓ │
│ 💀 Secret resolution / Object instantiation triggered │
│ ↓ │
│ 💥 SECRETS LEAKED / SSRF / RCE │
└─────────────────────────────────────────────────────────────────┘