Path traversal en Langflow: borrado de directorios arbitrarios del servidor
Un path traversal en la API de borrado de bases de conocimiento de Langflow permite a un usuario autenticado eliminar directorios en cualquier lugar donde el proceso pueda escribir. Corregido en 1.9.0; las versiones 1.8.4 y anteriores están expuestas.
¿Qué es esto?
Langflow es una plataforma de código abierto ampliamente desplegada para construir flujos de trabajo de LLM y agentes, con una gran base instalada de instancias expuestas a Internet. Los mantenedores publicaron un aviso de seguridad (GHSA-9whx-c884-c68q) que describe un path traversal en la API de bases de conocimiento que permite a un usuario autenticado eliminar directorios arbitrarios en el servidor. La falla afecta a Langflow 1.8.4 y versiones anteriores y se corrige en 1.9.0. Resurgió en la inteligencia de vulnerabilidades en julio de 2026, junto a una ola más amplia de avisos sobre Langflow y Ollama, un buen recordatorio de que las instancias expuestas suelen ir muy por detrás de la versión corregida.
Este es un análisis defensivo de un problema divulgado y corregido. No reproduce ningún exploit funcional: el objetivo es entender la clase de fallo y saber cómo evitarlo en el propio código.
Cómo funciona
La vulnerabilidad reside en el manejador de borrado masivo de bases de conocimiento: el endpoint DELETE /api/v1/knowledge_bases, implementado por la función delete_knowledge_bases_bulk en src/backend/base/langflow/api/v1/knowledge_bases.py.
La causa raíz es un patrón clásico de path traversal (CWE-22). El manejador toma una lista de nombres de bases de conocimiento suministrada por el usuario y la concatena directamente en una ruta del sistema de archivos, y luego pasa el resultado a un borrado recursivo (shutil.rmtree()), sin comprobar que la ruta resuelta permanezca dentro del directorio previsto del usuario. Otros endpoints pasan por un ayudante seguro (_resolve_kb_path()), pero el borrado masivo lo omitía por completo.
# Forma vulnerable (simplificada, ilustrativa)
for name in kb_names: # controlado por el atacante
target = base_dir / name # sin comprobación de contención
shutil.rmtree(target) # borrado recursivo fuera de alcance
# Un nombre con una secuencia de traversal "../" se resuelve
# FUERA de base_dir: el borrado escapa del directorio del usuario.
Como un campo de nombre puede llevar una secuencia de traversal ../, la ruta calculada sale del entorno aislado y el borrado recursivo cae donde apunta la secuencia, incluidos los datos de otro inquilino o rutas en cualquier otra parte del host. Sin corrupción de memoria, sin ejecución de código: solo concatenación de cadenas que alimenta una llamada de archivo destructiva.
Por qué importa
El impacto puntuado afecta a la integridad y la disponibilidad, no a la confidencialidad: esto destruye datos en lugar de leerlos. El aviso lo califica como crítico (CVSS 9.6), con vector de red, baja complejidad de ataque y solo privilegios bajos requeridos (cualquier usuario autenticado).
Destacan tres consecuencias. Primero, un radio de impacto entre inquilinos: en una instancia multiusuario compartida, una cuenta autenticada puede borrar los directorios de bases de conocimiento de otro inquilino. Segundo, interrupción del servicio y pérdida de datos: el borrado puede eliminar archivos de la aplicación, cachés de modelos, configuración o copias de seguridad colocadas junto a ellos que el proceso pueda escribir, dejando la instancia potencialmente irrecuperable. Tercero, exposición a gran escala: las instancias de Langflow suelen ser accesibles desde Internet, y muchas funcionan tras una autenticación débil o por defecto, de modo que «autenticado» es una barrera más baja de lo que parece.
El patrón trasciende a Langflow. Cualquier API que permita a un cliente nombrar un recurso y luego asigne ese nombre al sistema de archivos —para subidas, exportaciones, cachés o borrados— acarrea el mismo riesgo si confía en el nombre.
Defensas
La corrección y la lección general son la misma: nunca confíes en un nombre suministrado por el cliente como componente de ruta, y confirma siempre que la ruta resuelta permanezca dentro de su raíz autorizada.
- Actualiza a Langflow 1.9.0 o posterior. Es la remediación directa. La corrección (PR #12243) normaliza la ruta suministrada con
Path.resolve()y valida que comience bajo el directorio del usuario autenticado antes de borrar; un seguimiento reforzó la comprobación conPath.is_relative_to()para evitar errores de ambigüedad de prefijo. - Aplica contención de rutas en tus propias API de archivos. Resuelve la ruta candidata y afirma
resolved.is_relative_to(base_dir)antes de cualquier lectura, escritura o borrado. Rechaza de plano los nombres que contengan separadores o secuencias de traversal en lugar de intentar depurarlos. - Ejecuta el proceso con mínimo privilegio. Un traversal destructivo solo puede alcanzar lo que la cuenta de servicio pueda escribir. Aísla los directorios de datos, retira los permisos de escritura en las rutas de aplicación y de copia de seguridad, y mantén las copias fuera del mismo sistema de archivos.
- No expongas la superficie admin/API a redes no confiables. Coloca Langflow tras autenticación fuerte y segmentación de red; trata cualquier instancia accesible desde Internet como prioridad de parcheo.
- Alerta sobre borrados recursivos y firmas de traversal. Registra las llamadas de borrado de bases de conocimiento y vigila las secuencias
..o separadores en los parámetros de nombre como señal de detección.
Estado
| Elemento | Detalle |
|---|---|
| Afectado | Langflow ≤ 1.8.4 |
| Corregido en | Langflow 1.9.0 |
| Debilidad | CWE-22 (path traversal), impacto en integridad/disponibilidad |
| Severidad | Crítica, CVSS 9.6 (AV:N/AC:L/PR:L/UI:N/S:C/C:N/I:H/A:H) |
| Referencia | CVE-2026-42048 · GHSA-9whx-c884-c68q |
| Divulgación | Aviso publicado el 27 de abril de 2026; cobertura renovada en julio de 2026 |
La corrección oficial no requiere herramientas propietarias: actualiza a 1.9.0, aplica contención de rutas en todo endpoint de manejo de archivos del que seas responsable, y limita la cuenta de servicio para que un traversal no tenga nada valioso que destruir.