Resumen

Existía una vulnerabilidad de inyección NoSQL en MongoDBSaver donde los campos identificadores de checkpoint de config.configurable se utilizaban en consultas MongoDB sin validación estricta de tipos. En versiones vulnerables, payloads de objetos controlados por atacantes (por ejemplo, operadores MongoDB como $gt y $ne) podían interpretarse como operadores de consulta en lugar de valores literales de identificador.

Esto podía eludir el alcance previsto de hilos y devolver checkpoints de otros tenants.

Superficie de ataque

La ruta vulnerable estaba en MongoDBSaver.getTuple(), donde thread_id, checkpoint_ns y checkpoint_id se utilizaban en consultas find() de MongoDB. Los mismos valores no validados se reutilizaban posteriormente para obtener escrituras pendientes.

Las aplicaciones quedaban expuestas cuando entrada no confiable se reenviaba a config.configurable (por ejemplo, directamente desde cuerpos de petición o parámetros de consulta) sin coerción de cadenas o validación de esquema.

Quién se ve afectado

Las aplicaciones son vulnerables si:

  • Utilizan @langchain/langgraph-checkpoint-mongodb con modelos de hilos multi-tenant o aislados por usuario
  • Aceptan valores controlados por usuario para thread_id, checkpoint_ns o checkpoint_id
  • Pasan esos valores a app.invoke(), app.stream() o métodos directos del saver sin validación

Las aplicaciones generalmente no son vulnerables si:

  • Utilizan únicamente identificadores emitidos por el servidor
  • Obtienen thread_id de parámetros URL confiables que permanecen como cadenas
  • Aplican validación de esquema que rechaza campos identificadores que no sean cadenas

Impacto

Un atacante con control sobre identificadores de checkpoint configurables podía leer datos de checkpoint fuera de su límite de hilo autorizado.

Los datos potencialmente expuestos incluyen:

  • Estado de checkpoint
  • Metadatos
  • Escrituras pendientes

Este es un problema de confidencialidad con riesgo de divulgación de datos cross-tenant.

Ejemplo de explotación

Una petición controlada por atacante puede inyectar operadores MongoDB:

typescript
graph = new StateGraph(...)
  .compile({
    checkpointer: new MongoDBSaver()
  });

graph.invoke(..., {
  configurable: {  
    "thread_id": { "$gt": "" },
    "checkpoint_ns": { "$ne": null }
  }
});

Si este payload se reenvía a config.configurable, la consulta resultante puede coincidir con checkpoints fuera del alcance previsto de tenant/hilo.

Cambios de endurecimiento de seguridad

La versión 1.3.1 endurece @langchain/langgraph-checkpoint-mongodb añadiendo validación en tiempo de ejecución para identificadores de checkpoint configurables y rechazando valores inválidos antes de que se ejecuten las rutas de consulta/escritura de MongoDB.

El parche también incluye pruebas de regresión que cubren payloads de objeto/operador en todos los métodos afectados.

Guía de migración

Actualice a @langchain/langgraph-checkpoint-mongodb@1.3.1 o posterior.

No se requiere migración de API para llamadores válidos. Sin embargo, las aplicaciones que actualmente pasan valores identificadores que no son cadenas en config.configurable ahora recibirán errores explícitos y deberían normalizar/validar las entradas.

Como defensa en profundidad, valide campos identificadores en límites de API y evite pasar objetos cliente sin procesar a la configuración del grafo.

Recursos