Back to skill

Security audit

Computer-Use Skill

Security checks for vulnerabilities and agentic risk

Overview

This is a real desktop-control skill, but it can grant broad computer-use access without a real user approval step and uses unfiltered screenshots.

Install only if you are comfortable giving an agent local desktop-control power. Keep sensitive windows and clipboard contents away from the session, and treat this build as needing review until request_access requires real user approval and Python dependencies are pinned and hash-verified.

Vulnerability Patterns
  • Unauthorized Access and Privilege EscalationObtains permissions beyond the task's legitimate needs
  • 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
  • Remote Payload Retrieval and ExecutionFetches external code whose behavior can change after review
Findings (2)

T05 · Unauthorized Access and Privilege Escalation

Error
Location
project/platforms/linux/src/session.ts:23
Finding
Application Access Requests Are Silently Auto-Approved<![CDATA[ ## Vulnerability Details **File Locations**: - `project/platforms/linux/src/session.ts:23-65` - `project/platforms/macos/src/session.ts:23-65` - `project/platforms/windows/src/session.ts:23-65` **Vulnerability Type**: Authorization and user-consent bypass **Risk Level**: High ### Vulnerable Code All three platform implementations contain the same automatic approval logic: ```ts function autoApprovePermission(req: CuPermissionRequest): CuPermissionResponse { const granted = req.apps .filter(app => app.resolved && !app.alreadyGranted) .map(app => ({ bundleId: app.resolved!.bundleId, displayName: app.resolved!.displayName, grantedAt: Date.now(), tier: app.proposedTier, })) const denied = req.apps .filter(app => !app.resolved) .map(app => ({ bundleId: app.requestedName, reason: 'not_installed' as const, })) return { granted, denied, flags: { ...DEFAULT_GRANT_FLAGS, ...req.requestedFlags, }, } } export function createSessionContext(): ComputerUseSessionContext { const state: State = { allowedApps: [], grantFlags: { ...DEFAULT_GRANT_FLAGS }, hiddenDuringTurn: new Set<string>(), } return { getAllowedApps: () => state.allowedApps, getGrantFlags: () => state.grantFlags, getUserDeniedBundleIds: () => [], getSelectedDisplayId: () => state.selectedDisplayId, getDisplayPinnedByModel: () => state.displayPinnedByModel ?? false, getDisplayResolvedForApps: () => state.displayResolvedForApps, getLastScreenshotDims: () => state.lastScreenshotDims, onPermissionRequest: async req => autoApprovePermission(req), ``` ### Technical Analysis The MCP computer-use framework treats `onPermissionRequest` as the authorization boundary through which a host should display a consent request and wait for the user to approve or deny access. The standalone session implementation instead routes the request directly to `autoApprovePermis ...[truncated 2879 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Replace `autoApprovePermission` with a host-mediated consent implementation that displays: - The resolved application identity. - The requested access tier. - The task-specific reason supplied with the request. - The capabilities available at that tier. 2. Require an explicit user action before returning any entry in `granted`. If the standalone runtime cannot display a trusted consent interface, fail closed and return a denial. 3. Do not allow the requesting Agent to choose the final access tier unilaterally. Permit the user to reduce the proposed tier or reject individual applications. 4. Implement and persist user-denied application identifiers rather than returning an unconditional empty list from `getUserDeniedBundleIds`. 5. Make grants short-lived and scoped to the active session or task. Clear them on process restart, task completion, lock release, or a user-triggered revocation event. 6. Preserve hard policy denials for sensitive applications and consider extending them to credential managers, system settings, security tools, terminals, IDEs, and financial applications. 7. Add automated tests confirming that: - No resolved application is granted without an explicit approval response. - Denied applications remain denied. - Approval cancellation fails closed. - An unavailable or crashed consent UI results in denial. - Requested tiers cannot exceed the tier selected by the user. 8. Clearly document the consent boundary and avoid describing access as approval-gated until the standalone host actually presents and enforces a user approval workflow. ]]>

T08 · Insecure Dependencies

Warning
Location
project/platforms/linux/src/computer-use/pythonBridge.ts:73
Finding
Unpinned Python Dependencies Are Automatically Installed and Executed on First Use<![CDATA[ ## Vulnerability Details **File Locations**: - `project/platforms/linux/runtime/requirements.txt:1-5` - `project/platforms/linux/src/computer-use/pythonBridge.ts:73-89` - Equivalent dependency bootstrap implementations are present in the macOS and Windows platform projects. **Vulnerability Type**: Non-reproducible automatic dependency installation **Risk Level**: Medium ### Vulnerable Code The Linux requirements permit any future release at or above the stated minimum versions: ```text mss>=10.1.0 Pillow>=11.3.0 pyautogui>=0.9.54 psutil>=7.0.0 python-xlib>=0.33 ``` The first-use bootstrap automatically upgrades pip and installs those mutable dependencies: ```ts const requirements = await readFile(requirementsPath, 'utf8') const digest = createHash('sha256').update(requirements).digest('hex') let installedDigest = '' try { installedDigest = (await readFile(installStampPath, 'utf8')).trim() } catch {} if (installedDigest !== digest) { logDebug('installing python runtime dependencies') await runOrThrow(pythonBinPath(), ['-m', 'pip', 'install', '--upgrade', 'pip'], 'pip upgrade') await runOrThrow( pythonBinPath(), ['-m', 'pip', 'install', '-r', requirementsPath], 'python dependency install', ) await writeFile(installStampPath, `${digest}\n`, 'utf8') } ``` ### Technical Analysis The requirements use lower-bound constraints rather than exact, reviewed versions. Dependency resolution can therefore select releases published after this Skill was audited. The installation also lacks package hashes, so it does not cryptographically constrain the downloaded artifacts to known files. The bootstrap upgrades pip before dependency installation. This adds another mutable component to the execution chain and causes package-management code that was not part of the reviewed Skill package to be downloaded and executed automatically. The SHA-256 stamp only hashes the local text of `requirements.txt`. It does not identify the versions that ...[truncated 2322 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Replace lower-bound constraints with exact, reviewed versions for every direct dependency. 2. Generate platform-specific locked dependency sets that include all transitive dependencies. 3. Require hashes for downloaded artifacts, for example by using a requirements file compatible with pip's `--require-hashes` mode. 4. Remove the automatic `pip install --upgrade pip` operation. Pin the package-manager version if a specific pip release is required. 5. Prefer prebuilt, reviewed wheels from a controlled artifact repository. Verify artifact signatures or hashes before installation. 6. Separate dependency installation from normal Skill execution. Require an explicit setup command and clearly disclose that external code will be downloaded and executed. 7. Use: ```bash python -m pip install --require-hashes --no-deps -r requirements.lock ``` with a complete lock file, or use an equivalent reproducible dependency-management workflow. 8. Record the resolved dependency versions and artifact hashes in the installation stamp. Hashing only the source requirements text is insufficient. 9. Add automated dependency scanning and update review. New dependency versions should be tested and approved before lock files are changed. 10. Apply equivalent hardening to the Linux, macOS, and Windows bootstrap implementations. ]]>
Vulnerability Patterns
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
Findings (175)

Tp4

High
Category
MCP Tool Poisoning
Confidence
96% confidence
Finding
If only macOS-specific logging declarations are represented while the skill claims broader standalone runtimes and platform-selection behavior, the documentation is overstating implemented scope. This primarily creates trust and review issues, though it is less directly exploitable than undeclared desktop-control functions.

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding
If only macOS-specific logging declarations are represented while the skill claims broader standalone runtimes and platform-selection behavior, the documentation is overstating implemented scope. This primarily creates trust and review issues, though it is less directly exploitable than undeclared desktop-control functions.

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding
If only macOS-specific logging declarations are represented while the skill claims broader standalone runtimes and platform-selection behavior, the documentation is overstating implemented scope. This primarily creates trust and review issues, though it is less directly exploitable than undeclared desktop-control functions.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding
If only macOS-specific logging declarations are represented while the skill claims broader standalone runtimes and platform-selection behavior, the documentation is overstating implemented scope. This primarily creates trust and review issues, though it is less directly exploitable than undeclared desktop-control functions.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding
If only macOS-specific logging declarations are represented while the skill claims broader standalone runtimes and platform-selection behavior, the documentation is overstating implemented scope. This primarily creates trust and review issues, though it is less directly exploitable than undeclared desktop-control functions.

Tp4

High
Category
MCP Tool Poisoning
Confidence
96% confidence
Finding
If only macOS-specific logging declarations are represented while the skill claims broader standalone runtimes and platform-selection behavior, the documentation is overstating implemented scope. This primarily creates trust and review issues, though it is less directly exploitable than undeclared desktop-control functions.

Tp4

High
Category
MCP Tool Poisoning
Confidence
96% confidence
Finding
If only macOS-specific logging declarations are represented while the skill claims broader standalone runtimes and platform-selection behavior, the documentation is overstating implemented scope. This primarily creates trust and review issues, though it is less directly exploitable than undeclared desktop-control functions.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding
If only macOS-specific logging declarations are represented while the skill claims broader standalone runtimes and platform-selection behavior, the documentation is overstating implemented scope. This primarily creates trust and review issues, though it is less directly exploitable than undeclared desktop-control functions.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding
If only macOS-specific logging declarations are represented while the skill claims broader standalone runtimes and platform-selection behavior, the documentation is overstating implemented scope. This primarily creates trust and review issues, though it is less directly exploitable than undeclared desktop-control functions.

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding
If only macOS-specific logging declarations are represented while the skill claims broader standalone runtimes and platform-selection behavior, the documentation is overstating implemented scope. This primarily creates trust and review issues, though it is less directly exploitable than undeclared desktop-control functions.

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding
If only macOS-specific logging declarations are represented while the skill claims broader standalone runtimes and platform-selection behavior, the documentation is overstating implemented scope. This primarily creates trust and review issues, though it is less directly exploitable than undeclared desktop-control functions.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding
If only macOS-specific logging declarations are represented while the skill claims broader standalone runtimes and platform-selection behavior, the documentation is overstating implemented scope. This primarily creates trust and review issues, though it is less directly exploitable than undeclared desktop-control functions.

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding
If only macOS-specific logging declarations are represented while the skill claims broader standalone runtimes and platform-selection behavior, the documentation is overstating implemented scope. This primarily creates trust and review issues, though it is less directly exploitable than undeclared desktop-control functions.

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding
If only macOS-specific logging declarations are represented while the skill claims broader standalone runtimes and platform-selection behavior, the documentation is overstating implemented scope. This primarily creates trust and review issues, though it is less directly exploitable than undeclared desktop-control functions.

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding
If only macOS-specific logging declarations are represented while the skill claims broader standalone runtimes and platform-selection behavior, the documentation is overstating implemented scope. This primarily creates trust and review issues, though it is less directly exploitable than undeclared desktop-control functions.

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding
If only macOS-specific logging declarations are represented while the skill claims broader standalone runtimes and platform-selection behavior, the documentation is overstating implemented scope. This primarily creates trust and review issues, though it is less directly exploitable than undeclared desktop-control functions.

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding
If only macOS-specific logging declarations are represented while the skill claims broader standalone runtimes and platform-selection behavior, the documentation is overstating implemented scope. This primarily creates trust and review issues, though it is less directly exploitable than undeclared desktop-control functions.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding
If only macOS-specific logging declarations are represented while the skill claims broader standalone runtimes and platform-selection behavior, the documentation is overstating implemented scope. This primarily creates trust and review issues, though it is less directly exploitable than undeclared desktop-control functions.

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding
If only macOS-specific logging declarations are represented while the skill claims broader standalone runtimes and platform-selection behavior, the documentation is overstating implemented scope. This primarily creates trust and review issues, though it is less directly exploitable than undeclared desktop-control functions.

Tp4

High
Category
MCP Tool Poisoning
Confidence
88% confidence
Finding
If only macOS-specific logging declarations are represented while the skill claims broader standalone runtimes and platform-selection behavior, the documentation is overstating implemented scope. This primarily creates trust and review issues, though it is less directly exploitable than undeclared desktop-control functions.

Tp4

High
Category
MCP Tool Poisoning
Confidence
96% confidence
Finding
If only macOS-specific logging declarations are represented while the skill claims broader standalone runtimes and platform-selection behavior, the documentation is overstating implemented scope. This primarily creates trust and review issues, though it is less directly exploitable than undeclared desktop-control functions.

Tp4

High
Category
MCP Tool Poisoning
Confidence
96% confidence
Finding
If only macOS-specific logging declarations are represented while the skill claims broader standalone runtimes and platform-selection behavior, the documentation is overstating implemented scope. This primarily creates trust and review issues, though it is less directly exploitable than undeclared desktop-control functions.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding
If only macOS-specific logging declarations are represented while the skill claims broader standalone runtimes and platform-selection behavior, the documentation is overstating implemented scope. This primarily creates trust and review issues, though it is less directly exploitable than undeclared desktop-control functions.

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding
If only macOS-specific logging declarations are represented while the skill claims broader standalone runtimes and platform-selection behavior, the documentation is overstating implemented scope. This primarily creates trust and review issues, though it is less directly exploitable than undeclared desktop-control functions.

Missing User Warnings

High
Confidence
96% confidence
Finding
The README states that screenshot filtering is set to 'none', meaning captured screen content is not compositor- or runtime-filtered before being exposed to the MCP layer. For a desktop automation skill, this materially increases the risk of collecting highly sensitive on-screen information from unrelated applications, making the lack of a strong safety warning and operating guidance a real security concern.

Static analysis

Detected: suspicious.dangerous_exec

Shell command execution detected (child_process).

Critical
Code
suspicious.dangerous_exec
Location
project/platforms/linux/src/lib/execFileNoThrow.ts:9

Shell command execution detected (child_process).

Critical
Code
suspicious.dangerous_exec
Location
project/platforms/macos/dist/lib/execFileNoThrow.js:4

Shell command execution detected (child_process).

Critical
Code
suspicious.dangerous_exec
Location
project/platforms/macos/src/lib/execFileNoThrow.ts:9

Shell command execution detected (child_process).

Critical
Code
suspicious.dangerous_exec
Location
project/platforms/windows/src/lib/execFileNoThrow.ts:9