LangChain CVE-2025-68664: چگونه اطلاعات شخصی از Pipeline RAG شما نشت میکند
بهروزشده برای ۲۰۲۶.
یک نقص حیاتی در اواخر ۲۰۲۵ در LangChain پیدا شد. CVE آن CVE-2025-68664 است. امتیاز CVSS آن 9.3 (حیاتی) است.
کد سریالسازی LangChain را هدف قرار میدهد.
CVE-2025-68664 چه میکند
LangChain دو تابع سریالسازی دارد: `dumps()` و `dumpd()`. آنها اشیاء Python را به متن تبدیل میکنند.
نقص در مدیریت closure است.
وقتی LangChain یک callable را سریالسازی میکند، context closure را میگیرد.
مهاجمی که پاسخ LLM را کنترل میکند میتواند `dumps()` را فعال کند. سپس تابع متغیرهای محیطی را از فرآیند Python میخواند.
نتیجه افشای داده است. کلیدهای API، رشتههای پایگاه داده، رمزهای JWT، و اعتبارنامههای AWS میتوانند در خروجی مدل ظاهر شوند.
مهاجمی که متن را در یک سند منبع RAG تزریق میکند میتواند رمزهای تولید شما را بخواند.
نسخههای آسیبپذیر: LangChain زیر 0.3.22 (Python). نسخه 0.3.22 رفع شده است.
دادههای PyPI نشان میدهد استفاده گسترده از نسخههای قدیمی تا مارس ۲۰۲۶ ادامه داشت.
چگونه اطلاعات شخصی در Pipelineهای RAG نشت میکند
CVE-2025-68664 چشمگیر است. اما تنها یک مورد از یک مشکل گستردهتر است.
دادهها به طور معمول از pipelineهای RAG نشت میکنند. هیچ مهاجمی نیاز نیست.
اینجا یک تنظیم RAG سازمانی استاندارد است.
اول، جذب. اسناد شرکت را در یک ذخیره برداری ایندکس میکنید. به تیکتهای پشتیبانی، ایمیلهای مشتری، قراردادها، و رکوردهای HR فکر کنید.
ذخیرههای برداری رایج Pinecone، Weaviate، و pgvector هستند.
بعد، بازیابی. کاربر سوالی میپرسد. سیستم پنج chunk مرتبطترین را از ذخیره بازیابی میکند.
سپس، تولید. آن chunkها به عنوان context به یک LLM — GPT-4o، Claude، یا Gemini — میروند.
مرحله دوم مشکل است. chunkهای بازیابیشده هر آنچه اسناد منبع داشتند را نگه میدارند. این شامل:
- نام مشتریان، آدرسهای ایمیل، و شمارههای تلفن
- ارزشهای قرارداد، شمارههای حساب، و شناسههای مالیاتی
- دادههای حقوق کارمندان و یادداشتهای ارزیابی عملکرد
- نام بیماران در یادداشتهای بالینی
- شمارههای هویت ملی در پروندههای مهاجرت
آن دادهها به همان شکل به LLM میروند. میتوانند در خروجی مدل ظاهر شوند.
توسط ارائهدهنده LLM لاگ میشوند. در تاریخچه مکالمه شما قرار میگیرند. به stack مشاهدهپذیری شما جریان مییابند.
هیچ حملهای نیاز نیست. این نحوه کار RAG بر اساس طراحی است. طراحی خطر حریم خصوصی واقعی ایجاد میکند.
۶۸ الگوی رمز در ذخیرههای اسناد سازمانی
ابزارهای امنیتی ۶۸ الگوی رمز شناختهشده را ردیابی میکنند. بیشتر از آنچه تیمها انتظار دارند ظاهر میشوند.
رایجترینها اینجا هستند:
- شناسههای کلید دسترسی AWS (`AKIA...`)
- کلیدهای OpenAI API (`sk-...`)
- کلیدهای Anthropic API (`sk-ant-...`)
- URIهای پایگاه داده (`postgresql://user:password@host/db`)
- توکنهای JWT (headerهای کدگذاریشده با base64)
- توکنهای دسترسی شخصی GitHub
- کلیدهای مخفی Stripe (`sk_live_...`)
- کلیدهای SendGrid API
- SIDهای حساب Twilio و توکنهای احراز هویت
- بلوکهای PEM کلید خصوصی
یک تیکت پشتیبانی ممکن است یک کلید API مشتری از یک جلسه دیباگ داشته باشد.
یک قرارداد ممکن است اعتبارنامههای پایگاه داده از یک تحویل فنی داشته باشد.
یک فایل پیکربندی که به اشتباه ایندکس شده میتواند یک کل ذخیره رمز را افشا کند.
وقتی این فایلها بدون پاکسازی وارد یک ذخیره برداری میشوند، هر کوئری میتواند رمزها را به LLM منتقل کند.
ممکن است به کاربر نهایی هم برسند.
رفع مشکل: ناشناسسازی قبل از embedding
رویکرد صحیح اسناد را قبل از chunk و embedding ناشناس میکند.
این مرحله برای هر سیستمی که دادههای مشتری را مدیریت میکند الزامی است.
اینجا یک مثال Python با استفاده از anonym.legal API است:
```python 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]: """Anonymize PII before embedding.""" 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): """Build a RAG index with clean documents only.""" anonymized_docs = [] for doc in documents: clean_text, entities = anonymize_before_embedding(doc) anonymized_docs.append(clean_text) print(f"Removed {len(entities)} PII entities from document") vectorstore.add_texts(anonymized_docs) ```
anonym.legal API بیش از ۲۸۵ نوع موجودیت را پوشش میدهد. نامها، ایمیلها، شمارههای تلفن، شناسههای ملی، کلیدهای API، و URIهای پایگاه داده همه گرفته میشوند.
هیچ چیز حساسی به ذخیره برداری نمیرسد. پس هیچ چیز حساسی نمیتواند به کاربران نشت کند.
برای الگوهای تنظیم LangChain و LlamaIndex، راهنمای توسعهدهنده را ببینید.
CVE-2025-68664 را همین الان رفع کنید
اگر LangChain زیر 0.3.22 اجرا میکنید، همین الان بهروز کنید:
```bash pip install "langchain>=0.3.22" "langchain-core>=0.3.22" ```
بعد از پچ، تنظیمات chain خود را برای خطر تزریق بررسی کنید. اینجا سه مرحله وجود دارد.
اول، chunkهای بازیابیشده را اعتبارسنجی کنید. این را قبل از رسیدن به LLM انجام دهید.
محتوایی را که با الگوهای تزریق مطابقت دارد، مانند `ignore previous instructions`، `system:`، یا `<INST>` پاک کنید.
دوم، قبل از embedding ناشناسسازی کنید. این سطح حمله را کاهش میدهد.
اگر تزریق اتفاق بیفتد، دادههای حساس دیگر برای استخراج وجود ندارند.
سوم، دسترسیهای chain را محدود کنید. Chainهای LangChain نباید متغیرهای محیطی فراتر از آنچه نیاز دارند بخوانند.
از یک حساب سرویس با حداقل دسترسی استفاده کنید.
ریاضیات ساده است
امتیاز CVSS 9.3 است. رفع مشکل یک فراخوانی API برای هر سند است.
ترکیب CVE-2025-68664 و خطر کلی داده RAG یک مسئولیت واقعی است.
راهحل روشن است: در زمان جذب ناشناسسازی کنید، نه در زمان کوئری.
برای الزامات RAG سازمانی، مرور امنیت و انطباق را بررسی کنید.
منابع
- NVD CVE-2025-68664، CVSS 9.3، آسیبپذیری سریالسازی LangChain
- مشاوره امنیتی LangChain، langchain-ai/langchain GitHub، ۲۰۲۵
- OWASP LLM Top 10: LLM01 Prompt Injection، LLM06 Sensitive Information Disclosure
- مستندات نوع موجودیت anonym.legal — بیش از ۲۸۵ نوع موجودیت پشتیبانیشده