- شناسه CVE-2025-68664 :CVE
- CWE-502 :CWE
- yes :Advisory
- منتشر شده: دسامبر 23, 2025
- به روز شده: دسامبر 23, 2025
- امتیاز: 9.3
- نوع حمله: Serialization Injection
- اثر گذاری: Information Disclosure
- حوزه: برنامه نویسی
- برند: langchain-ai
- محصول: langchain
- وضعیتPublished :CVE
- Yes :POC
- وضعیت آسیب پذیری: patch شده
چکیده
یک آسیبپذیری بحرانی از نوع تزریق در فرآیند سریالسازی (Serialization Injection) در فریمورک LangChain شناسایی شده است که میتواند منجر به پردازش نادرست دادههای کنترلشده توسط کاربر بهعنوان آبجکت معتبر داخلی شود. این ضعف امنیتی در توابع مرتبط با سریالسازی باعث میشود دادههای غیرقابل اعتماد در مسیر اجرای قابل اعتماد برنامه قرار گیرند و پیامدهایی مانند افشای متغیرهای محیطی (Environment Variables)، سوءاستفاده از دادههای تولیدشده توسط مدلهای زبانی بزرگ(LLM) و تضعیف مرزهای امنیتی برنامههای مبتنی بر این مدلها را به همراه داشته باشند.
توضیحات
آسیبپذیری CVE-2025-68664 ناشی از ضعف در خروجیسازی امن (Escaping) دادههای کاربرکنترلشده در فرآیند سریالسازی فریمورک LangChain است و در دسته سریالزدایی دادههای غیرقابل اعتماد بدون اعتبارسنجی کافی مطابق با CWE-502 طبقهبندی میشود. این ضعف بهطور مشخص در توابع dumps() و dumpd() از بسته langchain-core وجود دارد که وظیفه سریالسازی دیکشنریها و ساختارهای دادهای را بر عهده دارند.
در LangChain، کلید داخلی lc برای نشانهگذاری آبجکت سریالسازیشده معتبر (Serialized Objects) استفاده میشود. در نسخههای آسیبپذیر، این توابع هنگام سریالسازی دیکشنریهای آزاد شکل (Free-form Dictionaries)، کلید lc را در دادههای ورودی کاربر بهدرستی ایزوله یا خروجیسازی نمیکنند. در نتیجه، اگر دادههای کنترلشده توسط کاربر حاوی این ساختار باشند، در زمان سریالزدایی از طریق توابع load() یا loads()، بهجای تفسیر بهعنوان داده معمولی، بهعنوان یک آبجکت معتبر داخلی LangChain پردازش میشوند. این عملکرد باعث میشود دادههای غیرقابل اعتماد مستقیماً وارد مسیرهای اجرایی مورد اعتماد برنامه شوند.
بهرهبرداری از این آسیبپذیری بهصورت از راه دور امکانپذیر است و مهاجم برای اجرای حمله نیازی به احراز هویت یا تعامل کاربر ندارد. رایجترین بردار حمله، تزریق پرامپت (Prompt Injection) از طریق دادههای تولیدشده توسط مدلهای زبانی بزرگ (LLM) است. در این سناریو، مهاجم میتواند ساختارهای مخرب حاوی کلید lc را در فیلدهایی مانند additional_kwargs یا response_metadata قرار دهد؛ فیلدهایی که اغلب مستقیماً از خروجی LLM دریافت میشوند و توسط برنامه بهعنوان داده قابل اعتماد پردازش میگردند.
این دادههای آلوده در مراحل مختلف پردازش داخلی LangChain، از جمله عملیات استریم رویدادها با astream_events(version=”v1″)، ثبت لاگهای جریانی با Runnable.astream_log()، مدیریت تاریخچه پیامها در RunnableWithMessageHistory، بارگذاری دادهها از LangChain Hub یا بازیابی دادهها از کشها و ذخیرهسازهای داخلی، مجدداً سریالسازی و سپس سریالزدایی میشوند. در این چرخه، داده تزریقشده مهاجم بدون هیچگونه اعتبارسنجی مؤثر، بهعنوان آبجکت معتبر داخلی پردازش میگردد.
پیامدهای این آسیبپذیری قابل توجه است. از منظر نقض شدید محرمانگی (Confidentiality)، مهاجم میتواند متغیرهای محیطی حساس از جمله کلیدهای API، توکنها و اطلاعات پیکربندی را استخراج کند؛ بهویژه در نسخههایی که گزینه secrets_from_env=True بهصورت پیشفرض فعال است. از منظر نقض محدود یکپارچگی (Integrity)، امکان تزریق ساختارهای مخرب و تأثیرگذاری بر منطق پردازش دادهها و عملکرد کامپوننتهای مبتنی بر LLM وجود دارد، هرچند گزارش مستقیمی از تخریب داده یا اختلال گسترده در سرویس ارائه نشده است.
در سناریوهای خاص، بهویژه در صورت استفاده از قالبهای Jinja2 (Jinja2 Templates)، این ضعف میتواند منجر به اجرای کد دلخواه نیز شود. دلیل این موضوع آن است که در فرآیند سریالزدایی، امکان نمونهسازی (Instantiation) کلاسهای Serializable در فضای نامهای مورد اعتماد LangChain شامل langchain_core، langchain و langchain_community وجود دارد. برخی از این کلاسها در متد سازنده (__init__) دارای اثرات جانبی هستند و میتوانند عملیاتهایی مانند برقراری اتصال شبکه، خواندن یا نوشتن فایلها و سایر تعاملات سیستمی را انجام دهند. هرچند محدودیت فضای نام مانع بارگذاری کلاسهای دلخواه خارج از این محدوده میشود، اما همچنان ریسک امنیتی قابل توجهی باقی میماند.
برای این آسیبپذیری، کد اثبات مفهومی (PoC) بهصورت عمومی منتشر شده است که نشان میدهد با تزریق ساختاری مانند{“lc”: 1, “type”: “secret”, “id”: [“OPENAI_API_KEY”]}در دادههای کاربرکنترلشده، پس از سریالسازی بدون خروجیسازی امن مناسب و سپس سریالزدایی، مقدار واقعی کلید API از متغیر محیطی استخراج و افشا میشود. این PoC نشاندهنده عملیبودن بهرهبرداری در محیطهای واقعی است.
این ضعف امنیتی در نسخههای 0.3.81 و 1.2.5 بهطور کامل پچ شده است. پچ ارائهشده علاوه بر اصلاح ضعف خروجیسازی امن کلید lc، شامل ایمنسازیهای امنیتی مهمی از جمله تغییر پیشفرض secrets_from_env به False، افزودن مکانیزم لیست مجاز (Allowlist) با پارامتر allowed_objects=”core” و مسدودسازی پیشفرض قالبهای Jinja2 از طریق init_validator است که مجموع این تغییرات، سطح حمله و ریسک سوءاستفاده را بهطور قابلتوجهی کاهش میدهد.
CVSS
| Score | Severity | Version | Vector String |
| 9.3 | CRITICAL | 3.1 | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:L/A:N |
لیست محصولات آسیب پذیر
| Versions | Product |
| affected at >= 1.0.0, < 1.2.5
affected at < 0.3.81 |
langchain |
لیست محصولات بروز شده
| Versions | Product |
| 1.2.5
0.3.81 |
langchain |
استفاده محصول در ایران
در این جدول، تعداد صفحات ایندکسشده در گوگل با دامنه .ir که langchain را ذکر کرده اند، ثبت شده است. این داده صرفاً برای برآورد تقریبی حضور محصولات در وب ایران استفاده شده و نمایانگر میزان نصب دقیق و استفاده واقعی نیست.
| Approx. Usage in .ir Domain via Google
(Total Pages) |
Search Query (Dork) | Product |
| 24,400 | site:.ir “langchain” | langchain |
نتیجه گیری
این آسیبپذیری با شدت بحرانی در فریمورک LangChain میتواند منجر به افشای اطلاعات حساس، تزریق پرامپت و در سناریوهای خاص حتی اجرای کد دلخواه شود. این ضعف امنیتی بهطور ویژه برنامههای مبتنی بر مدلهای زبانی بزرگ را که دادههای تولیدشده توسط مدل را سریالسازی یا سریالزدایی میکنند، بهصورت جدی تحت تأثیر قرار میدهد. با توجه به انتشار PoC عمومی و ارائه پچ رسمی از سوی توسعهدهندگان، اجرای اقدامات زیر برای جلوگیری از بهرهبرداری و کاهش ریسک الزامی است:
- بهروزرسانی فوری: تمام نمونههای اجرایی langchain را در اسرع وقت به نسخههای امن 3.81، 1.2.5 یا بالاتر بهروزرسانی کنید. این اقدام مؤثرترین و قطعیترین راهکار برای رفع آسیبپذیری است و باید در اولویت قرار گیرد. سایر اقدامات نقش مکمل را دارند و میتوانند به کاهش ریسک این آسیب پذیری و مقابله با حملات مشابه کمک کنند.
- محدودسازی فرآیند سریالزدایی: در فراخوانی توابع load() و loads()، پارامتر allowed_objects را بهصورت صریح و محدود (مانند مقدار پیش فرض”core” یا لیست مشخص از کلاسهای مورد اعتماد) تنظیم کنید تا فقط آبجکتهای مجاز پردازش شوند.
- غیرفعالسازی بارگذاری اطلاعات حساس از محیط: پارامتر secrets_from_env را به صورت False حفظ کنید (پیشفرض جدید) و تنها در شرایطی که دادهها کاملاً معتبر و قابل اعتماد هستند، آن را فعال کنید. این اقدام از استخراج متغیرهای محیطی حساس جلوگیری میکند
- مسدودسازی قالبهای Jinja2: مکانیزم اعتبارسنجی اولیه (init_validator) را در حالت پیشفرض فعال نگه دارید تا قالبهای Jinja2 (Jinja2 Templates) که قابلیت اجرای کد دلخواه دارند، مسدود شوند. غیرفعالسازی این کنترل تنها در صورتی توصیه میشود که منبع داده بهطور کامل مورد اعتماد باشد.
- کنترل ورودیها و خروجیهای LLM: برای کاهش ریسک تزریق پرامپت، از راهکارهایی مانند اعتبارسنجی خروجی مدل، محدودسازی فیلدهای metadata و additional_kwargs، استفاده از الگوهای طراحی امن و مدلهای مقاومتر در برابر حملات Prompt Injection استفاده کنید.
- ایزولهسازی محیط اجرا: برنامههای مبتنی بر LangChain را در محیطهای ایزوله مانند کانتینرهای داکر (Docker Containers) یا زیرساختهای مشابه اجرا کرده و اصل حداقل دسترسی را برای مجوزهای سیستمعامل و شبکه اعمال کنید تا تأثیر احتمالی بهرهبرداری به حداقل برسد.
- نظارت و ثبت لاگ پیشرفته: فعالیتهای مرتبط با سریالسازی و سریالزدایی، خطاهای غیرعادی و دسترسی به متغیرهای محیطی را بهصورت مداوم نظارت کنید و از سامانههای تشخیص نفوذ (IDS) برای شناسایی الگوهای مشکوک استفاده نمایید.
- تست امنیتی دورهای: کدهای مرتبط با فرآیند سریالسازی را بهصورت منظم بازبینی کرده، تست نفوذ انجام دهید و از ابزارهای تحلیل وابستگی و اسکن آسیبپذیری مانند Snyk یا Dependabot برای شناسایی حملات مشابه استفاده کنید.
- مدیریت اعتبارها: در صورت وجود احتمال بهرهبرداری، تمامی کلیدهای API، توکنها و متغیرهای محیطی مرتبط را تغییر داده و فرآیند بازنشانی اعتبارها (Credential Rotation) را اجرا کنید.
اعمال سریع بهروزرسانیهای امنیتی و پیادهسازی پیکربندیهای سختگیرانه در فرآیند سریالسازی و سریالزدایی، ریسک این آسیبپذیری بحرانی را بهطور چشمگیری کاهش داده و سطح امنیت برنامههای مبتنی بر هوش مصنوعی و LLM را بهصورت قابل توجهی افزایش میدهد.
امکان استفاده در تاکتیک های Mitre Attack (در زمان اجرای حمله )
Initial Access (TA0001)
در سناریوی بهرهبرداری از CVE-2025-68664، دسترسی اولیه از طریق ورود دادههای کاربرکنترلشده به چرخه پردازش LangChain شکل میگیرد، بدون آنکه نیاز به نفوذ کلاسیک یا احراز هویت وجود داشته باشد. شرط کلیدی این مرحله آن است که برنامه دادههایی را که مستقیماً یا غیرمستقیم از کاربر یا خروجی LLM دریافت میشوند، در توابع dumps() یا dumpd() پردازش کند و سپس در ادامه مسیر از load() یا loads() برای بازیابی آنها استفاده نماید. نبود ایزولهسازی مناسب کلیدهای رزروشده داخلی مانند lc باعث میشود داده ظاهراً عادی بهعنوان آبجکت معتبر داخلی پذیرفته شود و نقطه ورود حمله بدون جلب توجه ایجاد گردد.
Execution (TA0002)
اجرای حمله زمانی رخ میدهد که داده تزریقشده، پس از سریالسازی ناقص، در فرآیند سریالزدایی بهصورت فعال تفسیر شود. در این مرحله، شرط لازم آن است که برنامه از مکانیزمهای پیشفرض LangChain برای بازسازی آبجکتها استفاده کند و محدودسازی allowlist یا غیرفعالسازی رفتارهای پرریسک اعمال نشده باشد. در چنین شرایطی، منطق داخلی فریمورک داده مهاجم را بهعنوان ساختار اجرایی معتبر میپذیرد و عملیات حساس، مانند دسترسی به منابع داخلی یا متغیرهای محیطی، در بستر قابل اعتماد برنامه انجام میشود.
Credential Access (TA0006)
این آسیبپذیری بهطور طبیعی میتواند در تاکتیک دسترسی به اطلاعات حساس مورد استفاده قرار گیرد، مشروط بر اینکه برنامه از استخراج رمزها از متغیرهای محیطی پشتیبانی کند. زمانی که گزینههایی مانند secrets_from_env فعال باشند یا دادههای سریالزداییشده امکان ارجاع به شناسههای محرمانه را داشته باشند، مهاجم قادر است بدون تعامل مستقیم با سیستمعامل، مقادیر حساس را در قالب خروجیهای منطقی برنامه دریافت کند. این فرآیند در ظاهر یک عملیات عادی پردازش داده است، اما در عمل منجر به افشای اطلاعات حیاتی میشود.
Discovery (TA0007)
در جریان حمله، مهاجم میتواند از پاسخها و دادههای بازگشتی برای درک بهتر ساختار داخلی برنامه استفاده کند. شرط تحقق این تاکتیک آن است که خروجیهای LangChain یا لاگهای تولیدشده بهطور مستقیم یا غیرمستقیم در دسترس قرار گیرند. تفاوت در نحوه پردازش دادههای خاص، خطاهای غیرمنتظره یا محتوای غنیتر از حد انتظار، میتواند به مهاجم نشانههایی درباره نسخه فریمورک، تنظیمات امنیتی فعال و دامنه آبجکتهای قابل سریالزدایی ارائه دهد.
Impact (TA0040)
پیامد نهایی بهرهبرداری ازاین اسیب پذیری عمدتاً در حوزه نقض محرمانگی و تضعیف مرزهای اعتماد برنامه بروز میکند. افشای متغیرهای محیطی، کلیدهای API یا دادههای پیکربندی میتواند زنجیرهای از سوءاستفادههای بعدی را ممکن سازد و امنیت کل سامانههای مبتنی بر LLM را زیر سؤال ببرد. علاوه بر این، ورود دادههای غیرقابل اعتماد به مسیرهای اجرایی قابل اعتماد، انسجام منطقی برنامه را مخدوش کرده و ریسک تصمیمگیری نادرست، نشت اطلاعات ثانویه و کاهش اعتماد به خروجیهای سیستم هوشمند را به همراه دارد، حتی اگر در ظاهر اختلال مستقیمی در دسترسپذیری سرویس مشاهده نشود.
منابع
- https://www.cve.org/CVERecord?id=CVE-2025-68664
- https://www.cvedetails.com/cve/CVE-2025-68664/
- https://github.com/langchain-ai/langchain/security/advisories/GHSA-c67j-w6g6-q2cm
- https://vulmon.com/vulnerabilitydetails?qid=CVE-2025-68664
- https://vuldb.com/?id.337902
- https://github.com/Ak-cybe/CVE-2025-68664-LangGrinch-PoC
- https://github.com/langchain-ai/langchain/pull/34455
- https://github.com/langchain-ai/langchain/pull/34458
- https://github.com/langchain-ai/langchain/commit/5ec0fa69de31bbe3d76e4cf9cd65a6accb8466c8
- https://github.com/langchain-ai/langchain/commit/d9ec4c5cc78960abd37da79b0250f5642e6f0ce6
- https://github.com/langchain-ai/langchain/releases/tag/langchain-core%3D%3D0.3.81
- https://github.com/langchain-ai/langchain/releases/tag/langchain-core%3D%3D1.2.5
- https://nvd.nist.gov/vuln/detail/CVE-2025-68664
- https://cwe.mitre.org/data/definitions/502.html