flawopen.com/Teardowns/cve-2026-5027-langflow-multipart-file-write
Langflow CVE-2026-5027: traversal en cargas multipart
CVE-2026-5027 permitía escribir fuera del área de Langflow por traversal de rutas. GTIG informa explotación; actualice a 1.9.0+.[1], [2], [6]
Una sala de correo acepta un paquete cuyo remitente elige la etiqueta y el destino. Si el empleado añade esa etiqueta a la carpeta sin comprobar la ruta final, el paquete puede terminar fuera de la sala. La ruta de carga de Langflow confiaba en el nombre multipart y el almacenamiento no verificaba por separado que el destino siguiera dentro de la carpeta permitida.[2], [3]
Conceptos Clave y Términos
CVE-2026-5027- Identificador asignado por Tenable a un path traversal en el nombre multipart de POST /api/v2/files de Langflow:
CWE-22, CVSS 3.1 8,8 y privilegios bajos requeridos.[1], [2] Nombre multipart- Nombre enviado por el cliente en Content-Disposition de una carga multipart. Es entrada no confiable, no una ruta segura.[1], [2]
Mapeos de marcos
- Referencia CWE para la debilidad descrita en esta guía: CWE-22
Análisis de Causa Raíz
El registro CVE-2026-5027 de Tenable describe POST /api/v2/files aceptando un nombre multipart con componentes de traversal y escribiendo fuera del directorio previsto. El límite de seguridad abarca la ruta API y el almacenamiento local: validar parámetros de URL no valida un nombre leído de Content-Disposition, y concatenarlo con una carpeta no demuestra contención. El vector CVE requiere privilegios bajos (PR:L); no afirmes que la propia CVE evita la autenticación. Google GTIG incluye CVE-2026-5027 entre vulnerabilidades con explotación confirmada en el entorno real, pero su resumen público no demuestra una ejecución de código universal. La escritura arbitraria puede tener consecuencias mayores según las rutas escribibles, los privilegios del proceso y la configuración; trátalas como impacto condicional, no como RCE garantizada. El GHSA relacionado de Langflow enumera CVE-2026-33309 y también apunta a la corrección 1.9.0. Este artículo sigue CVE-2026-5027 según Tenable y GTIG y deja explícita la discrepancia de identificadores. El PR integrado valida nombres en la API y aplica contención canónica en almacenamiento, incluso antes de crear directorios.[1], [2], [3], [4], [5], [6]
Flujo de Ataque Paso a Paso
Código Fuente: Vulnerable vs. Seguro
Son ejemplos reducidos con forma similar al código fuente, no un diff literal del upstream. La ruta vulnerable trata el nombre del cliente como una ruta de almacenamiento. El patrón corregido valida el nombre y comprueba el destino canónico respecto a la raíz canónica en almacenamiento; el PR upstream también rechaza separadores y controles y verifica la contención antes de crear directorios. Conserva la verificación en almacenamiento aunque la capa HTTP valide la entrada. El ejemplo requiere una versión compatible de Python con Path.is_relative_to y no elimina por sí solo las carreras entre comprobación y uso en directorios escribibles por un atacante. En producción usa operaciones resistentes a carreras y permisos restrictivos. La defensa es contener la ruta, no solo bloquear ciertos nombres.[3], [2], [4], [7]
Fragmento de origen: Langflow api/v2/files.py y services/storage/local.py — ejemplo reducido del límite de seguridad
# Ejemplo reducido del flujo de datos vulnerable.
new_filename = file.filename
file_path = folder_path / new_filename
await write_upload(file, file_path)
from pathlib import Path
def confined_upload_path(root: Path, client_name: str | None) -> Path:
name = Path(client_name or "").name
if not name or name in {".", ".."} or chr(0) in name:
raise ValueError("invalid upload filename")
base = root.resolve()
target = (base / name).resolve()
if not target.is_relative_to(base):
raise ValueError("upload path escapes storage root")
return target
# Llame aquí en el límite de almacenamiento, justo antes de crear o escribir.
target = confined_upload_path(upload_root, file.filename)
await write_upload(file, target)
Lista de Verificación de Seguridad para Ingeniería
- ✓Actualiza Langflow a 1.9.0 o posterior y verifica las versiones instaladas de langflow y langflow-base en la imagen desplegada.[2], [4]
- ✓Valida los nombres multipart por separado de los parámetros URL; rechaza separadores, controles, nombres vacíos y codificaciones inválidas.[1], [2], [3]
- ✓Resuelve el destino y aplica contención canónica bajo la raíz de carga en almacenamiento, antes de crear directorios o escribir archivos.[3], [4], [7]
- ✓Prueba traversal, rutas absolutas, separadores alternativos, bytes nulos, Unicode y destinos con symlinks; comprueba que nada aparece fuera de una raíz temporal.[3], [7]
- ✓Ejecuta Langflow con una cuenta dedicada de privilegio mínimo y mantén las cargas sin permiso de ejecución y separadas del código, tareas programadas y credenciales.[2], [4]
- ✓Revisa exposición a Internet y registros de carga; investiga nombres inesperados fuera de la raíz y rota secretos solo si hay indicios de acceso al host.[6], [2]
- ✓Mantén explícito el mapeo: Tenable/GTIG usan
CVE-2026-5027; el GHSA relacionado de Langflow enumeraCVE-2026-33309. No combines gravedad o versiones afectadas sin verificar los registros.[1], [2], [4], [5], [6]
Fuentes
- Registro CVE — CVE-2026-5027
- Tenable TRA-2026-26 — path traversal en carga multipart de Langflow
- PR integrado de Langflow #12227 — validación de nombres y contención de rutas
- Langflow GHSA-g2j9-7rj2-gm6c — aviso relacionado, CVE-2026-33309
- Registro CVE — CVE-2026-33309
- Google GTIG — tendencias de descubrimiento y explotación en la era de la IA
- MITRE CWE-22 — limitación incorrecta de ruta a un directorio restringido