
अवधारणा-साक्ष्य शोषण CVE-2025-67644 के लिए, जो LangGraph SQLite Checkpoint में एक SQL इंजेक्शन कमजोरी है। यह अस्वच्छित मेटाडेटा फ़िल्टर कुंजियों के माध्यम से मनमाना SQL इंजेक्शन प्रदर्शित करता है, जिससे डेटा निष्कासन और फ़िल्टर बाईपास संभव होता है।
CVE-2025-67644 एक SQL इंजेक्शन भेद्यता (CWE-89) है जो langgraph-checkpoint-sqlite पैकेज में (LangGraph / LangChain पारिस्थितिकी तंत्र का हिस्सा) पाई गई है।
यह एक हमलावर को अस्वच्छित मेटाडेटा फ़िल्टर कुंजियों के माध्यम से मनमाना SQL इंजेक्ट करने की अनुमति देता है, जो SqliteSaver की / विधियों में दी जाती हैं।
list()alist()प्रभाव: फ़िल्टर की पूर्ण बाईपास, सभी चेकपॉइंट रिकॉर्ड का रिसाव (जिसमें संभावित संवेदनशील वार्तालाप स्थिति, थ्रेड आईडी, मेटाडेटा शामिल हैं), और कुछ तैनाती परिदृश्यों में — व्यापक डेटाबेस पहुँच।
प्रभावित संस्करण: < 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() तर्क ने JSON निष्कर्षण अभिव्यक्ति के अंदर उपयोगकर्ता-नियंत्रित शब्दकोश कुंजियों के असुरक्षित f-string इंटरपोलेशन का उपयोग किया:
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