
Proof-of-concept-Exploit für CVE-2025-67644, eine SQL-Injection-Schwachstelle in LangGraph SQLite Checkpoint. Demonstriert beliebige SQL-Injection durch unsanitisierte Metadaten-Filterschlüssel, was Datenexfiltration und Filterumgehung ermöglicht.
CVE-2025-67644 ist eine SQL-Injection-Sicherheitslücke (CWE-89) im Paket langgraph-checkpoint-sqlite (Teil des LangGraph/LangChain-Ökosystems).
Sie erlaubt einem Angreifer, beliebiges SQL über unsanitisierte Metadaten-Filterschlüssel einzuschleusen, die an die Methoden list() / alist() von SqliteSaver übergeben werden.
Auswirkungen: Vollständige Umgehung der Filter, Offenlegung aller Checkpoint-Datensätze (einschließlich potenziell sensibler Konversationszustände, Thread-IDs, Metadaten) und in einigen Bereitstellungsszenarien – breiterer Datenbankzugriff.
Betroffene Versionen: < 3.0.1
Behoben in: ≥ 3.0.1
CVSS-Score: 7.3 (Hoch) — AV:L / AC:L / PR:L / UI:N / S:C / C:H / I:L / A:N
Die interne _metadata_predicate()-Logik verwendete unsichere f-String-Interpolation von benutzergesteuerten Dictionary-Schlüsseln in einem JSON-Extraktionsausdruck:
f"json_extract(CAST(metadata AS TEXT), '$.{query_key}')"
Ein Angreifer, der beliebige Schlüssel bereitstellen kann (z. B. über API-Eingabe), kann den JSON-Pfad frühzeitig schließen und SQL-Fragmente injizieren, wie z. B.:
{"env') OR '1'='1": "anything"}
→ was zu einer WHERE-Klausel führt, die immer wahr ist → gibt alle Datensätze zurück.
flowchart TD
A["Benutzer / API-Client"] -->|"Sendet bösartiges Filter-Dict"| B["Anwendung, die langgraph-checkpoint-sqlite verwendet"]
B -->|"Übergibt filter=..."| C["SqliteSaver.list-Methode"]
C -->|"Unsichere Schlüsselinterpolation"| D["Metadaten-Prädikatslogik"]
D -->|"Erstellt injizierbares SQL"| E["SQLite-Engine"]
E -->|"Gibt ALLE Checkpoints / sensible Daten zurück"| F["Angreifer"]
F -->|"Datenextraktion / Autorisierungsumgehung"| G["Auswirkungen erzielt"]
(Diese Version vermeidet Klammern in Knotentexten, wo möglich, und verwendet Anführungszeichen um Labels mit Sonderzeichen/Punkten, um Parsing-Fehler zu vermeiden.)
--dump-all (vollständige Datensätze anzeigen), --threads-only (nur thread_ids extrahieren)pip install langgraph-checkpoint-sqlite"<3.0.1" # z. B. ==2.0.0
# Grundlegende Prüfung (nur Anzahl)
python3 exploit.py checkpoints.db
# Vollständige Checkpoint-Details ausgeben
python3 exploit.py checkpoints.db --dump-all
# Nur thread_ids extrahieren (nützlich für Enumeration)
python3 exploit.py checkpoints.db --threads-only --dump-all
# Test gegen In-Memory-Datenbank (schnell & flüchtig)
python3 exploit.py ":memory:" --dump-all
Installieren Sie die anfällige Version:
pip install langgraph-checkpoint-sqlite==2.0.0
Speichern Sie den Exploit-Code als exploit.py
Führen Sie es gegen eine vorhandene oder neue Checkpoint-Datenbank aus:
python3 exploit.py checkpoints.db --dump-all
Sofort aktualisieren:
pip install --upgrade langgraph-checkpoint-sqlite
(Version ≥ 3.0.1)
Akzeptieren Sie keine willkürlichen Metadaten-Filterschlüssel aus nicht vertrauenswürdigen Quellen (Benutzer, APIs, JSON-Payloads usw.)
In ≥ 3.0.1 erzwingt die Bibliothek einen strengen Regex für Schlüssel: ^[a-zA-Z0-9_.-]+$
Dies ist ein Proof-of-Concept, das ausschließlich zu Bildungs- und Sicherheitsforschungszwecken veröffentlicht wurde.
Verwenden Sie diesen Code nicht gegen Produktionssysteme oder Ziele ohne ausdrückliche schriftliche Genehmigung.
Der Autor ist nicht verantwortlich für Missbrauch oder Schäden, die durch diesen Code verursacht werden.
Nur für verantwortungsvolle Offenlegung und Forschung.
Mohammed Idrees Banyamer
@banyamer_security