FlawOpen

flawopen.com/AI Security/langgraph-js-custom-auth-cross-user-store-access

● CWE-639 / CWE-863 · CVSS v4 8.6[1] · Alta
Investigación · FlawOpen

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]

Vector CVSSCVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/VC:H/VI:H/VA:N/SC:N/SI:N/SA:N[1]
💡 Explicación en Lenguaje Sencillo (ELI5)

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]
CWE-639 / CWE-863
Elusión de autorización mediante una clave controlada por el usuario y autorización incorrecta. El fallo consiste en no aplicar la restricción de namespace del handler.[1], [3], [4]

Mapeos de marcos

  • Referencia CWE para la debilidad descrita en esta guía: CWE-639 CWE-863

Flujo de Ataque Paso a Paso

Paso 1

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]

Paso 2

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]

Paso 3

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]

Paso 4

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]

Paso 5

Actualice o rechace namespaces no autorizados

Actualice a langgraph-api>=0.15.0. Si no es posible hacerlo de inmediato, rechace namespaces no autorizados en cada acción Store y compruebe qué namespace recibe el Store.[1], [2]

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

IMPLEMENTACIÓN VULNERABLE
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.
}
PARCHE SEGURO Y ROBUSTO
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

Fuentes

← AI Security Directory →