LangChain CVE-2025-68664: كيف تتسرب البيانات الشخصية عبر مسار RAG الخاص بك
محدَّث لعام 2026.
aكتُشفت ثغرة أمنية حرجة في LangChain في أواخر عام 2025. رمز CVE هو CVE-2025-68664. درجة CVSS هي 9.3 (حرجة).
تستهدف الثغرة كود التسلسل في LangChain.
ما الذي يفعله CVE-2025-68664؟
تمتلك LangChain دالتَي تسلسل: dumps() وdumpd(). تحوّلان كائنات Python إلى نص.
الثغرة في معالجة الإغلاق (closure).
عندما تُسلسِل LangChain عنصراً قابلاً للاستدعاء، تلتقط سياق الإغلاق.
يمكن للمهاجم الذي يتحكم في استجابة نموذج اللغة الكبير تشغيل dumps(). ثم تقرأ الدالة متغيرات البيئة من عملية Python.
النتيجة كشف بيانات. مفاتيح API وسلاسل قواعد البيانات وأسرار JWT وبيانات اعتماد AWS يمكن أن تظهر في مخرجات النموذج.
مهاجم يحقن نصاً في مستند مصدر RAG يمكنه قراءة أسرار الإنتاج الخاصة بك.
الإصدارات المتأثرة: LangChain أقل من 0.3.22 (Python). الإصدار 0.3.22 يحتوي على الإصلاح.
تُظهر بيانات PyPI الاستخدام الواسع للإصدارات الأقدم حتى مارس 2026.
كيف تتسرب البيانات الشخصية في مسارات RAG
CVE-2025-68664 حالة مثيرة للاهتمام. لكنها مجرد حالة واحدة لمشكلة أشمل.
تتسرب البيانات عبر مسارات RAG بشكل روتيني. لا يحتاج الأمر لمهاجم.
إليك إعداد RAG نموذجي في المؤسسات.
أولاً، الاستيعاب. تُفهرِس وثائق الشركة في مخزن متجهات. تخيّل تذاكر الدعم ورسائل العملاء والعقود وسجلات الموارد البشرية.
من أشهر مخازن المتجهات: Pinecone وWeaviate وpgvector.
ثم الاسترداد. يطرح المستخدم سؤالاً. يسحب النظام الخمسة مقاطع الأكثر صلة من المخزن.
ثم التوليد. تذهب تلك المقاطع إلى نموذج لغة كبير — GPT-4o أو Claude أو Gemini — كسياق.
الخطوة الثانية هي المشكلة. المقاطع المستردة تحتوي على ما احتوته المستندات المصدر. يشمل ذلك:
- أسماء العملاء وعناوين بريدهم الإلكتروني وأرقام هواتفهم
- قيم العقود وأرقام الحسابات والمعرفات الضريبية
- بيانات رواتب الموظفين وملاحظات مراجعات الأداء
- أسماء المرضى في الملاحظات السريرية
- أرقام الهوية الوطنية في ملفات الهجرة
تذهب هذه البيانات إلى نموذج اللغة الكبير كما هي. يمكن أن تظهر في مخرجات النموذج.
تُسجَّل من قِبل مزود نموذج اللغة الكبير. تجلس في سجل محادثاتك. تتدفق إلى منظومة المراقبة لديك.
لا هجوم مطلوب. هكذا يعمل RAG بتصميمه. التصميم يخلق خطراً حقيقياً على الخصوصية.
68 نمطاً للأسرار في مخازن وثائق المؤسسات
تتتبع أدوات الأمان 68 نمطاً معروفاً للأسرار. تظهر في مخازن الوثائق أكثر مما تتوقع الفرق.
إليك الأكثر شيوعاً:
- معرفات مفتاح الوصول لـ AWS (
AKIA...) - مفاتيح OpenAI API (
sk-...) - مفاتيح Anthropic API (
sk-ant-...) - عناوين URI لقواعد البيانات (
postgresql://user:password@host/db) - رموز JWT (رؤوس مشفرة بـ base64)
- رموز الوصول الشخصية لـ GitHub
- المفاتيح السرية لـ Stripe (
sk_live_...) - مفاتيح SendGrid API
- معرفات حساب Twilio ورموز المصادقة
- كتل PEM للمفاتيح الخاصة
قد تحتوي تذكرة دعم على مفتاح API للعميل من جلسة تصحيح أخطاء.
قد يتضمن عقد بيانات اعتماد قاعدة بيانات من تسليم تقني.
ملف إعداد مُفهرَس بالخطأ يمكنه كشف مخزن أسرار بأكمله.
عندما تدخل هذه الملفات مخزن المتجهات دون تنقية، يمكن لكل استعلام إرسال الأسرار إلى نموذج اللغة الكبير.
قد تصل إلى المستخدم النهائي أيضاً.
الإصلاح: إخفاء الهوية قبل التضمين
النهج الصحيح يُخفي هوية الوثائق قبل التقسيم والتضمين.
هذه الخطوة مطلوبة لأي نظام يتعامل مع بيانات العملاء.
إليك مثال بـ Python باستخدام anonym.legal API:
import requests
import os
ANONYM_API_KEY = os.environ["ANONYM_API_KEY"]
ANONYM_BASE_URL = "https://anonym.legal/api"
def anonymize_before_embedding(text: str) -> tuple[str, dict]:
"""إخفاء هوية البيانات الشخصية قبل التضمين."""
response = requests.post(
f"{ANONYM_BASE_URL}/presidio/anonymize",
json={
"text": text,
"language": "en",
"anonymizers": {
"DEFAULT": {"type": "replace", "new_value": "[REDACTED]"},
"PERSON": {"type": "mask", "masking_char": "*", "chars_to_mask": 4, "from_end": False},
"EMAIL_ADDRESS": {"type": "replace", "new_value": "[EMAIL]"},
"PHONE_NUMBER": {"type": "replace", "new_value": "[PHONE]"},
"CRYPTO": {"type": "replace", "new_value": "[SECRET]"},
"URL": {"type": "keep"},
}
},
headers={"Authorization": f"Bearer {ANONYM_API_KEY}"}
)
result = response.json()
return result["text"], result.get("items", [])
def build_rag_index(documents: list[str], vectorstore):
"""بناء فهرس RAG بوثائق نظيفة فقط."""
anonymized_docs = []
for doc in documents:
clean_text, entities = anonymize_before_embedding(doc)
anonymized_docs.append(clean_text)
print(f"تمت إزالة {len(entities)} كيانات PII من الوثيقة")
vectorstore.add_texts(anonymized_docs)
تغطي anonym.legal API أكثر من 285 نوعاً من الكيانات. تُكتشف الأسماء والبريد الإلكتروني وأرقام الهاتف والمعرفات الوطنية ومفاتيح API وعناوين URI لقواعد البيانات.
لا شيء حساس يصل إلى مخزن المتجهات. إذن لا شيء حساس يمكن أن يتسرب إلى المستخدمين.
راجع دليل المطورين للاطلاع على أنماط الإعداد مع LangChain وLlamaIndex.
إصلاح CVE-2025-68664 الآن
إذا كنت تشغّل LangChain أقل من 0.3.22، حدّث الآن:
pip install "langchain>=0.3.22" "langchain-core>=0.3.22"
بعد التصحيح، تحقق من إعدادات سلاسلك بحثاً عن خطر الحقن. إليك ثلاث خطوات.
أولاً، تحقق من المقاطع المستردة. افعل ذلك قبل وصولها إلى نموذج اللغة الكبير.
جرِّد المحتوى المطابق لأنماط الحقن مثل ignore previous instructions أو system: أو <INST>.
ثانياً، أخفِ الهوية قبل التضمين. هذا يُقلّص سطح الهجوم.
إذا وقع الحقن، البيانات الحساسة ليست موجودة للاستخراج.
ثالثاً، قيِّد صلاحيات السلسلة. لا ينبغي لسلاسل LangChain قراءة متغيرات البيئة إلا في حدود ما تحتاجه.
استخدم حساب خدمة بصلاحيات محدودة.
الحساب بسيط
درجة CVSS هي 9.3. الإصلاح هو استدعاء API واحد لكل وثيقة.
مجموع CVE-2025-68664 وخطر بيانات RAG العام يمثل مسؤولية حقيقية.
الحل واضح: أخفِ الهوية عند الاستيعاب، لا عند الاستعلام.
تحقق من نظرة عامة على الأمان والامتثال لمتطلبات RAG على مستوى المؤسسة.
المصادر
- NVD CVE-2025-68664، CVSS 9.3، ثغرة تسلسل LangChain
- تحذير أمني من LangChain، langchain-ai/langchain على GitHub، 2025
- OWASP LLM Top 10: LLM01 حقن الأوامر، LLM06 الكشف عن معلومات حساسة
- وثائق أنواع الكيانات في anonym.legal — أكثر من 285 نوعاً مدعوماً