sistema: OPERATIVO
← volver a todos los hacks
AGENTS CRITICAL NEW

Checkpointers de LangGraph: de la inyección SQL al RCE en agentes autoalojados

Check Point Research encadenó una inyección SQL en el checkpointer de LangGraph con una deserialización msgpack insegura hasta lograr ejecución remota de código. Divulgado el 11 de junio de 2026; los tres CVE están corregidos.

2026-06-17 // 7 min affects: langgraph, langgraph-checkpoint-sqlite, langgraph-checkpoint-redis

¿Qué es esto?

El 11 de junio de 2026, Check Point Research (Yarden Porat) publicó un análisis de LangGraph, el framework de código abierto que LangChain ofrece para flujos de trabajo de agentes multietapa, con unos 46,5 millones de descargas mensuales en PyPI. No se trata de un truco de inyección de prompts, sino de una cadena de vulnerabilidades web clásica alojada en un framework de agentes: una inyección SQL en la capa de persistencia, encadenada con una deserialización insegura, que culmina en la ejecución remota de código (RCE) sobre el host.

Se asignaron tres CVE, todos ya corregidos:

  • CVE-2025-67644 — inyección SQL en el checkpointer SQLite.
  • CVE-2026-28277 — deserialización msgpack insegura en el cargador de checkpoints.
  • CVE-2026-27022 — la misma clase de inyección en el checkpointer Redis.

La plataforma gestionada LangSmith Deployment (respaldada por PostgreSQL) no está afectada. La exposición concierne específicamente a los equipos que autoalojan LangGraph con el checkpointer SQLite o Redis.

Cómo funciona

Un checkpointer es la memoria de LangGraph: guarda el estado de ejecución del agente en cada paso para permitir reanudarlo después. El punto de entrada vulnerable es la API get_state_history(), que internamente llama al método list() del checkpointer y acepta un diccionario filter para consultar los metadatos de los checkpoints.

El fallo está en cómo ese filtro se convierte en SQL. El constructor del predicado de metadatos interpola directamente la clave del diccionario, controlada por el atacante, dentro de una expresión json_extract(...) en lugar de vincularla como parámetro:

# conceptual — la clave se interpola, no se parametriza
f"json_extract(CAST(metadata AS TEXT), '$.{query_key}') {operator}"

Si una aplicación reenvía entrada de usuario a ese filter, el atacante controla la clave y puede escapar de la cadena de ruta JSON para inyectar SQL. A partir de ahí, la cadena tiene dos etapas:

Etapa 1 — inyección SQL (CVE-2025-67644 / CVE-2026-27022)
  Inyectar un UNION SELECT en la cláusula WHERE para que la consulta
  devuelva una fila de checkpoint moldeada por el atacante, con el
  BLOB `checkpoint` y su `type` fijados en un valor que el cargador
  deserializará. [payload REDACTADO]

Etapa 2 — deserialización insegura (CVE-2026-28277)
  list() pasa cada fila devuelta a serde.loads_typed(). Para el tipo
  "msgpack", el ext_hook de LangGraph reconstruye objetos arbitrarios:
      importlib.import_module(mod), getattr(name)(arg)
  Una extensión forjada se resuelve en (os, system, <comando>) → RCE.

Lo que hace este fallo más grave que una inyección SQL de manual es la segunda etapa. El manejador de extensiones msgpack se diseñó para reconstruir objetos Python personalizados, así que los bytes controlados por el atacante se convierten en os.system(<comando>). Ninguno de los dos fallos es novedoso por sí solo: el UNION SELECT y la deserialización insegura tienen décadas. La novedad es que se sitúan en la ruta de ejecución de un agente autónomo que posee credenciales de producción. Aquí no se reproduce ningún payload; la referencia es el artículo de Check Point, y los fallos están corregidos.

Por qué importa

Un servidor LangGraph comprometido no es un incidente acotado a una sola sesión, como suele serlo una inyección de prompts. Según Check Point, la ejecución completa de código en ese host entrega al atacante las claves de API del LLM del agente (facturables directamente), todo su historial de conversaciones, todos los datos de CRM/soporte/facturación y PII conectados, y un punto de pivote hacia los sistemas internos con los accesos que heredaba el agente.

La lección de fondo es la que LLM Hacking repite con frecuencia: los frameworks de agentes heredan todas las clases clásicas de vulnerabilidades y las amplifican. Una inyección SQL que sería un fallo de acceso a datos de gravedad media en una aplicación CRUD se vuelve crítica cuando esa misma ruta de código también deserializa datos y se ejecuta dentro de una automatización privilegiada. Además, LangGraph autoalojado se distribuye sin autenticación incorporada: una instancia expuesta amplía aún más el radio de impacto.

Defensas

Las vulnerabilidades están corregidas; actualizar es el primer paso y el más importante.

  1. Actualice ya. Pase a langgraph-checkpoint-sqlite 3.0.1+ (CVE-2025-67644), langgraph 1.0.10+ / langgraph-checkpoint 4.0.1+ (CVE-2026-28277) y langgraph-checkpoint-redis 1.0.2+ (CVE-2026-27022). Cualquier versión inferior debe tratarse como prioridad inmediata.
  2. Nunca pase entrada de usuario a los filtros de get_state_history(). Audite su aplicación en busca de cualquier ruta donde datos de la petición lleguen al filter del checkpointer. Vincule los valores como parámetros; restrinja las claves filtrables mediante una lista de permitidos.
  3. Autentique el servidor LangGraph. LangGraph autoalojado no tiene autenticación propia. Coloque un proxy inverso o una API gateway delante y manténgalo fuera de redes no confiables; trátelo como un servicio estrictamente interno.
  4. Trate el runtime del agente como una identidad privilegiada. Posee claves de API, credenciales de base de datos y tokens SaaS; un host de agente comprometido merece el mismo nivel de respuesta que una cuenta privilegiada comprometida.
  5. Mínimo privilegio y secretos efímeros. Reduzca cada credencial que posea el agente, prefiera el corretaje de secretos a las claves estáticas de larga duración y segmente la capa de persistencia (SQLite/Redis) del resto de la red.
  6. Haga red team sobre la cadena, no sobre las piezas. La gravedad provino del encadenamiento, y los escáneres individuales detectan fallos aislados pero pierden la combinación. Ejercite la pila agéntica de forma adversaria, de extremo a extremo.

Estado

ElementoReferenciaFechaNotas
Divulgación a LangChainCheck Point Research2025-11-19Tres problemas reportados
CVE-2025-67644 (SQLi SQLite)langgraph-checkpoint-sqlite 3.0.12025-12-10El parche rompe la cadena RCE
CVE-2026-27022 (SQLi Redis)langgraph-checkpoint-redis 1.0.22026-02-20Misma clase de inyección
CVE-2026-28277 (deser. msgpack)langgraph-checkpoint 4.0.1 / langgraph 1.0.102026-03-05Deserialización → RCE
PublicaciónCheck Point Research / Check Point Blog2026-06-11Divulgación coordinada completada
LangSmith Deployment gestionadoLangChainBackend PostgreSQL, no afectado

El encuadre correcto no es «LangGraph es inseguro». Es que los frameworks de agentes con estado presentan una amplia superficie de infraestructura aún poco probada, y la capa de persistencia —la memoria del agente— forma parte de esa superficie. Actualice, autentique y deje de tratar como confiables los datos que provienen «desde dentro» del framework.

Sources