
Laboratorio reproducible para CVE-2026-33017, una RCE no autenticada en Langflow. Incluye un servicio vulnerable dockerizado y un PoC de mínimo impacto que demuestra la ejecución de código a través del endpoint público de build.
CVE-2026-33017 es una vulnerabilidad de Ejecución Remota de Código (RCE) no autenticada en Langflow donde un endpoint público de build acepta datos de flujo controlados por el atacante, permitiendo que código de componentes personalizados se ejecute en el servidor.
En este laboratorio, el flujo de validación es:
PUBLICjob_idLa prueba se obtiene directamente a través del mecanismo de eventos de la API de Langflow, haciendo que el resultado sea observable a través de la propia interfaz del sistema.
Este documento presenta un laboratorio solo-vulnerabilidad.
Actualmente, docker compose contiene solo un servicio: , porque este proyecto sigue un enfoque de y evita entornos parcheados que no se basen en un artefacto oficial corregido.
vulnEl siguiente comportamiento ha sido verificado en este laboratorio:
http://localhost:78611.8.1build_public_tmp devuelve un job_idEjemplo de objeto de prueba:
{
"canary": "lf33017-c14fc1c9",
"id_output": "uid=1000(user) gid=0(root) groups=0(root)",
"whoami": "user",
"hostname": "155aa3fd5e2a",
"cwd": "/app",
"python_version": "3.12.12"
}
La evidencia clave es:
id_outputwhoamihostnamecwdpython_versionLa información anterior muestra que el código controlado por el atacante se ejecutó realmente en el lado del servidor.
.
├── docker-compose.yml
├── vuln/
│ └── Dockerfile
├── poc/
│ └── poc.py
├── README.md
└── .gitignore
7861 -> 7860Esta vulnerabilidad existe porque el endpoint público de build de Langflow acepta definiciones de flujo proporcionadas por el usuario, aunque el endpoint ya esté diseñado para flujos públicos. Cuando un atacante envía una definición de nodo que contiene código de componente personalizado, el sistema pasa ese código a la ruta de build del flujo, lo que finalmente resulta en la ejecución de código en el servidor.
El PoC de este proyecto utiliza un componente personalizado que devuelve un objeto de prueba en su salida para demostrar que el código controlado por el atacante se ejecuta realmente.
El PoC de este proyecto está diseñado para ser de mínimo daño y se centra en una prueba claramente observable a través de la API. Su flujo de trabajo es el siguiente:
PUBLICjob_idEste PoC no cubre:
docker compose up -d --build
curl -i http://localhost:7861/api/v1/version
python3 poc/poc.py --base-url http://localhost:7861 --artifact-dir ./artifacts/vuln
Cuando el PoC tiene éxito, la salida se verá así:
[+] http://localhost:7861 ready (version=1.8.1)
=== TARGET: vuln ===
Base URL : http://localhost:7861
Version : 1.8.1
Flow ID : <uuid>
HTTP : 200
Job ID : <uuid>
Canary : lf33017-xxxxxxxx
Events : artifacts/vuln/events-<job_id>.ndjson
Polls : 2
[+] Proof observed through the Langflow API events endpoint:
{
"canary": "lf33017-xxxxxxxx",
"id_output": "uid=1000(user) gid=0(root) groups=0(root)",
"whoami": "user",
"hostname": "<container-hostname>",
"cwd": "/app",
"python_version": "3.12.x"
}
[+] Vulnerable behavior observed
El archivo artifacts/vuln/events-<job_id>.ndjson almacena los datos de eventos sin procesar para depuración adicional.
Este PoC demuestra que:
Este PoC no pretende demostrar persistencia ni post-explotación avanzada y mantiene el impacto en el nivel mínimo necesario para validar la vulnerabilidad.
Según este laboratorio, el impacto demostrado es:
Este repositorio no incluye un servicio parcheado por diseño.
Su alcance se limita a reproducir el comportamiento vulnerable en un artefacto upstream real. Un lado parcheado solo se añade cuando existe un artefacto oficial corregido claramente verificable disponible del proveedor o del proyecto upstream.
Por esa razón, este repositorio evita deliberadamente:
Esto mantiene el laboratorio con un alcance limitado y técnicamente honesto. En lugar de presentar una configuración lado a lado artificial, el repositorio se centra en tres cosas:
En la práctica, esto hace que el repositorio sea más adecuado para:
docker compose down -v
Este laboratorio está diseñado para pruebas solo en localhost.
Requisitos de uso: