flawopen.com/Teardowns/cve-2026-105697-langflow-mcp-stdio-command-injection
CVE-2026-105697: injeção de comandos no MCP do Langflow
Antes da versão 1.10.3, o Langflow encaminhava a configuração MCP stdio a um processo iniciado por shell. Em uma instância exposta com LANGFLOW_AUTO_LOGIN=true, um invasor podia obter um token sem credenciais; com o auto-login desativado, um usuário autenticado sem privilégios de administrador ainda podia chegar à execução de comandos no host. A versão 1.10.3 valida todos os caminhos, inclusive imediatamente antes da criação do processo, e o inicia sem shell.[1], [2], [3]
Imagine um funcionário que recebe uma frase em que a pontuação pode mudar a tarefa: um sinal pode transformar a instrução de entrega em uma segunda ordem. O Langflow enviava o comando configurado a um shell que interpreta essa sintaxe como controle, em vez de tratar o executável e os argumentos como dados separados. A correção valida o comando permitido e inicia o programa diretamente, sem shell.[1], [2]
Conceitos Centrais e Termos
Transporte MCP stdio- Inicia um servidor MCP como processo filho local e troca mensagens por entrada e saída padrão.[1], [2]
Injeção de comandos (CWE-78)- Texto controlado externamente altera o comando do sistema operacional enviado ao shell ou ao iniciador de processos.[1], [5]
Mapeamentos de frameworks
- Referência CWE para a fraqueza descrita neste guia: CWE-78
Análise de Causa Raiz
Antes da versão 1.10.3, a configuração MCP stdio combinava o comando e os argumentos em uma string e iniciava bash -c com esse conteúdo. A API de configurações recebeu lista permitida e validação de argumentos e ambiente na versão 1.9.0, mas configurações MCP Tools embutidas em fluxos ou tweaks podiam contornar essa validação do modelo porque o ponto de execução não aplicava uma política compartilhada. A versão 1.10.3 centraliza a validação em lfx.base.mcp.security.validate_mcp_stdio_config, aplica-a à API, aos fluxos, tweaks, ao componente legado e imediatamente antes da criação do processo, além de remover o shell. CVE-2026-105697 é CWE-78, CVSS 3.1 9.9. Com o login automático desativado, ainda é necessário um usuário autenticado sem privilégios de administrador que possa configurar ou executar o caminho MCP relevante; o login automático padrão pode deixar instâncias de desenvolvimento expostas sem credenciais.[1], [2], [4], [5]
Fluxo de Ataque Passo a Paso
Usuário alcança um caminho de configuração MCP
O aviso descreve acesso pelas configurações do servidor MCP ou por um flow que usa o componente MCP Tools. Em uma instância exposta com o padrão de desenvolvimento LANGFLOW_AUTO_LOGIN=true, um invasor podia obter um token sem credenciais. Com o auto-login desativado, um usuário autenticado sem privilégios de administrador ainda pode ser suficiente.[1]
Configuração chega à preparação do processo
Comando e argumentos viram command_str enquanto o Langflow prepara uma conexão MCP stdio.[1]
Shell interpreta a string
Antes da 1.10.3, o caminho usava bash -c; a execução ocorria ao tentar conectar, antes de um handshake MCP bem-sucedido.[1]
Verificações de entrada são incompletas
A versão 1.9.0 valida configurações REST, mas flow e tweak podem contornar essa validação do modelo.[1]
Processo do host usa privilégios do Langflow
O comando é executado como usuário do serviço Langflow. A interface ainda pode informar falha ao iniciar o servidor MCP.[1]
Código-Fonte: Vulnerável vs. Seguro
O trecho vulnerável mostra o padrão de inicialização via shell documentado no aviso; não é uma exploração executável. O trecho corrigido resume o projeto da versão 1.10.3: uma política compartilhada valida a configuração em cada entrada e novamente antes da criação do processo, enquanto a API recebe executável e argumentos separadamente. A inicialização direta elimina a interpretação pelo shell, mas não torna todo executável ou pacote permitido seguro por si só; operadores também devem aplicar controles de origem de pacotes e isolamento adequados à implantação.[1], [2]
Trecho de origem: lfx/base/mcp/util.py — trechos de código focados
# Formato de inicialização afetado no aviso (trecho específico):
server_params = StdioServerParameters(
command="bash",
args=["-c", f"exec {command_str}"],
env=env_data,
)
# Redução baseada no código da versão 1.10.3: valide a política e inicie o processo diretamente.
command_parts = shlex.split(command_str)
if not command_parts:
raise ValueError("MCP stdio command is required")
command, args = command_parts[0], command_parts[1:]
validate_mcp_stdio_config(command, args, env_data) # Repeat at the execution boundary.
server_params = StdioServerParameters(
command=command,
args=args,
env=env_data,
) # No shell wrapper. The shared validator rejects disallowed configurations.
Lista de Verificação de Segurança para Engenharia
- ✓Atualize
langflowpara 1.10.3+,langflow-basepara 0.10.3+ elfxpara 1.10.3+; confirme as versões implantadas.[1], [3] - ✓Não considere as verificações REST da versão 1.9.0 uma correção completa; revise configurações MCP embutidas em flow e tweak nas versões antigas.[1]
- ✓Valide comando, argumentos, ambiente, origem do pacote e isolamento em cada entrada e imediatamente antes da criação do processo.[1], [2]
- ✓Envie executável e vetor de argumentos em campos separados à API de processos; evite montar comandos para shell.[2]
- ✓Em implantações multi-tenant, fixe os pacotes permitidos para
npx/uvxe habilite as opções documentadas de hardening de interpretador e Docker.[1] - ✓Recomendação de resposta a incidentes da FlawOpen: Revise quem podia configurar ou executar conexões MCP stdio durante a exposição; investigue processos filhos inesperados do Langflow na telemetria do host.[1]
- ✓Inclua testes para API REST, flow, tweak, componente legado e pré-criação; confirme que configurações rejeitadas nunca iniciam processos.[2]