T03 · Remote Payload Retrieval and Execution
- Location
scripts/install.py:41- Finding
Remote Installer Downloaded and Executed Without Integrity Verification
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This is a legitimate desktop automation skill, but it needs review because it gives broad desktop control and contains exploitable command/script injection paths.
Install only in a trusted, non-sensitive desktop session and pin the package version. Do not let untrusted prompts, webpages, or documents choose app names, app arguments, hotkeys, or OCR targets. Avoid running it with administrator privileges, and treat screenshots/OCR output as sensitive because it can include anything visible on screen.
scripts/install.py:41Remote Installer Downloaded and Executed Without Integrity Verification
desktop_agent/commands/app.py:52Windows Command Injection Through Application Name and Arguments
desktop_agent/commands/app.py:128AppleScript Injection Through Unescaped Application Name
desktop_agent/commands/screen.py:224Predictable OCR Screenshot File Enables Data Exposure and File Clobbering
Hidden instructions were detected in comments or invisible text. These could contain malicious directives. Manual review is recommended.
<!-- OPENSPEC:START -->
# OpenSpec Instructions
These instructions are for AI assistants working in this project.
The declared description emphasizes mouse, keyboard, and screen automation, but the documented behavior also includes application launching, window enumeration, and focus/activation through OS-level mechanisms. This capability expansion matters because reviewers and policy systems may approve the skill for limited UI automation while overlooking broader host interaction and process-control behaviors.
The declared description emphasizes mouse, keyboard, and screen automation, but the documented behavior also includes application launching, window enumeration, and focus/activation through OS-level mechanisms. This capability expansion matters because reviewers and policy systems may approve the skill for limited UI automation while overlooking broader host interaction and process-control behaviors.
This duplicate finding points to the same unsafe sink: Popen(..., shell=True) with attacker-controlled name. The desktop-control context makes it more dangerous because the skill is explicitly designed to accept action requests that may be generated indirectly, enabling prompt-to-command abuse.
shell=True,
)
else:
subprocess.Popen(f'start "" "{name}"', shell=True)
elif current_platform == "macos":
cmd = ["open", "-a", name]
This duplicate finding points to the same unsafe sink: Popen(..., shell=True) with attacker-controlled name. The desktop-control context makes it more dangerous because the skill is explicitly designed to accept action requests that may be generated indirectly, enabling prompt-to-command abuse.
shell=True,
)
else:
subprocess.Popen(f'start "" "{name}"', shell=True)
elif current_platform == "macos":
cmd = ["open", "-a", name]
The hotkey command can invoke powerful global shortcuts such as save, close, paste, quit, undo, terminal interrupts, or OS-level actions without any user acknowledgment. In the context of a desktop automation skill, unrestricted hotkeys are especially dangerous because a single shortcut can trigger destructive or irreversible behavior in the focused application or operating system.
Skill modifies its own code, configuration, or behavior at runtime. Self-modification enables an agent to escalate privileges, disable safety constraints, or install persistent backdoors.
- [ ] Update any hardcoded references to "desktop-skill"
## Phase 3: Documentation
- [ ] Update SKILL.md with new command invocations (`uvx desktop-agent`)
- [ ] Update README.md with uvx installation instructions
- [ ] Update examples/automation_examples.md with new command format
- [ ] Add migration notes for existing users
Skill modifies its own code, configuration, or behavior at runtime. Self-modification enables an agent to escalate privileges, disable safety constraints, or install persistent backdoors.
- [ ] Update any hardcoded references to "desktop-skill"
## Phase 3: Documentation
- [ ] Update SKILL.md with new command invocations (`uvx desktop-agent`)
- [ ] Update README.md with uvx installation instructions
- [ ] Update examples/automation_examples.md with new command format
- [ ] Add migration notes for existing users
The activation guidance uses broad conditions such as requests that 'mention planning or proposals' and anything that 'sounds ambiguous,' which can overlap with common project conversations. The file does not provide clear boundaries, explicit exclusions, or negative examples to distinguish when the instructions should not be applied.
The README instructs users/agents to install and execute a package via npx skills add without pinning a specific version or immutable source. This creates a supply-chain risk where a later compromised or malicious release could be fetched automatically, which is more concerning in an agent skill because agents may follow installation instructions non-interactively.
The uvx desktop-agent --help example references an unpinned package execution path, meaning the resolved package version may change over time. For a desktop-control tool with input injection and screen access, fetching an unexpected version materially increases risk because a malicious update could immediately gain powerful local automation capabilities.
This is another unpinned uvx desktop-agent invocation, which exposes users and agents to the latest published package rather than a reviewed version. Because this skill can control keyboard, mouse, apps, and screen data, accidental execution of a compromised release could have immediate local impact.
The README includes keyboard injection, hotkeys, app launching, and automation examples without warning that these commands can drive other applications, trigger destructive actions, or modify user data. In the context of an AI agent skill for desktop control, lack of safety guidance materially increases the chance of misuse, accidental command execution in the wrong window, or stealthy abuse for credential theft or unauthorized actions.
The README promotes screenshots, OCR, and text extraction without warning that these operations may capture secrets such as passwords, tokens, private messages, or sensitive documents visible on screen. In a desktop automation skill, this omission is significant because users or agents may treat the commands as routine utilities without appreciating their data-exfiltration potential.
The README documents application-launching and focusing features beyond the stated metadata scope of mouse, keyboard, and screen control. This scope mismatch can mislead reviewers and agent frameworks about the real capability set, reducing informed consent and making abuse of broader desktop control easier to hide.
The skill invokes shell-based desktop automation (uvx desktop-agent) but does not declare any permissions or allowed-tools scope. This weakens containment and review, because a consuming agent may treat the skill as documentation while it actually requires broad shell execution to control the desktop, launch apps, and inspect windows.
The skill repeatedly references uvx desktop-agent without pinning a specific version or immutable source. An attacker controlling upstream releases, dependency resolution, or a compromised package version could change behavior and gain arbitrary desktop-control or code-execution capability under the agent's context.
The skill repeatedly references uvx desktop-agent without pinning a specific version or immutable source. An attacker controlling upstream releases, dependency resolution, or a compromised package version could change behavior and gain arbitrary desktop-control or code-execution capability under the agent's context.
The keyboard automation section lacks a strong warning that typed input and hotkeys may go to the wrong application, execute privileged shortcuts, submit forms, or trigger destructive actions. Because this skill operates on the live desktop, a focus mistake can cause data loss, command execution, or accidental disclosure.
The skill documents screenshot and OCR features without a clear privacy warning that they can capture secrets such as passwords, emails, internal documents, tokens, or unrelated application content visible on screen. In an agent setting, that omission increases the chance of over-collection and exfiltration of sensitive user data.
Skill enables autonomous high-impact decisions without human-in-the-loop verification. Critical operations (destructive commands, financial transactions, data deletion) should require explicit user confirmation.
uvx desktop-agent app focus "Notepad" uvx desktop-agent keyboard write "Hello World" # Step 4: Now safe to type
uvx desktop-agent app open notepad uvx desktop-agent keyboard write "Hello World" # May type in wrong window!
The screenshot command captures the user's screen contents and saves the image to disk, which can include sensitive on-screen data. Although the command prints where the file was saved, there is no warning, confirmation, or explanatory comment/docstring disclosing the privacy-sensitive nature of capturing screen contents.
This Windows code builds a shell command from untrusted inputs (name and joined args_list) and executes it with shell=True. An attacker can inject shell metacharacters or crafted arguments to execute arbitrary commands on the host, which is especially dangerous in a desktop-control skill that is expected to receive external task parameters.
if current_platform == "windows":
if args_list:
subprocess.Popen(
f'start "" "{name}" {" ".join(args_list)}',
shell=True,
)
The skill can launch applications on Windows via shell execution without any user-facing warning, confirmation, or policy restriction. In the context of a desktop-control agent, this increases the chance that an upstream prompt, tool caller, or compromised workflow can silently start unsafe programs or chained commands.
This is also shell execution on Windows with untrusted name interpolated into the command string. Even without extra args, a crafted application name can break quoting or append additional shell syntax, resulting in arbitrary command execution.
shell=True,
)
else:
subprocess.Popen(f'start "" "{name}"', shell=True)
elif current_platform == "macos":
cmd = ["open", "-a", name]