← voltar
CVE-2025-3248criticalsob ataqueransomwareCWE-306

Langflow < 1.3.0 Unauthenticated RCE via /api/v1/validate/code

100Vexday Risk Score

Corrija agora. Ela está sob exploração confirmada pelo CISA e tem exploit funcional público.

ssvc Actcvss 9.8epss 100%
da publicação à arma3 dias
Publicada no NVD7 de abr.
1ª PoC+3d
metasploit+2d
CISA KEV+28d
probabilidade de exploração
100%top 1% das CVEs
exploração observada
simCISA + VulnCheck
53 exploit(s) público(s)
Ação exigida pela CISAprazo federal: 2025-05-26

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

Afetadas
Langflow anterior a 1.3.0 (todas as versões < 1.3.0, incluindo a linha 1.2.x analisada publicamente).
Corrigidas em
Langflow 1.3.0, lançado em 2025-03-31, via PR #6911 que adiciona autenticação obrigatória (CurrentActiveUser) na rota POST /api/v1/validate/code.

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.

Pesquisado e redigido com IA a partir do advisory do fornecedor e de análises públicas, com as fontes acima. Confira sempre a versão corrigida no advisory oficial antes de agir.
Langflow versions prior to 1.3.0 are susceptible to code injection in the /api/v1/validate/code endpoint. A remote and unauthenticated attacker can send crafted HTTP requests to execute arbitrary code.
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
Produtos afetados
langflow-ai · langflow
PoCs públicas encontradas53
exploitdbwww.exploit-db.com/exploits/52364não verificadoexploitdbwww.exploit-db.com/exploits/52262não verificadogithubgithub.com/ynsmroztas/CVE-2025-3248-Langflow-RCE17githubgithub.com/verylazytech/CVE-2025-324810githubgithub.com/xuemian168/CVE-2025-324810githubgithub.com/0-d3y/langflow-rce-exploit7githubgithub.com/dennisec/Mass-CVE-2025-32483githubgithub.com/drackyjr/cve-2025-3248-exploit3githubgithub.com/vigilante-1337/CVE-2025-32482githubgithub.com/imbas007/CVE-2025-32482githubgithub.com/EQSTLab/CVE-2025-32482githubgithub.com/PuddinCat/CVE-2025-3248-POC2githubgithub.com/Vip3rLi0n/CVE-2025-32481githubgithub.com/Praison001/CVE-2025-32481githubgithub.com/tiemio/RCE-CVE-2025-32481githubgithub.com/zapstiko/CVE-2025-32481githubgithub.com/r0otk3r/CVE-2025-32481githubgithub.com/b0ySie7e/CVE-2025-3248-POC1githubgithub.com/ill-deed/Langflow-CVE-2025-3248-Multi-target0githubgithub.com/wand3rlust/CVE-2025-32480githubgithub.com/dennisec/CVE-2025-32480githubgithub.com/12-test-12/CVE-2025-32480githubgithub.com/nebari-playground/langflow-cve-2025-32480githubgithub.com/Atomics-hub/exposecheck0githubgithub.com/0xgh057r3c0n/CVE-2025-32480githubgithub.com/min8282/CVE-2025-32480cve_referencewww.horizon3.ai/attack-research/disclosures/unsafe-at-any-speed-abusing-python-exec-for-unauth-rce-in-langflow-ai/não verificadovulncheckvulncheck.com/xdb/58f291eee1denão verificadovulncheckvulncheck.com/xdb/288fea3e2ebfnão verificadovulncheckvulncheck.com/xdb/5bba2deca1c3não verificadovulncheckvulncheck.com/xdb/cd6d4cd25599não verificadovulncheckvulncheck.com/xdb/2098ab2f7185não verificadovulncheckvulncheck.com/xdb/f4d3bcf9f10fnão verificadovulncheckvulncheck.com/xdb/93417d485096não verificadovulncheckvulncheck.com/xdb/be18e792efe8não verificadovulncheckvulncheck.com/xdb/145490c5ce6fnão verificadovulncheckvulncheck.com/xdb/36d353279df8não verificadovulncheckvulncheck.com/xdb/ad786ecce441não verificadovulncheckvulncheck.com/xdb/e3068430fa4dnão verificadovulncheckvulncheck.com/xdb/631b46774fd7não verificadovulncheckvulncheck.com/xdb/8ae92c1bc671não verificadovulncheckvulncheck.com/xdb/e7c172788c42não verificadovulncheckvulncheck.com/xdb/ee9c80f0dd42não verificadovulncheckvulncheck.com/xdb/efad80d04720não verificadovulncheckvulncheck.com/xdb/3e9d384f80eenão verificadovulncheckvulncheck.com/xdb/a72c4ca01c3dnão verificadovulncheckvulncheck.com/xdb/05d95ecf10d9não verificadovulncheckvulncheck.com/xdb/bc487190c5b1não verificadovulncheckvulncheck.com/xdb/68b57b9315a2não verificadovulncheckvulncheck.com/xdb/25e094423db0não verificadovulncheckvulncheck.com/xdb/c8205b76d58bnão verificadovulncheckvulncheck.com/xdb/684115e325dbnão verificadovulncheckvulncheck.com/xdb/fe2de4ea8e83não verificado
⚠ Recursos públicos, para você avaliar a exposição de sistemas que controla ou está autorizado a testar. Teste apenas com autorização.