FlawOpen

flawopen.com/Teardowns/cve-2026-5027-langflow-multipart-file-write

● CVE-2026-5027 · CVSS 8.8[1], [2] · Alta
Investigación · FlawOpen

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]

Vector CVSSCVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H[1], [2]
💡 Explicación en Lenguaje Sencillo (ELI5)

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]
Contención de rutas
Comprobación que resuelve la ruta candidata y demuestra que permanece bajo el directorio autorizado antes de crear o escribir archivos.[3], [4], [7]
Nota sobre identificadores
El GHSA relacionado de Langflow enumera CVE-2026-33309, mientras que Tenable y Google GTIG usan CVE-2026-5027. Este artículo sigue el identificador de GTIG y conserva ambos registros en las fuentes sin combinar sus metadatos.[4], [5], [6]

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

Paso 1

Un usuario de bajo privilegio alcanza la API de carga

El vector CVSS de CVE-2026-5027 requiere privilegios bajos. La ruta afectada es POST /api/v2/files; el registro no demuestra un bypass de autenticación.[1], [2]

Paso 2

La solicitud envía un nombre multipart

El nombre procede de metadatos Content-Disposition controlados por el cliente. Validar parámetros URL no sanea esta entrada independiente.[1], [2], [4]

Paso 3

La ruta cruza el límite de almacenamiento

Sin verificar la contención canónica, los componentes de traversal pueden resolverse fuera de la carpeta de carga.[1], [2], [3], [7]

Paso 4

Se escribe un archivo fuera de la raíz

El impacto documentado es escritura arbitraria. La ejecución de código depende de las rutas escribibles, privilegios y despliegue; no presupongas que toda carga produce RCE.[1], [2], [6]

Paso 5

Corrige ambos límites de validación

Langflow integró validación de nombres en la API y contención canónica en almacenamiento para la línea 1.9.0. Actualiza y comprueba los paquetes y la imagen activa.[2], [3], [4]

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

IMPLEMENTACIÓN VULNERABLE
# Ejemplo reducido del flujo de datos vulnerable.
new_filename = file.filename
file_path = folder_path / new_filename
await write_upload(file, file_path)
PARCHE SEGURO Y ROBUSTO
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

Fuentes