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-mongodbcon modelos de hilos multi-tenant o aislados por usuario - Aceptan valores controlados por usuario para
thread_id,checkpoint_nsocheckpoint_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_idde 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:
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.
