
Exploit de prueba de concepto para CVE-2025-67644, una vulnerabilidad de inyección SQL en LangGraph SQLite Checkpoint. Demuestra inyección SQL arbitraria a través de claves de filtro de metadatos no sanitizadas, permitiendo la exfiltración de datos y la evasión de filtros.
CVE-2025-67644 es una vulnerabilidad de inyección SQL (CWE-89) en el paquete langgraph-checkpoint-sqlite (parte del ecosistema LangGraph / LangChain).
Permite a un atacante inyectar SQL arbitrario a través de claves de filtro de metadatos no sanitizadas pasadas a los métodos list() / alist() de SqliteSaver.
Impacto: Bypass completo de filtros, fuga de todos los registros de checkpoint (incluyendo posiblemente estado de conversación sensible, IDs de hilo, metadatos) y, en algunos escenarios de implementación, acceso más amplio a la base de datos.
Versiones afectadas: < 3.0.1
Corregido en: ≥ 3.0.1
Puntuación CVSS: 7.3 (Alta) — AV:L / AC:L / PR:L / UI:N / S:C / C:H / I:L / A:N
La lógica interna _metadata_predicate() utilizaba interpolación insegura de cadenas f con claves de diccionario controladas por el usuario dentro de una expresión de extracción JSON:
f"json_extract(CAST(metadata AS TEXT), '$.{query_key}')"
Un atacante que pueda proporcionar claves arbitrarias (por ejemplo, a través de entrada API) puede cerrar la ruta JSON antes de tiempo e inyectar fragmentos SQL, como:
{"env') OR '1'='1": "anything"}
→ resultando en una cláusula WHERE que siempre se evalúa como verdadera → devuelve todos los registros.
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"]
(Esta versión evita paréntesis en el texto de los nodos cuando es posible y usa comillas alrededor de etiquetas con caracteres especiales/puntos para prevenir errores de análisis.)
--dump-all (mostrar registros completos), --threads-only (extraer solo 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
Instalar la versión vulnerable:
pip install langgraph-checkpoint-sqlite==2.0.0
Guardar el código del exploit como exploit.py
Ejecutar contra una base de datos de checkpoint existente o nueva:
python3 exploit.py checkpoints.db --dump-all
Actualizar inmediatamente:
pip install --upgrade langgraph-checkpoint-sqlite
(versión ≥ 3.0.1)
No aceptar claves de filtro de metadatos arbitrarias de fuentes no confiables (usuarios, APIs, cargas JSON, etc.)
En ≥ 3.0.1 la librería aplica una regex estricta en las claves: ^[a-zA-Z0-9_.-]+$
Esto es una prueba de concepto publicada solo con fines educativos y de investigación de seguridad.
No utilice este código contra sistemas en producción o cualquier objetivo sin permiso explícito por escrito.
El autor no es responsable por el mal uso o daños causados por este código.
Divulgación responsable e investigación únicamente.
Mohammed Idrees Banyamer
@banyamer_security