FlawOpen

flawopen.com/Teardowns/cve-2026-105697-langflow-mcp-stdio-command-injection

● CVE-2026-105697 · CVSS 9.9[1] · Crítica
Pesquisa · FlawOpen

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]

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

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]
Ponto de execução
Caminho final que cria um processo; a validação deve ocorrer aqui mesmo quando há verificações anteriores na API.[1], [2]
Configuração de flow/tweak
Configuração MCP incluída em um flow ou ajuste de execução, em vez de criada pela API de configurações.[1], [2]

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

Passo 1

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]

Passo 2

Configuração chega à preparação do processo

Comando e argumentos viram command_str enquanto o Langflow prepara uma conexão MCP stdio.[1]

Passo 3

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]

Passo 4

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]

Passo 5

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]

Passo 6

1.10.3 fecha o limite de execução

Uma política compartilhada valida cada entrada e o momento imediatamente anterior à criação do processo; o programa inicia sem shell.[1], [2]

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

IMPLEMENTAÇÃO VULNERÁVEL
# Formato de inicialização afetado no aviso (trecho específico):
server_params = StdioServerParameters(
    command="bash",
    args=["-c", f"exec {command_str}"],
    env=env_data,
)
PATCH SEGURO E ROBUSTO
# 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

Fontes