باگهای خطرناک LangGraph: از SQL Injection تا اجرای کد از راه دور
خلاصهٔ کاملتر
به گفتهی یاردن پورات، محقق Check Point Research، فریمورک متنباز LangGraph -که برای ساخت ایجنتهای هوش مصنوعی چندمرحلهای به کار میره و بیش از ۵۰ میلیون دانلود ماهانه داره- سه تا آسیبپذیری جدی تو لایهی ذخیرهسازی وضعیتش داره. این لایه رو checkpointer میگن؛ وضعیت هر مرحلهی اجرا رو ذخیره میکنه تا ایجنت حافظه داشته باشه.
باگ اول با شناسهی CVE-2025-67644 یه SQL Injection تو چکپوینتر SQLite بود. تابع list() یه پارامتر به اسم filter میگیره که برای فیلتر کردن چکپوینتها بر اساس متادیتاشون استفاده میشه، ولی کلیدهای این دیکشنری بدون پاکسازی مستقیم وارد کوئری SQL میشن:
predicates.append(
f"json_extract(CAST(metadata AS TEXT), '$.{query_key}') {operator}"
)با این کار یه مهاجم میتونه با گذاشتن یه کلید خاص تو filter، از رشتهی JSON path فرار کنه و کد SQL دلخواه خودشو تزریق کنه.
نکتهی جالب اینجاست که همین SQL Injection مستقیم به اجرای کد ختم نمیشه، باید با یه باگ دوم ترکیب بشه. نتیجهی کوئری list() شامل ستون checkpoint هم میشه که محتواش موقع خوندن دیسریالایز میشه. مهاجم با تزریق یه کوئری ترکیبی از نوع UNION میتونه یه ردیف جعلی به نتیجهی کوئری اضافه کنه که ستون checkpointش حاوی دادهی سریالایزشدهی دلخواه خودش باشه؛ همین که این ردیف پردازش بشه، دادهی مخربش دیسریالایز میشه.
باگ دوم، دیسریالایز ناامن با شناسهی CVE-2026-28277، تو نحوهی خوندن فرمت msgpack بود. LangGraph برای این فرمت یه تابع افزونهی سفارشی به اسم _msgpack_ext_hook تعریف کرده که وقتی یه کد افزونهی خاص بهش برسه، این خط رو اجرا میکنه:
return getattr(importlib.import_module(tup[0]), tup[1])(tup[2])یعنی اسم ماژول، اسم تابع و آرگومان، هر سه از دیتای دیسریالایزشده میان؛ اگه مهاجم بتونه این دیتا رو کنترل کنه میتونه هر تابعی از هر ماژولی رو با هر آرگومانی صدا بزنه - مثلاً os.system() رو با یه دستور دلخواه - و همینه که اجرای کد از راه دور رو ممکن میکنه.
این دو باگ با هم یه زنجیرهی کامل میسازن: اگه یه اپ تابع get_state_history() رو با پارامتر filter گرفتهشده از ورودی کاربر در دسترس بذاره، مهاجم اول با SQL Injection یه چکپوینت جعلی تزریق میکنه و بعد با تریگر دیسریالایز، کد دلخواهش رو روی سرور اجرا میکنه. این ریسک فقط اونایی رو تهدید میکنه که خودشون LangGraph رو با SQLite یا Redis میزبانی میکنن؛ سرویس ابری LangSmith Deployment (همون LangGraph Platform سابق) روی PostgreSQL میچرخه و آسیبپذیر نیست.
یه نمونهی موازی از همین کلاس آسیبپذیری، با شناسهی CVE-2026-27022، تو چکپوینتر Redis هم پیدا شده: کلیدهای دیکشنری filter بدون پاکسازی مستقیم تو کوئری جاگذاری میشن، دقیقاً مثل نسخهی SQLite. تیم Check Point تو بررسیهای بیشترشون چندتا مشکل دیگه هم تو مدیریت پارامترهای عددی مثل LIMIT و ttl پیدا کردن که چون پایتون تایپ رو در زمان اجرا چک نمیکنه، امکان تزریق رشتهی مخرب به جای عدد وجود داشت؛ اینها هم با کوئریهای پارامتریشده اصلاح شدن.
تیم LangChain به سرعت واکنش نشون داد: CVE-2025-67644 تو نسخهی langgraph-checkpoint-sqlite 3.0.1، CVE-2026-27022 تو langgraph-checkpoint-redis 1.0.2، و CVE-2026-28277 تو langgraph-checkpoint 4.0.1 پچ شدن. کاربرایی که خودشون LangGraph رو با SQLite یا Redis اجرا میکنن باید هر چه زودتر به langgraph 1.0.10+ و نسخههای پچشدهی چکپوینترها آپدیت کنن. طبق گفتهی Check Point، محققهای امنیتی دیگهای هم مستقل از این تیم، دوتا از این سه باگ رو کشف کرده بودن.
نکات کلیدی:
- LangGraph یه فریمورک محبوب برای ساخت ایجنتهای هوش مصنوعیه با بیش از ۵۰ میلیون دانلود ماهانه
- SQL Injection تو چکپوینتر SQLite (CVE-2025-67644) با دیسریالایز ناامن msgpack (CVE-2026-28277) ترکیب میشه و به اجرای کد از راه دور میرسه
- باگ مشابهی هم تو چکپوینتر Redis پیدا شده (CVE-2026-27022)
- فقط اپلیکیشنهایی که خودشون SQLite یا Redis رو میزبانی میکنن و پارامتر filter رو از کاربر میگیرن در خطرن؛ سرویس ابری LangSmith Deployment آسیبپذیر نیست
- هر سه باگ پچ شده؛ باید به langgraph 1.0.10+ و نسخههای پچشدهی چکپوینترها آپدیت کرد




