
Documenta CVE-2026-52618 con un PoC para la inyección de comandos del sistema operativo en @webfer/mcp-ansible-drupal a través de extraVars de executeDeployment, además de orientación de detección y mitigaciones.
executeDeploymentspawn(cmd[0], cmd.slice(1), { shell: true }) vuelve a unir un array de argumentos en una
única cadena /bin/sh -c sin escapar, por lo que un metacaracter de shell en un
valor de extraVars proporcionado a la herramienta MCP executeDeployment se ejecuta en el
host que ejecuta el servidor.
| CVE | CVE-2026-52618 |
| CWE | CWE-78 (Neutralización incorrecta de elementos especiales usados en un comando del SO) |
| Paquete | @webfer/mcp-ansible-drupal (npm) |
| Afectado | 2.0.0 |
| Corregido en | 2.0.3 (publicado el 2026-06-01) |
| CVSS v3.1 | AV:L/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H = 8.4 Alta (transporte stdio). AV:N → 9.8 Crítica si el servidor se envuelve en un transporte de red. |
| Reportado por | s1ko (github.com/s1ko, [email protected]) |
| CVE asignado | 2026-07-13, MITRE CNA-LR |
Este problema está corregido. Actualice a 2.0.3 o posterior.
Los argumentos de las herramientas MCP están influenciados por el atacante. Son producidos por un LLM a partir
del contenido que procesa el agente —documentos, páginas web, salida de herramientas—, por lo que
la inyección indirecta de prompts pone a un atacante en control de los valores que recibe un
manejador de herramientas. Un manejador que introduce cualquiera de esos valores en un shell convierte
esa influencia en ejecución de código en el host que ejecuta el servidor MCP. Este es
el mismo modelo que el caso precedente aws-mcp-server / CVE-2026-5058.
La consecuencia es que "el llamador es un LLM de confianza" no es una mitigación. Los argumentos de las herramientas son entrada no confiable.
src/helpers/runAnsible.ts en 2.0.0 construía un array de argumentos y luego lo ejecutaba
con el shell habilitado:
const proc = spawn(ansibleCmd[0], ansibleCmd.slice(1), { shell: true });
Con shell: true, Node no ejecuta ansibleCmd[0] con los elementos restantes como argv. En su lugar, une todo el array en una sola cadena y la entrega a /bin/sh -c, sin aplicar comillas ni escapes a los elementos. Por lo tanto, cualquier elemento que contenga ;, &&, |, backticks o $() se escapa del comando previsto.
La ruta alcanzable es la herramienta MCP executeDeployment (src/tools/executeDeployment.ts), que reenvía los extraVars proporcionados por el llamador al array como --extra-vars key=value. Un valor de ; touch /tmp/marker ; produce:
/bin/sh -c "ansible-playbook -i inv.ini play.yml ... --extra-vars deploy_env=; touch /tmp/marker ; echo INJECTED"
Un segundo sink en la misma versión interpolaba projectRoot en
execSync('ansible-vault encrypt ' + vaultPath).
poc/driver.mjs llama directamente a runAnsible con un
valor extraVars manipulado y comprueba la existencia del archivo marcador. No
es necesario tener ansible-playbook instalado — el comando inyectado se ejecuta en la misma cadena
/bin/sh -c independientemente de si el binario inicial se resuelve o no.
npm pack @webfer/[email protected] && tar xf webfer-mcp-ansible-drupal-2.0.0.tgz
node poc/driver.mjs
Esperado en una versión afectada:
{"target":"@webfer/mcp-ansible-drupal 2.0.0","sink":"runAnsible -> spawn(cmd[0], cmd.slice(1), {shell:true})","vector":"executeDeployment extraVars value","marker":"/tmp/PWNED_ansible","created":true,"verdict":"CONFIRMED - command injection executed"}
Validado el 2026-06-01 en un contenedor aislado y revalidado el 2026-06-13 con
un marcador touch benigno. Ejecútelo únicamente contra infraestructura que esté autorizado
a probar.
--extra-vars que llegue a ansible-playbook y que contenga ;, &&,
||, |, un acento grave o $(. Los valores legítimos de variables de Ansible esencialmente
nunca los contienen.sh -c cuya línea de comandos contenga ansible-playbook y un
segundo comando tras un separador — una señal de árbol de procesos (auditd, eBPF,
Falco, EDR) que no depende del registro de la aplicación.ansible-playbook, git y
ansible-vault; un shell, un intérprete o un cliente de red no lo son.executeDeployment contengan
metacaracteres de shell. Registre los argumentos de las herramientas — la mayoría de los despliegues MCP no lo hacen, y es
el único lugar donde el valor inyectado es visible en términos de la aplicación.MITRE ATT&CK T1059.004 Command and Scripting Interpreter: Unix Shell.
Actualice a @webfer/mcp-ansible-drupal 2.0.3 o posterior. El código fuente actual
llama a spawn(ansibleCmd[0], ansibleCmd.slice(1), { … }) sin la opción shell,
por lo que el array se pasa como argv y los metacaracteres pierden su significado.
La regla general para los manejadores de herramientas MCP, y lo que la corrección aplica aquí:
shell: true cuando ya se dispone de un array de argumentos. La
forma de array existe precisamente para evitar el shell.execFile/spawn con un vector de argumentos explícito.z.string() de Zod demuestra que el valor es una
cadena y nada sobre lo que contiene. Use listas de permitidos donde el conjunto de valores es
conocido; rechace los metacaracteres de shell donde no lo es.NIST SP 800-53r5 SI-10; OWASP ASVS v4 §5.3.8; mitigaciones M1 y M2 de CWE-78.
| Fecha | Evento |
|---|---|
| 2026-06-01 | Vulnerabilidad validada dinámicamente contra 2.0.0 |
| 2026-06-01 | 2.0.3 publicada en npm con shell: true eliminado |
| 2026-06-13 | Revalidada en un segundo host |
| 2026-07-13 | MITRE CNA-LR asigna CVE-2026-52618, s1ko acreditado como descubridor |
| 2026-08-22 | Publicación de este informe |
aws-mcp-server)Avisos complementarios de la misma pasada de investigación: CVE-2026-52616, CVE-2026-52617.
MIT — consulte LICENSE.