
Laboratorio Docker local para reproducir CVE-2026-55255, una vulnerabilidad IDOR en la API de Respuestas de Langflow. Valida la ejecución de flujos entre usuarios en versiones vulnerables vs. parcheadas con un PoC basado en solicitudes.
/api/v1/responsesEste repositorio contiene un laboratorio Docker local para reproducir y validar CVE-2026-55255, una vulnerabilidad de Referencia Directa a Objetos Insegura (IDOR, por sus siglas en inglés) que afecta a la API de Respuestas compatible con OpenAI de Langflow.
Langflow es una plataforma de código abierto para crear e implementar agentes y flujos de trabajo impulsados por IA. El comportamiento vulnerable afecta al endpoint /api/v1/responses, donde un atacante autenticado puede proporcionar el UUID de flujo de otro usuario como valor model y hacer que Langflow ejecute ese flujo propiedad de la víctima.
Este laboratorio compara dos versiones de Langflow:
| Service | Langflow version | Purpose | URL |
|---|---|---|---|
| vuln | 1.9.0 | Objetivo de comparación vulnerable | http://localhost:7860 |
| patched | 1.9.1 | Objetivo de comparación parcheado | http://localhost:7861 |
La ruta de validación HTTP demostrada en este laboratorio local es:```text Authenticated attacker API key → POST /api/v1/responses → request body sets model to victim-owned flow UUID → vulnerable target executes the victim-owned flow → patched target returns flow_not_found and does not execute the victim-owned flow
En el objetivo vulnerable, la clave de API del atacante puede ejecutar el flujo de la víctima y la respuesta contiene el marcador exclusivo de la víctima:```text
VICTIM_ONLY_CONTEXT_55255_VULN
En el objetivo parcheado, la misma solicitud entre usuarios no devuelve el marcador de la víctima y devuelve un cuerpo de error al estilo de OpenAI:```json {"error":{"message":"Flow with id '' not found","type":"invalid_request_error","code":"flow_not_found"}}
Este laboratorio valida el comportamiento HTTP vulnerable frente al parcheado utilizando Langflow 1.9.0 y Langflow 1.9.1.
El laboratorio está intencionalmente limitado a servicios Docker locales. No apunta a sistemas externos ni incluye robo de credenciales, volcado de bases de datos, cargas útiles destructivas, devoluciones de llamada externas, malware, persistencia ni actividad posterior a la explotación.
## Hechos Verificados
| Afirmación | Evidencia | Cómo verificarlo en este laboratorio |
| ----- | -------- | ------------------------- |
| CVE-2026-55255 afecta al endpoint `/api/v1/responses` de Langflow. | El aviso de GitHub GHSA-qrpv-q767-xqq2 describe un IDOR en `/api/v1/responses`. | Revise la sección de Referencias y ejecute el PoC contra ambos objetivos locales. |
| El aviso de GitHub lista las versiones afectadas como `< 1.9.1` y la versión parcheada como `1.9.1`. | Aviso de GitHub GHSA-qrpv-q767-xqq2. | Compare las versiones vulnerable y parcheada de los objetivos en `docker-compose.yml`. |
| Algunas fuentes de vulnerabilidades posteriores no coinciden en la versión corregida exacta. | GitHub/GitLab listan `1.9.1` como corregida; algunas páginas de inteligencia posteriores mencionan `1.9.2` o contienen redacción mixta. | Revise la sección de Referencias y confíe en la validación del laboratorio para el comportamiento probado de 1.9.1. |
| Este laboratorio usa Langflow 1.9.0 como objetivo vulnerable de comparación. | El servicio `vuln` usa `langflowai/langflow:1.9.0`. | Inspeccione `docker-compose.yml` y ejecute `docker compose ps`. |
| Este laboratorio usa Langflow 1.9.1 como objetivo parcheado de comparación. | El servicio `patched` usa `langflowai/langflow:1.9.1`. | Inspeccione `docker-compose.yml` y ejecute `docker compose ps`. |
| La API de Responses de Langflow usa `POST /api/v1/responses`. | La documentación de Langflow describe el endpoint de la API de Responses compatible con OpenAI. | Ejecute el PoC o una solicitud curl manual contra `/api/v1/responses`. |
| La API de Responses de Langflow acepta un ID de flujo como valor de `model`. | La documentación de Langflow indica que el valor de `model` se reemplaza con un `flow_id`. | Inspeccione el cuerpo de la solicitud del PoC. |
| Las solicitudes a la API de Langflow requieren una clave API mediante `x-api-key`. | La documentación de la API de Langflow describe la autenticación con clave API mediante el encabezado `x-api-key`. | Inspeccione los encabezados de la solicitud del PoC. |
| El PoC se basa en solicitudes. | `poc/validate_idor.py` envía solicitudes HTTP y no llama a Docker, Docker Compose, comandos de shell ni APIs de contenedores. | Inspeccione `poc/validate_idor.py`. |
| El objetivo vulnerable ejecuta un flujo propiedad de la víctima con una clave API propiedad del atacante. | La respuesta vulnerable devuelve `VICTIM_ONLY_CONTEXT_55255_VULN`. | Ejecute el comando PoC vulnerable con el ID de flujo de la víctima y la clave API del atacante. |
| El objetivo parcheado bloquea la misma ruta de ejecución entre usuarios. | La respuesta parcheada devuelve `error.code = flow_not_found` y no devuelve el marcador de la víctima. | Ejecute el comando PoC parcheado con el ID de flujo de la víctima y la clave API del atacante. |
## Supuestos y Desconocidos
Este laboratorio usa Langflow 1.9.0 como objetivo vulnerable de comparación porque el aviso de GitHub GHSA-qrpv-q767-xqq2 identifica las versiones anteriores a 1.9.1 como afectadas, y las pruebas locales confirmaron el comportamiento vulnerable en 1.9.0.
Este laboratorio usa Langflow 1.9.1 como objetivo parcheado de comparación porque el aviso de GitHub GHSA-qrpv-q767-xqq2 lista 1.9.1 como la versión parcheada, y las pruebas locales confirmaron que 1.9.1 bloquea la ruta de ejecución entre usuarios probada en `/api/v1/responses` con `flow_not_found`.
Existe una discrepancia de versiones entre las fuentes. Los avisos de GitHub y GitLab listan las versiones anteriores a 1.9.1 como afectadas y 1.9.1 como corregida. Algunas páginas de inteligencia de vulnerabilidades posteriores mencionan 1.9.2 o contienen redacción mixta en torno a la versión corregida. Este repositorio documenta esa discrepancia y valida el comportamiento probado directamente:```text
Langflow 1.9.0
→ attacker API key + victim flow UUID
→ victim marker returned
→ vulnerable behavior observed
Langflow 1.9.1
→ attacker API key + victim flow UUID
→ flow_not_found
→ victim marker not returned
→ blocked behavior observed
Este laboratorio asume que el atacante ya conoce un UUID de flujo de la víctima. El PoC no realiza fuerza bruta sobre los IDs de flujo, no enumera flujos ni intenta descubrir IDs de flujo de la víctima.
Este laboratorio se centra en el comportamiento HTTP observable de:```text POST /api/v1/responses
con esta forma de solicitud:```json
{
"model": "<victim-flow-id>",
"input": "cross-user CVE-2026-55255 validation request",
"stream": false
}
The lab demonstrates unauthorized cross-user flow execution in the vulnerable target and blocked behavior in the patched target.
The lab does not demonstrate:
The root cause of CVE-2026-55255 is an authorization gap in Langflow's flow resolution logic.
The /api/v1/responses endpoint accepts a flow UUID through the model field. In vulnerable versions, the UUID lookup path inside get_flow_by_id_or_endpoint_name() could load a Flow object directly by primary key without enforcing that the resolved Flow.user_id matched the authenticated API-key user.