
Plantilla de Nuclei para detectar CVE-2026-33017, una vulnerabilidad de ejecución remota de código no autenticada en Langflow ≤ 1.8.2. Realiza verificaciones previas no destructivas para distinguir versiones vulnerables de las parcheadas mediante análisis de respuestas HTTP.
Plantilla Nuclei que detecta CVE-2026-33017 — una vulnerabilidad de ejecución remota de código sin autenticación en Langflow ≤ 1.8.2 accesible a través del endpoint público de construcción de flujos:
POST /api/v1/build_public_tmp/{flow_id}/flow
El manejador vulnerable acepta un grafo de flujo data controlado por el atacante y pasa data.nodes[].data.node.template.code.value directamente a exec() de Python durante la construcción del grafo, sin ningún tipo de sandboxing. La corrección (≥ 1.9.0) elimina el parámetro data de la firma del manejador, por lo que una versión parcheada rechaza la misma solicitud en la capa de validación de FastAPI con HTTP 422.
La plantilla es no destructiva. Envía una carga inerte contra un ID de flujo zero-UUID, por lo que no puede alcanzar exec() incluso en un host vulnerable. Distingue el manejador vulnerable del parcheado únicamente por la firma de la respuesta HTTP.
| Etapa | Solicitud | Lo que indica |
|---|---|---|
| 1 |
Enrutamiento para la etapa 2:
Una confirmación real de RCE aún requiere (a) un UUID de flujo PÚBLICO real en el objetivo y (b) una retrollamada fuera de banda (DNS/HTTP). Ese paso no se incluye aquí a propósito — esta plantilla es la verificación previa segura que decide si tiene sentido ejecutar un exploit activo.
Host individual:
nuclei -t CVE-2026-33017.yaml -u https://target.example.com
Escaneo masivo desde una lista:
nuclei -t CVE-2026-33017.yaml -l targets.txt -rl 20 -c 10
Con salida de depuración (ver las solicitudes/respuestas sin procesar):
nuclei -t CVE-2026-33017.yaml -u https://target.example.com -debug-req -debug-resp
Validar la plantilla localmente antes de ejecutarla:
nuclei -validate -t CVE-2026-33017.yaml
Objetivo vulnerable:
[CVE-2026-33017] [http] [critical] https://target.example.com [vulnerable-flow-not-found] ["1.8.2","base"]
Objetivo parcheado — no se emite ningún hallazgo (la respuesta 422 no coincide con ninguna regla).
Consultas comunes de descubrimiento para hosts de Langflow (úsalas solo contra activos que estás autorizado a probar):
http.title:"Langflow"app="Langflow"intitle:"Langflow" inurl:"/flows"AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:HEn las versiones vulnerables, el manejador público se declara aproximadamente como:
@router.post("/build_public_tmp/{flow_id}/flow")
async def build_public_flow(flow_id: UUID, data: FlowDataRequest | None = None, ...):
...
await verify_public_flow_and_get_user(flow_id, ...)
...
# data.nodes[].data.node.template.code.value reaches exec() in the
# Component build path
data está controlado por el atacante. El manejador parcheado elimina el parámetro por completo y fuerza data=None, por lo que una solicitud que incluya un campo data en el cuerpo es rechazada con 422 en las versiones parcheadas.
/api/v1/build_public_tmp/ en el proxy inverso.LANGFLOW_AUTO_LOGIN=False, configura las credenciales de superusuario y rota LANGFLOW_SECRET_KEY.access_type=PUBLIC son los que un atacante apuntaría en la URL.Esta plantilla se publica con fines de seguridad defensiva y pruebas autorizadas únicamente. Ejecutarla contra sistemas que no posees o para los que no tienes permiso explícito por escrito es ilegal en la mayoría de las jurisdicciones y viola los términos de servicio de la plataforma.
Al usar esta plantilla aceptas que:
lopseg — https://github.com/lopseg
Las solicitudes de extracción (pull requests) y los problemas (issues) son bienvenidos.
MIT
GET /api/v1/version| Confirma que el objetivo es Langflow y extrae la versión de compilación. |
| 2 | POST /api/v1/build_public_tmp/00000000-0000-0000-0000-000000000000/flow con un cuerpo que contiene el campo data y un template.code.value inerte | Decisión de enrutamiento a continuación. |
| Estado | Cuerpo contiene | Veredicto |
|---|
404 | flow / public | VULNERABLE — el manejador aceptó data, la búsqueda falló porque el UUID es falso. |
200 | job_id / build / task | VULNERABLE — el manejador aceptó data y entró en la ruta de construcción. |
5xx | exec / Component / traceback | VULNERABLE — el manejador alcanzó la ruta de código exec antes de fallar. |
422 | Field required / extra / data | PARCHEADO — la firma del manejador ya no acepta data. |