flawopen.com/AI Security/langgraph-js-custom-auth-cross-user-store-access
LangGraph JS Auth: acceso cruzado al Store
langgraph-api <0.15.0 podía perder namespaces del Store reescritos por custom-auth JS/TS, permitiendo acceso entre usuarios. Actualice a 0.15.0.[1], [2]
Imagina que un bibliotecario comprueba tu tarjeta y pide a otro mostrador que busque un libro. El segundo mostrador anota tu estantería, pero el cambio se pierde en el traspaso y busca la que indicó originalmente el visitante. La ruta de autenticación JavaScript/TypeScript afectada podía perder la reescritura del namespace entre el runtime de autorización y la operación Store. La corrección conserva el namespace autorizado y lo valida antes de usar el Store.[1]
Conceptos Clave y Términos
GHSA-4hm6-w6qq-w73v- Aviso de gravedad alta de LangGraph publicado el 28 de septiembre de 2026. No tiene CVE asignado. El paquete afectado es langgraph-api y se corrige en 0.15.0.[1]
Namespace de Store- Nombre jerárquico que agrupa registros de LangGraph Store. Las aplicaciones suelen incluir la identidad del usuario o tenant para separar los datos.[1]
Handler de autorización personalizado- Código de aplicación que decide si una solicitud autenticada puede acceder a un recurso y puede reescribir el namespace antes de la operación Store.[1]
Mapeos de marcos
Flujo de Ataque Paso a Paso
Compruebe si la implementación está afectada
Verifique que langgraph-api sea >=0.1.2 y <0.15.0 y que el servidor utilice autenticación personalizada JavaScript o TypeScript.[1]
Localice la reescritura del namespace
El handler cambia el namespace solicitado para incluir o imponer la identidad del usuario autenticado, en vez de rechazar una solicitud fuera de ese namespace.[1]
El resultado de autorización cruza un límite de runtime
En las versiones afectadas, el cambio de namespace puede no propagarse hasta la operación Store. Puede seguir utilizándose el namespace original proporcionado por el solicitante.[1]
Un usuario autenticado apunta a otro namespace
Una cuenta normal puede solicitar operaciones Store sobre registros fuera de su propio namespace. El aviso contempla lectura, sobrescritura, búsqueda y borrado.[1]
Análisis de Causa Raíz
El GHSA de los mantenedores de LangGraph, publicado el 28 de septiembre de 2026, describe un fallo en langgraph-api versiones >=0.1.2 y <0.15.0 si se cumplen todas estas condiciones: la implementación usa autenticación personalizada JavaScript o TypeScript; el handler de autorización Store reescribe el namespace solicitado para limitar los datos al usuario actual; un usuario autenticado normal puede enviar operaciones Store; y los datos de varios usuarios pasan por esa ruta de autorización. El aviso indica que los handlers Python no están afectados y que los handlers JavaScript/TypeScript que rechazan namespaces no autorizados en vez de reescribirlos tampoco lo están. El cambio de namespace del handler podía perderse en una frontera de runtime, por lo que la operación Store utilizaba el namespace original de la solicitud. Un usuario autenticado podía leer, sobrescribir, buscar o borrar registros fuera de su namespace autorizado. No elude el inicio de sesión ni permite un ataque remoto sin autenticar. El aviso lo califica como Alto, CVSS 4.0 8,6, y asigna CWE-639 y CWE-863. La versión 0.15.0 transporta los cambios del handler, valida el namespace resultante y rechaza cambios malformados o que no puedan aplicarse. Si la actualización se demora, la alternativa del mantenedor es rechazar namespaces no autorizados en todas las acciones Store. El código es una ilustración TypeScript reducida del flujo de datos, no el código fuente del SDK.[1]
Código Fuente: Vulnerable vs. Seguro
Este ejemplo TypeScript reducido ilustra un contrato de frontera; los nombres de las funciones y la forma del resultado son ilustrativos, no código fuente del SDK LangGraph. El aviso confirma que los cambios de autorización JS/TS podían perderse antes de la operación Store, pero no publica esta implementación interna exacta. Por tanto, el lado vulnerable modela solo el invariante documentado: el Store usa el namespace de la solicitud en vez del autorizado. El lado corregido consume y valida el resultado autorizado. La alternativa documentada por el mantenedor es rechazar namespaces no autorizados, en lugar de reescribirlos, para cada acción Store.[1]
Fragmento de origen: Límite de autorización de LangGraph API a Store — contrato ilustrativo reducido
type StoreRequest = { namespace: string[]; key: string };
type AuthorizationResult = { allowed: boolean; namespace: string[] };
async function readStore(userId: string, request: StoreRequest) {
const authorization = await authorizeStore(userId, request); // Illustrative bridge contract.
return store.get(request.namespace, request.key); // The bridge drops the authorized result.
}
type StoreRequest = { namespace: string[]; key: string };
type AuthorizationResult = { allowed: boolean; namespace: string[] };
async function readStore(userId: string, request: StoreRequest) {
const authorization = await authorizeStore(userId, request); // Illustrative bridge contract.
if (!authorization.allowed) throw new Error("forbidden");
const namespace = validateAuthorizedNamespace(userId, authorization.namespace);
return store.get(namespace, request.key); // Apply the authorized result.
}
Lista de Verificación de Seguridad para Ingeniería
- ✓Inventaríe versiones de
langgraph-apie identifique implementaciones con autenticación personalizada JavaScript/TypeScript; los handlers Python quedan fuera del alcance de este aviso.[1] - ✓Actualice las implementaciones afectadas a
langgraph-api>=0.15.0y verifique el artefacto desplegado, no solo el lockfile o la rama de código.[1], [2] - ✓Hasta actualizar, haga que cada handler de autorización Store rechace solicitudes fuera del namespace del usuario autenticado; no dependa de una reescritura cuyo resultado podría perderse.[1]
- ✓Pruebe
get,put,search,deletey el listado de namespaces con dos identidades de prueba; confirme que cada operación se limita al namespace autorizado y que se deniega el acceso cruzado.[1] - ✓Revise los registros disponibles de acceso y modificación del Store para detectar lecturas, búsquedas o escrituras entre namespaces de usuarios. Si encuentra cambios no autorizados, conserve las pruebas y evalúe los registros afectados antes de corregirlos.[1], [5]