In this article
Explotación de servidores MCP vulnerables a la inyección de comandos
Los servidores MCP están causando sensación en todo el mundo. Permitir que los LLM amplíen sus capacidades mediante servidores MCP es un flujo de trabajo cada vez más adoptado, pero ¿a qué costo? ¿Qué ocurre cuando agregas servidores MCP a tus flujos de trabajo de IA agéntica y LLM, expuestos a diversas vulnerabilidades de seguridad?
Los servidores MCP pueden usarse en aplicaciones cotidianas de IA, como Claude Desktop y Raycast. Sin embargo, pueden representar un mayor nivel de amenaza cuando se combinan con la programación asistida por IA y los flujos de trabajo de desarrollo de software autónomo.
Buenas prácticas para desarrollar con IA de forma segura
10 consejos para ayudar a desarrolladores y profesionales de seguridad a mitigar eficazmente los posibles riesgos y aprovechar al máximo los beneficios del desarrollo con IA.
Por qué los servidores MCP vulnerables son un riesgo para los desarrolladores de software
Los desarrolladores usan servidores MCP para potenciar sus sesiones de programación asistida por IA y de vibe coding; por ejemplo, los integran con GitHub para obtener información sobre los problemas de un repositorio de código.

Al mismo tiempo, las laptops de los desarrolladores suelen ser un objetivo prioritario para actores maliciosos, porque a menudo contienen claves de API, credenciales, propiedad intelectual y otra información confidencial de entornos con altos privilegios, bases de datos e infraestructura en la nube.
Ahora, imagina también lo ocupados que están los desarrolladores y los frecuentes cambios de contexto que exige su trabajo. Este ritmo acelerado los hace más propensos a actuar con rapidez y sin pensarlo demasiado, y a realizar muchas tareas cotidianas en piloto automático:
¿Vas a agregar una nueva dependencia de código abierto para resolver una tarea? Abre la terminal y ejecuta
npm install <package>¿Vas a agregar un nuevo servidor MCP? Abre el archivo de definición de MCP de Cursor
.cursor/mcp.jsony define uno nuevo
Por desgracia, los desarrolladores no suelen dedicar el tiempo ni el rigor necesarios para auditar el código fuente de las dependencias de terceros que agregan a un proyecto. Lo mismo ocurre con el código fuente de los servidores MCP.
Servidor MCP vulnerable
Creemos un servidor MCP sencillo que utilice intencionalmente prácticas de programación vulnerables e inseguras.
Este servidor MCP proporcionará a clientes MCP, como Cursor, funciones para consultar información de paquetes en el registro de npm.
A continuación, se muestra el código fuente principal de la función de búsqueda de paquetes de npm disponible a través de un 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
},
],
};
}
);Define un nuevo servidor MCP para Cursor
Entonces, ¿qué ocurre si los desarrolladores agregan un nuevo servidor MCP a Cursor, VS Code u otros IDE? Agreguemos un servidor MCP local basado en un proceso ejecutado por el entorno de ejecución de Node.js:
{
"mcpServers": {
"npm-package-info": {
"command": "node",
"args": ["/Users/lirantal/projects/repos/mcp-server-npm"]
}
}A continuación, veremos cómo ese servidor MCP puede seguir prácticas de programación inseguras que darían lugar a un ataque de inyección de comandos.
Si escribimos una solicitud en una pestaña de Cursor como la siguiente:
What is the last release date of the nodemon npm packageCursor consultará las herramientas disponibles y encontrará una llamada getNpmPackageInfo que puede usar. Esta herramienta espera una cadena con el nombre de un paquete. Extraerá la cadena nodemon de nuestra solicitud y luego llamará a la herramienta con ese parámetro.
Pero ¿qué pasa si la solicitud incluye caracteres de shell de inyección de comandos que eluden el comando npm info <package name> y crean uno nuevo?
¿Qué es la inyección de comandos? En pocas palabras, en los programas de Node.js del lado del servidor, ocurre cuando la entrada proporcionada por el usuario se incorpora directamente a un comando del sistema que ejecuta el servidor MCP, sin la sanitización adecuada. Esto permite que un atacante modifique el comando previsto y ejecute comandos arbitrarios del sistema operativo en el servidor.
Considera la siguiente prueba de concepto, que le pide a Cursor que busque información sobre la biblioteca react; touch /tmp/hi:

Debido al código vulnerable del servidor MCP, que utiliza las API de procesos secundarios de Node.js de la siguiente manera:
const output = execSync(`npm view ${packageName}`, {
encoding: "utf-8",
});Los atacantes pueden crear una solicitud de distintas maneras en el chat (por ejemplo, mediante reglas de Cursor envenenadas y otras técnicas) que provoque una inyección de comandos.
Explotación de vulnerabilidades de inyección de comandos en servidores MCP
En resumen, el siguiente video muestra cómo los atacantes pueden explotar servidores MCP vulnerables para ejecutar ataques de inyección de comandos:

Si estás creando servidores MCP en Python o Golang, te recomiendo encarecidamente que leas cómo mitigar estas vulnerabilidades de inyección de comandos:
Comienza gratis con las herramientas de seguridad de código con IA de Snyk
No necesitas tarjeta de crédito.
Crea una cuenta con Bitbucket y accede a más opciones
Al usar Snyk, aceptas cumplir nuestras políticas, incluidos los Términos del servicio y la Política de privacidad.