
إثبات مفهوم لاستغلال CVE-2025-67644، وهي ثغرة حقن SQL في LangGraph SQLite Checkpoint. يوضح حقن SQL تعسفي عبر مفاتيح تصفية بيانات وصفية غير معقّمة، مما يتيح استخراج البيانات وتجاوز عوامل التصفية.
CVE-2025-67644 هي ثغرة حقن SQL (CWE-89) في حزمة langgraph-checkpoint-sqlite (جزء من النظام البيئي LangGraph / LangChain).
تتيح للمهاجم حقن SQL اعتباطي عبر مفاتيح مرشح البيانات الوصفية غير المعقَّمة التي تُمرَّر إلى طريقتي list() / في .
alist()SqliteSaverالأثر: تجاوز كامل للمرشحات، وتسريب جميع سجلات نقاط التحقق (بما في ذلك حالة المحادثة الحساسة المحتملة، ومعرفات الخيوط، والبيانات الوصفية)، وفي بعض سيناريوهات النشر — وصول أوسع إلى قاعدة البيانات.
الإصدارات المتأثرة: < 3.0.1
تم الإصلاح في: ≥ 3.0.1
درجة CVSS: 7.3 (عالية) — AV:L / AC:L / PR:L / UI:N / S:C / C:H / I:L / A:N
يستخدم منطق _metadata_predicate() الداخلي استيفاءً غير آمن لسلاسل f لمفاتيح القاموس التي يتحكم فيها المستخدم داخل تعبير استخراج JSON:
f"json_extract(CAST(metadata AS TEXT), '$.{query_key}')"
يمكن للمهاجم الذي يستطيع توفير مفاتيح اعتباطية (مثلًا عبر مدخلات API) إغلاق مسار JSON مبكرًا وحقن أجزاء SQL، مثل:
{"env') OR '1'='1": "anything"}
→ ينتج عن ذلك شرط WHERE يُقيَّم دائمًا على أنه صحيح → يعيد جميع السجلات.
flowchart TD
A["User / API Client"] -->|"Sends malicious filter dict"| B["Application using langgraph-checkpoint-sqlite"]
B -->|"Passes filter=..."| C["SqliteSaver.list method"]
C -->|"Unsafe key interpolation"| D["Metadata predicate logic"]
D -->|"Builds injectable SQL"| E["SQLite Engine"]
E -->|"Returns ALL checkpoints / sensitive data"| F[Attacker]
F -->|"Data exfiltration / authorization bypass"| G["Impact achieved"](يتجنب هذا الإصدار الأقواس في نص العقدة حيثما أمكن ويستخدم علامات اقتباس حول التسميات ذات الأحرف/النقاط الخاصة لمنع أخطاء التحليل.)
--dump-all (عرض السجلات الكاملة)، --threads-only (استخراج thread_ids فقط)pip install langgraph-checkpoint-sqlite"<3.0.1" # e.g. ==2.0.0
# Basic check (count only)
python3 exploit.py checkpoints.db
# Dump full checkpoint details
python3 exploit.py checkpoints.db --dump-all
# Extract thread_ids only (useful for enumeration)
python3 exploit.py checkpoints.db --threads-only --dump-all
# Test against in-memory database (quick & volatile)
python3 exploit.py ":memory:" --dump-all
ثبّت الإصدار المتأثر:
pip install langgraph-checkpoint-sqlite==2.0.0
احفظ كود الاستغلال باسم exploit.py
شغّله على قاعدة بيانات نقاط تحقق موجودة أو جديدة:
python3 exploit.py checkpoints.db --dump-all
قم بالترقية فورًا:
pip install --upgrade langgraph-checkpoint-sqlite
(الإصدار ≥ 3.0.1)
لا تقبل مفاتيح مرشح بيانات وصفية اعتباطية من مصادر غير موثوقة (المستخدمون، واجهات API، حمولات JSON، إلخ)
في الإصدار ≥ 3.0.1 تفرض المكتبة تعبيرًا نمطيًا صارمًا على المفاتيح: ^[a-zA-Z0-9_.-]+$
هذا إثبات مفهوم نُشر لأغراض تعليمية وبحوث أمنية فقط.
لا تستخدم هذا الكود ضد أنظمة الإنتاج أو أي هدف دون إذن كتابي صريح.
المؤلف غير مسؤول عن إساءة الاستخدام أو الأضرار الناجمة عن هذا الكود.
إفصاح مسؤول وبحث فقط.
Mohammed Idrees Banyamer
@banyamer_security