Langflow < 1.3.0 Unauthenticated RCE via /api/v1/validate/code
Corrija agora. Ela está sob exploração confirmada pelo CISA e tem exploit funcional público.
Apply mitigations per vendor instructions, follow applicable BOD 22-01 guidance for cloud services, or discontinue use of the product if mitigations are unavailable.
Resumo
Langflow, plataforma open source para construção de agentes de IA com interface visual, expõe o endpoint POST /api/v1/validate/code sem qualquer verificação de autenticação nas versões anteriores à 1.3.0. Um atacante remoto e não autenticado consegue executar código Python arbitrário no processo do servidor enviando um único request HTTP, resultando em comprometimento total do host. A CVSS 9.8 é justificada: não há pré-condição relevante além de acesso de rede ao endpoint, e a exploração já é confirmada em campo (KEV da CISA).
Detalhamento técnico
A falha (CWE-306, ausência de autenticação em função crítica) está na função validate_code() em src/backend/base/langflow/utils/validate.py. O endpoint recebe um campo "code" em JSON, faz parsing com o módulo ast e extrai nós ast.Import e ast.FunctionDef. Imports são resolvidos via importlib.import_module, o que por si só não é diretamente explorável sem conseguir gravar um arquivo Python no path de módulos do interpretador. O problema real está nos FunctionDef: eles são validados via compile() e exec(), e em Python, executar uma definição de função (def) já avalia, no momento da definição, as expressões dos decorators e dos valores default dos parâmetros — antes mesmo de a função ser chamada.
Isso abre duas rotas de execução de código sem nunca invocar a função definida: colocar o payload dentro de uma expressão de decorator (ex.: @exec("...") acima de um def) ou dentro do valor default de um argumento (ex.: def foo(x=exec("..."))). Em ambos os casos, o exec()/subprocess/os.system embutido roda no processo do servidor no instante em que o AST da função é compilado e executado pela rotina de validação, retornando controle total sobre comandos do sistema operacional.
O detalhe crítico que a manchete não deixa claro: esse endpoint não checava usuário autenticado mesmo quando o Langflow estava configurado com autenticação habilitada — era uma lacuna isolada de auth naquela rota específica, não uma falha de design geral do produto (que já expõe execução de código como funcionalidade para usuários autenticados, por design, sem sandbox).
Como é explorada
O vetor é um POST HTTP direto para /api/v1/validate/code com corpo JSON contendo o campo "code". Não é necessário token, sessão ou cookie — o pré-requisito único é alcançar a porta onde a API do Langflow está exposta. A pesquisa da Horizon3.ai confirma que a exploração funciona mesmo em instâncias com autenticação habilitada, porque a falha está na ausência de checagem de auth nessa rota específica, não na configuração geral do produto.
Existem duas técnicas públicas documentadas: embutir o payload numa expressão de decorator sobre uma função dummy, ou embutir o payload no valor default de um parâmetro de função. Ambas fazem o interpretador Python avaliar a expressão maliciosa (tipicamente um exec() chamando subprocess/os.system) no momento em que a definição da função é processada pela rotina de validação do Langflow, sem precisar chamar a função de fato. Isso permite tanto execução one-shot (reverse shell) quanto exfiltração interativa via exceções que retornam a saída de comandos no corpo da resposta HTTP.
A exploração é trivial (baixa complexidade, um único request, sem interação do usuário) e já está confirmada em campo: a CVE está no catálogo KEV da CISA por exploração ativa, tem PoC pública, módulo Metasploit e template Nuclei disponíveis. O resultado final é execução arbitrária de código como o usuário do sistema operacional que roda o processo Langflow, incluindo leitura de variáveis de ambiente e credenciais do superusuário da própria aplicação.
Versões
Como se proteger
Atualizar para Langflow 1.3.0 ou superior, lançado em 31/03/2025. O fix (PR #6911) vincula a dependência CurrentActiveUser à rota POST /api/v1/validate/code, exigindo usuário autenticado antes de o FastAPI processar o corpo da requisição e invocar validate_code(). Essa é a única mitigação que trata a causa raiz.
Se a atualização não for imediata, o paliativo real é restringir o acesso de rede ao endpoint/API do Langflow — não expor a instância diretamente à internet, colocar um proxy reverso ou controle de rede na frente que exija autenticação para qualquer requisição a /api/v1/validate/code, ou isolar a aplicação numa rede segmentada sem acesso externo. Esses controles têm custo operacional (quebram integrações externas legítimas com a API) mas fecham a superfície de ataque enquanto a atualização não ocorre.
Mito a descartar: habilitar a autenticação nativa do Langflow (AUTO_LOGIN/LANGFLOW_AUTO_LOGIN desabilitado, credenciais configuradas) não protege contra esta CVE em versões anteriores à 1.3.0 — foi exatamente esse cenário, com autenticação habilitada, que a Horizon3.ai testou e confirmou explorável, porque a checagem de auth simplesmente não existia nessa rota específica.
Como detectar
Buscar em logs de acesso/WAF por requisições POST para /api/v1/validate/code cujo corpo JSON contenha construções Python fora do padrão normal de validação de componente: expressões de decorator ("@exec(", "@__import__(") logo antes de um "def", ou definições de função com valor default de parâmetro contendo exec(, subprocess, os.system ou __import__. O template Nuclei público usa exatamente esse padrão para ler /etc/passwd via "raise Exception(__import__(\"subprocess\").check_output(...))", e é um bom indicador de assinatura para IDS/WAF.
Não há sinal de rede diferenciável (a requisição é um POST JSON comum, sem cabeçalhos anômalos) além do conteúdo do payload em si — se a aplicação não registra o corpo das requisições ou se o tráfego está criptografado sem inspeção TLS, não há forma confiável de detectar tentativas retroativamente a partir de logs padrão.