Back to skill

Security audit

Mirroir

Security checks for vulnerabilities and agentic risk

Overview

The skill is clearly meant to control an iPhone, but its recommended install and runtime paths execute mutable remote code while asking for screen, input, and helper-daemon privileges.

Review this carefully before installing. Prefer a verified, version-pinned Homebrew or local binary install over the curl-to-bash or unpinned npx paths, grant Screen Recording and Accessibility only if you need full phone control, avoid using it on sensitive screens, and delete screenshots or recordings that contain private information.

Vulnerability Patterns
  • Remote Payload Retrieval and ExecutionFetches external code whose behavior can change after review
  • Insecure DependenciesIntroduces malicious components through unsafe dependency sources
  • Skill Instruction HijackingAlters the agent's session goals or safety constraints when the skill loads
  • Agent Memory PoisoningWrites attacker-controlled rules into memory that affect later sessions
  • Embedded Malicious CodeShips malicious scripts inside the skill and executes them locally
Findings (2)

T03 · Remote Payload Retrieval and Execution

Error
Location
SKILL.md:74
Finding
Recommended Installation Executes a Mutable Remote Script Directly with Bash<![CDATA[ ## Vulnerability Details **File Location**: `SKILL.md:74-84` **Vulnerability Type**: `T03: Remote Payload Retrieval and Execution` **Risk Level**: Critical ### Vulnerable Code ```markdown After installing, run the setup to configure the helper daemon and Karabiner: ```bash # One-line install (recommended) /bin/bash -c "$(curl -fsSL https://mirroir.dev/get-mirroir.sh)" # Or via Homebrew brew tap jfarcand/tap && brew install iphone-mirroir-mcp # Or via npx npx -y iphone-mirroir-mcp install ``` ``` ### Technical Analysis The installation documentation recommends retrieving a shell script from `https://mirroir.dev/get-mirroir.sh` and passing the returned content directly to Bash. The command does not pin an immutable artifact, verify a checksum, validate a cryptographic signature, or provide an inspection step before execution. Consequently, the code that executes can change after the Skill has been reviewed. Compromise of the remote server, DNS or delivery infrastructure, publishing process, or hosting account could turn the documented installation command into an arbitrary-code execution channel. The risk is amplified by the installation context. The surrounding documentation states that setup configures a helper daemon and Karabiner, while the Skill requires Screen Recording and Accessibility permissions. Although the audited file does not prove that the script itself abuses those permissions, executing an unverified installer in this environment creates a high-impact trust boundary. ### Attack Path 1. An attacker compromises `mirroir.dev`, its deployment pipeline, or another component capable of controlling the response for `get-mirroir.sh`. 2. The attacker modifies the served shell script to contain malicious commands. 3. A user follows the Skill's explicitly recommended one-line installation procedure. 4. `curl` downloads the attacker-controlled response. 5. Bash executes the response immediately without integrity or signature verificatio ...[truncated 1003 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Remove the direct remote-script execution command from the recommended installation process. 2. Distribute a versioned, immutable installation artifact through a controlled release channel. 3. Publish and require verification of a SHA-256 or stronger digest before execution. 4. Cryptographically sign release artifacts and document signature verification using a pinned, trusted public key. 5. Provide separate download, verification, inspection, and execution steps rather than piping network content directly into a shell. 6. Pin the installer to a specific reviewed release instead of a mutable URL. 7. Document every component installed by the setup process, including helper daemons, DriverKit components, launch agents, and requested permissions. 8. Apply least privilege during setup and request Screen Recording or Accessibility access only when the corresponding functionality is first used. ]]>

T08 · Insecure Dependencies

Error
Location
SKILL.md:83
Finding
Unpinned npm Package Is Repeatedly Retrieved and Executed Through npx<![CDATA[ ## Vulnerability Details **File Location**: `SKILL.md:83-99` **Additional Locations**: `SKILL.md:21-27`, `SKILL.md:266` **Vulnerability Type**: `T08: Insecure Dependencies` **Risk Level**: High ### Vulnerable Code Primary installation and persistent MCP configuration: ```markdown # Or via npx npx -y iphone-mirroir-mcp install ``` ```json { "mirroir": { "command": "npx", "args": ["-y", "iphone-mirroir-mcp"] } } ``` The package is also declared without a version in the Skill metadata: ```json { "id": "node", "kind": "node", "package": "iphone-mirroir-mcp", "bins": ["iphone-mirroir-mcp"], "label": "Install mirroir (npx)", } ``` The troubleshooting guidance invokes the same unpinned package: ```markdown - **Helper not running** → Run `npx iphone-mirroir-mcp setup` to reinstall the helper daemon ``` ### Technical Analysis All documented npm execution paths reference `iphone-mirroir-mcp` without an exact version or integrity constraint. The installation command uses `npx -y`, which suppresses the normal confirmation prompt and allows package retrieval and execution to proceed automatically. The MCP configuration is more consequential than a one-time installation instruction because it configures `npx` as the runtime command. Depending on local npm and `npx` caching and resolution behavior, starting the MCP server may resolve mutable package content rather than a fixed, previously reviewed artifact. An unpinned package name does not by itself prove that the package is malicious. However, it creates a supply-chain exposure: a compromised publisher account, malicious future release, registry compromise, or compromised transitive dependency could introduce executable code after the Skill audit. ### Attack Path 1. An attacker compromises the npm publisher account, release pipeline, package registry entry, or a dependency used by `iphone-mirroir-mcp`. 2. The attacker publishes a malicious release under the legitimate package ...[truncated 1379 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Pin `iphone-mirroir-mcp` to an exact reviewed version in every installation, setup, troubleshooting, metadata, and MCP configuration example. 2. Replace commands such as: ```bash npx -y iphone-mirroir-mcp install ``` with an exact version and documented integrity-verification process. 3. Avoid using `npx -y` for security-sensitive installation or setup operations because it removes an interactive trust checkpoint. 4. Prefer installing a verified package once and configuring the MCP server to invoke the verified local binary directly. 5. Use a lockfile with npm integrity metadata for installations managed as a project dependency. 6. Verify package provenance, publisher identity, release signatures or attestations, and transitive dependencies before updating the pinned version. 7. Introduce a controlled update process that reviews package changes before deployment rather than resolving the latest release during runtime. 8. Run the MCP process with the minimum filesystem, network, Accessibility, and Screen Recording permissions necessary for its intended operation. ]]>
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
Findings (4)

Missing User Warnings

Medium
Confidence
89% confidence
Finding
The skill advertises screenshots, OCR, and screen recording of a real iPhone without an explicit privacy warning about capturing sensitive on-screen information such as messages, passwords, MFA codes, health data, or financial information. Because the entire value of the skill is broad device visibility and interaction across any app, the privacy risk is heightened by context rather than reduced.

Missing User Warnings

Medium
Confidence
92% confidence
Finding
The skill advertises screenshots, OCR, and screen recording of a real iPhone without an explicit privacy warning about capturing sensitive on-screen information such as messages, passwords, MFA codes, health data, or financial information. Because the entire value of the skill is broad device visibility and interaction across any app, the privacy risk is heightened by context rather than reduced.

Rp1

Medium
Category
MCP Rug Pull
Confidence
93% confidence
Finding
The skill instructs users to run an MCP server via `npx` without pinning an exact package version, which allows whatever the latest published package is at execution time. If the package is compromised, typo-squatted, or a malicious update is published, users could execute attacker-controlled code locally with the privileges of their terminal session.

Rp1

Medium
Category
MCP Rug Pull
Confidence
94% confidence
Finding
The troubleshooting/setup instruction `npx iphone-mirroir-mcp setup` also executes an unpinned package version from the registry. Because this command is specifically used to install or reinstall a helper daemon, compromise here could lead to persistent local code execution and elevated trust by the user.

Static analysis

No suspicious patterns detected.