flawopen.com/Teardowns/cve-2026-5027-langflow-multipart-file-write
Langflow CVE-2026-5027: travessia de caminho em upload
A CVE-2026-5027 permitia gravar fora da área de upload do Langflow por travessia de caminho. GTIG relata exploração; atualize para 1.9.0+.[1], [2], [6]
Uma sala de correspondência aceita um pacote cujo remetente escolhe o rótulo e o destino. Se o atendente juntar esse rótulo ao caminho da sala sem conferir o endereço final, o pacote pode ser guardado fora dela. A rota de upload do Langflow confiava no nome multipart, e o armazenamento não comprovava por conta própria que o caminho final permanecia dentro da pasta autorizada.[2], [3]
Conceitos Centrais e Termos
CVE-2026-5027- Identificador atribuído pela Tenable para uma travessia de caminho no nome multipart de POST /api/v2/files do Langflow:
CWE-22, CVSS 3.1 8,8 e privilégio baixo exigido.[1], [2] Nome multipart- Nome fornecido pelo cliente no cabeçalho Content-Disposition de um upload multipart. É entrada não confiável, não um caminho seguro de arquivo.[1], [2]
Mapeamentos de frameworks
- Referência CWE para a fraqueza descrita neste guia: CWE-22
Análise de Causa Raiz
O registro CVE-2026-5027 da Tenable descreve POST /api/v2/files aceitando um nome multipart com componentes de travessia e gravando fora do diretório pretendido. A fronteira envolve a rota e o armazenamento local: validar parâmetros da URL não valida um nome lido do Content-Disposition multipart, e juntar esse nome à pasta não prova contenção. O vetor CVE exige privilégio baixo (PR:L); não afirme que a CVE em si contorna autenticação. O Google GTIG inclui CVE-2026-5027 entre vulnerabilidades com exploração confirmada em campo, mas seu resumo público não comprova execução de código universal. A escrita arbitrária pode ter consequências mais graves conforme os caminhos graváveis, privilégios e configuração; trate isso como impacto condicional, não como RCE garantida. O GHSA relacionado do Langflow lista CVE-2026-33309 e aponta para a correção 1.9.0. Este artigo segue CVE-2026-5027 conforme Tenable e GTIG e deixa explícita a diferença de identificadores. O PR mesclado do Langflow valida nomes na API e aplica contenção canônica na camada de armazenamento, inclusive antes de criar diretórios.[1], [2], [3], [4], [5], [6]
Fluxo de Ataque Passo a Paso
Código-Fonte: Vulnerável vs. Seguro
Estes exemplos reduzidos refletem o formato do código, mas não são um diff literal do upstream. O caminho vulnerável trata o nome enviado pelo cliente como caminho de armazenamento. O padrão corrigido valida o nome e verifica o destino canônico em relação à raiz canônica na camada de armazenamento; o PR upstream também rejeita separadores e caracteres de controle e verifica a contenção antes de criar diretórios. Mantenha a verificação no armazenamento mesmo que a camada HTTP valide a entrada. O exemplo requer uma versão de Python compatível com Path.is_relative_to e, sozinho, não elimina condições de corrida entre verificação e uso em diretórios graváveis por agentes hostis. Em produção, use operações de arquivo e diretório resistentes a corridas e permissões restritas. A defesa é contenção de caminho, não apenas uma lista de nomes proibidos.[3], [2], [4], [7]
Trecho de origem: Langflow api/v2/files.py e services/storage/local.py — exemplo reduzido da fronteira de segurança
# Exemplo reduzido do fluxo de dados vulnerável.
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
# Chame isto no limite do armazenamento, imediatamente antes de criar ou gravar.
target = confined_upload_path(upload_root, file.filename)
await write_upload(file, target)
Lista de Verificação de Segurança para Engenharia
- ✓Atualize o Langflow para 1.9.0 ou posterior e verifique as versões de langflow e langflow-base na imagem implantada.[2], [4]
- ✓Valide nomes multipart independentemente dos parâmetros da URL; rejeite separadores, caracteres de controle, nomes vazios e codificações inválidas.[1], [2], [3]
- ✓Resolva o destino e imponha contenção canônica sob a raiz de upload na camada de armazenamento, antes de criar diretórios e gravar arquivos.[3], [4], [7]
- ✓Teste travessia, caminhos absolutos, separadores alternativos, bytes nulos, Unicode e destinos simbólicos; confirme que nada aparece fora de uma raiz temporária.[3], [7]
- ✓Execute o Langflow com conta dedicada de privilégio mínimo e mantenha uploads não executáveis e separados do código, tarefas agendadas e credenciais.[2], [4]
- ✓Revise exposição à internet e logs de upload; investigue nomes inesperados fora da raiz e só rotacione segredos se houver indícios de acesso ao host.[6], [2]
- ✓Mantenha explícito o mapeamento: Tenable/GTIG usam
CVE-2026-5027; o GHSA relacionado do Langflow listaCVE-2026-33309. Não combine severidade ou versões afetadas sem confirmar os registros.[1], [2], [4], [5], [6]
Fontes
- Registro CVE — CVE-2026-5027
- Tenable TRA-2026-26 — travessia de caminho no upload multipart do Langflow
- PR mesclado do Langflow #12227 — validação de nome e contenção do caminho
- GHSA-g2j9-7rj2-gm6c do Langflow — aviso relacionado, CVE-2026-33309
- Registro CVE — CVE-2026-33309
- Google GTIG — tendências de descoberta e exploração na era da IA
- MITRE CWE-22 — limitação inadequada de caminho a diretório restrito