FlawOpen

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

● CVE-2026-5027 · CVSS 8.8[1], [2] · Alta
Pesquisa · FlawOpen

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]

Vetor CVSSCVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H[1], [2]
💡 Explicação em Linguagem Simples (ELI5)

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]
Contenção de caminho
Verificação que resolve o caminho candidato e prova que ele permanece sob o diretório de armazenamento autorizado antes de criar ou gravar arquivos.[3], [4], [7]
Nota sobre identificadores
O GHSA relacionado do Langflow lista CVE-2026-33309, enquanto Tenable e Google GTIG usam CVE-2026-5027. Este artigo segue o identificador do GTIG e mantém os dois registros nas fontes, sem combinar seus metadados silenciosamente.[4], [5], [6]

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

Passo 1

Um usuário com privilégio baixo acessa o endpoint

O vetor CVSS de CVE-2026-5027 exige privilégio baixo. O caminho afetado é POST /api/v2/files; o registro não comprova bypass de autenticação.[1], [2]

Passo 2

A requisição envia um nome multipart

O nome vem de metadados Content-Disposition controlados pelo cliente. Validar parâmetros da URL não sanitiza essa entrada independente.[1], [2], [4]

Passo 3

O caminho cruza a fronteira de armazenamento

Sem validação de contenção canônica, componentes de travessia podem resolver para fora da pasta de upload.[1], [2], [3], [7]

Passo 4

Um arquivo é gravado fora da raiz

O impacto documentado é escrita arbitrária. Execução de código depende dos caminhos graváveis, dos privilégios do processo e da implantação; não presuma que todo upload gera RCE.[1], [2], [6]

Passo 5

Corrija as duas fronteiras

O Langflow mesclou validação de nome na API e contenção canônica no armazenamento para a linha 1.9.0. Atualize e verifique os pacotes e a imagem em execução.[2], [3], [4]

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

IMPLEMENTAÇÃO VULNERÁVEL
# Exemplo reduzido do fluxo de dados vulnerável.
new_filename = file.filename
file_path = folder_path / new_filename
await write_upload(file, file_path)
PATCH SEGURO E 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

# 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

Fontes