In this article
Explorando servidores MCP vulneráveis a injeção de comandos
Os servidores MCP estão conquistando o mundo. Permitir que LLMs ampliem seus recursos com servidores MCP é um fluxo de trabalho cada vez mais adotado, mas a que custo? O que acontece quando você adiciona servidores MCP aos seus fluxos de trabalho com IA agentiva e LLMs, sujeitos a várias vulnerabilidades de segurança?
Servidores MCP podem ser usados em aplicações de IA do dia a dia, como Claude Desktop e Raycast. Ainda assim, podem representar um risco maior quando combinados com programação assistida por IA e fluxos de trabalho de desenvolvimento de software autônomo.
Boas práticas para desenvolver com IA com segurança
10 dicas para ajudar desenvolvedores e profissionais de segurança a mitigar riscos potenciais com eficiência e aproveitar ao máximo os benefícios do desenvolvimento com IA.
Por que servidores MCP vulneráveis representam um risco para desenvolvedores de software
Desenvolvedores usam servidores MCP para ampliar seus recursos de programação assistida por IA e sessões de vibe coding, por exemplo, integrando-se ao GitHub para buscar informações sobre issues em um repositório de código.

Ao mesmo tempo, o notebook de um desenvolvedor costuma ser um alvo muito visado por agentes maliciosos, pois geralmente contém chaves de API, credenciais, propriedade intelectual e outras informações confidenciais de ambientes com privilégios elevados, bancos de dados e infraestrutura em nuvem.
Agora, pense também na rotina agitada dos desenvolvedores e nas frequentes mudanças de contexto que fazem parte do trabalho. Nesse ambiente acelerado, é fácil tomar decisões precipitadas e agir no piloto automático em muitas tarefas do dia a dia:
Adicionando uma nova dependência de código aberto para resolver uma tarefa? Abra o terminal e execute
npm install <package>Adicionando um novo servidor MCP? Abra o arquivo de definição MCP do Cursor
.cursor/mcp.jsone defina um novo servidor
Infelizmente, desenvolvedores nem sempre dedicam a atenção e a revisão necessárias para auditar o código-fonte de dependências de terceiros que adicionam a um projeto. O mesmo vale para o código-fonte dos servidores MCP.
Servidor MCP vulnerável
Vamos criar um servidor MCP simples que adota intencionalmente práticas de programação vulneráveis e inseguras.
Esse servidor MCP oferecerá aos clientes MCP, como o Cursor, recursos para consultar informações sobre pacotes no registro do npm.
Veja a seguir o código-fonte principal da funcionalidade de consulta de pacotes npm disponibilizada por meio de um servidor MCP:
const server = new McpServer({
name: "npm JavaScript package management tools",
version: "1.0.0",
description: "Provides tools to get information about open source npm packages from the npmjs registry"
});
server.tool(
"getNpmPackageInfo",
"Get information about an npm package",
{
packageName: z.string()
},
async ({ packageName }) => {
const output = execSync(`npm view ${packageName}`, {
encoding: "utf-8",
});
return {
content: [
{
type: "text",
text: output
},
],
};
}
);Defina um novo servidor MCP para o Cursor
Então, o que acontece quando desenvolvedores adicionam um novo servidor MCP ao Cursor, VS Code ou a outros IDEs? Vamos adicionar um servidor MCP local baseado em um processo executado por um ambiente de execução Node.js:
{
"mcpServers": {
"npm-package-info": {
"command": "node",
"args": ["/Users/lirantal/projects/repos/mcp-server-npm"]
}
}Agora, vamos mostrar como esse servidor MCP pode seguir práticas de programação inseguras que levariam a um ataque de injeção de comandos.
Se fizermos uma solicitação em uma aba do Cursor, ela pode ser assim:
What is the last release date of the nodemon npm packageO Cursor consultará as ferramentas disponíveis e encontrará uma chamada getNpmPackageInfo, que poderá invocar. Essa ferramenta espera uma string com o nome do pacote. Ela extrairá a string nodemon da nossa solicitação e chamará a ferramenta com esse parâmetro.
Mas e se a solicitação incluir caracteres de shell de injeção de comandos que contornem o comando npm info <package name> e criem um novo comando?
O que é uma injeção de comandos? Resumidamente, em programas Node.js do lado do servidor, isso acontece quando uma entrada fornecida pelo usuário é incorporada diretamente a um comando do sistema executado pelo servidor MCP, sem a devida sanitização. Isso permite que um invasor modifique o comando pretendido e execute comandos arbitrários do sistema operacional no servidor.
Considere a seguinte prova de conceito, que pede ao Cursor para buscar informações sobre a biblioteca react; touch /tmp/hi:

Isso acontece por causa do código vulnerável no servidor MCP, que usa APIs de processos filhos do Node.js da seguinte forma:
const output = execSync(`npm view ${packageName}`, {
encoding: "utf-8",
});Invasores podem elaborar uma solicitação interagindo com o chat de diferentes maneiras (por exemplo, usando regras do Cursor envenenadas e outras técnicas), o que pode resultar em uma injeção de comandos.
Explorando vulnerabilidades de injeção de comandos em servidores MCP
Em resumo, o vídeo a seguir demonstra como invasores podem explorar servidores MCP vulneráveis para realizar ataques de injeção de comandos:

Se você estiver desenvolvendo servidores MCP em Python ou Golang, recomendo muito que se informe sobre como reduzir essas vulnerabilidades de injeção de comandos:
Comece gratuitamente a usar as ferramentas de segurança de código com IA da Snyk
Não é necessário cartão de crédito.
Crie uma conta com Bitbucket e confira outras opções
Ao usar a Snyk, você concorda em cumprir nossas políticas, incluindo nossos Termos de Serviço e nossa Política de Privacidade.