{"id":"GHSA-6f6r-m9pv-67jw","summary":"iOS Simulator MCP Command Injection allowed via exec API","details":"# Command Injection in MCP Server\n\nThe MCP Server at https://github.com/joshuayoes/ios-simulator-mcp/ is written in a way that is vulnerable to command injection vulnerability attacks as part of some of its MCP Server tool definition and implementation.\n\n## Vulnerable tool\n\nThe MCP Server exposes the tool `ui_tap` which relies on Node.js child process API `exec` which is an unsafe and vulnerable API if concatenated with untrusted user input.\n\nLLM exposed user input for `duration`, `udid`, and `x` and `y` args can be replaced with shell meta-characters like `;` or `&&` or others to change the behavior from running the expected command `idb` to another command.\n\nVulnerable line of code: https://github.com/joshuayoes/ios-simulator-mcp/blob/main/src/index.ts#L166-L207\n\n```js\n  server.tool(\n    \"ui_tap\",\n    \"Tap on the screen in the iOS Simulator\",\n    {\n      duration: z.string().optional().describe(\"Press duration\"),\n      udid: z\n        .string()\n        .optional()\n        .describe(\"Udid of target, can also be set with the IDB_UDID env var\"),\n      x: z.number().describe(\"The x-coordinate\"),\n      y: z.number().describe(\"The x-coordinate\"),\n    },\n    async ({ duration, udid, x, y }) =\u003e {\n      try {\n        const actualUdid = await getBootedDeviceId(udid);\n        const durationArg = duration ? `--duration ${duration}` : \"\";\n        const { stderr } = await execAsync(\n          `idb ui tap --udid ${actualUdid} ${durationArg} ${x} ${y}  --json`\n        );\n\n```\n\n## Exploitation\n\nWhen LLMs are tricked through prompt injection (and other techniques and attack vectors) to call the tool with input that uses special shell characters such as `; rm -rf /tmp;#` and other payload variations, the full command-line text will be interepted by the shell and result in other commands except of `ps` executing on the host running the MCP Server.\n\nReference example from prior security research on this topic:\n\n![Cursor defined MCP Server vulnerable to command injection](https://res.cloudinary.com/snyk/image/upload/f_auto,w_2560,q_auto/v1747081395/Screenshot_2025-05-07_at_9.22.11_AM_d76kvm.png)\n\n## Impact\n\nUser initiated and remote command injection on a running MCP Server.\n\n## References and Prior work\n\n1. [Exploiting MCP Servers Vulnerable to Command Injection](https://snyk.io/articles/exploiting-mcp-servers-vulnerable-to-command-injection/)\n2. Liran's [Node.js Secure Coding: Defending Against Command Injection Vulnerabilities](https://www.nodejs-security.com/book/command-injection)\n\n##\n\nDisclosed by [Liran Tal](https://lirantal.com)","aliases":["CVE-2025-52573"],"modified":"2025-06-26T21:44:42.182968Z","published":"2025-06-26T21:20:37Z","database_specific":{"cwe_ids":["CWE-78"],"severity":"MODERATE","github_reviewed":true,"github_reviewed_at":"2025-06-26T21:20:37Z","nvd_published_at":"2025-06-26T14:15:30Z"},"references":[{"type":"WEB","url":"https://github.com/joshuayoes/ios-simulator-mcp/security/advisories/GHSA-6f6r-m9pv-67jw"},{"type":"ADVISORY","url":"https://nvd.nist.gov/vuln/detail/CVE-2025-52573"},{"type":"WEB","url":"https://github.com/joshuayoes/ios-simulator-mcp/commit/eb53a4f2cc8bbeb13e8d6d930f00167befcdb809"},{"type":"PACKAGE","url":"https://github.com/joshuayoes/ios-simulator-mcp"},{"type":"WEB","url":"https://github.com/joshuayoes/ios-simulator-mcp/blob/main/src/index.ts#L166-L207"},{"type":"WEB","url":"https://github.com/joshuayoes/ios-simulator-mcp/releases/tag/v1.3.3"}],"affected":[{"package":{"name":"ios-simulator-mcp","ecosystem":"npm","purl":"pkg:npm/ios-simulator-mcp"},"ranges":[{"type":"SEMVER","events":[{"introduced":"0"},{"fixed":"1.3.3"}]}],"database_specific":{"source":"https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2025/06/GHSA-6f6r-m9pv-67jw/GHSA-6f6r-m9pv-67jw.json"}}],"schema_version":"1.9.0","severity":[{"type":"CVSS_V3","score":"CVSS:3.1/AV:L/AC:H/PR:L/UI:R/S:U/C:N/I:H/A:H"}]}