Back to skill

Security audit

Data Mover Skill

Security checks for vulnerabilities and agentic risk

Overview

The skill is an OCR/data-entry helper, but it requests high-impact screen and clipboard access while leaving captured screen data on disk and overstating implemented safeguards and automation features.

Review this before installing. Use it only with authorized, non-sensitive screens or test data unless the publisher adds clear consent prompts, region-limited capture, screenshot cleanup or encryption, real dry-run behavior, and accurate documentation of what is and is not implemented.

Vulnerability Patterns
  • Insecure DependenciesIntroduces malicious components through unsafe dependency sources
  • Insecure Skill Coding PracticesFinds exploitable flaws such as hardcoded secrets or command injection
  • 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)

T08 · Insecure Dependencies

Warning
Location
clawhub.json:16
Finding

Mutable and Unverified Third-Party Dependencies

Content
View full analysis

Vulnerability Details

File Location: README.md:15-18 and clawhub.json:16-21
Vulnerability Type: Supply-chain exposure through unpinned dependencies
Risk Level: Medium

Vulnerable Code

README.md:15-18:

bash
pip install pyautogui paddleocr pandas opencv-python

clawhub.json:16-21:

json
"dependencies": {
  "pyautogui": ">=0.9.53",
  "paddleocr": ">=2.7.0",
  "pandas": ">=1.5.0",
  "opencv-python": ">=4.7.0",
  "tqdm": ">=4.65.0"
}

Technical Analysis

The documented installation command does not constrain dependency versions, while the package manifest only specifies minimum versions. No lock file, integrity hashes, or trusted package source is defined.

Consequently, two installations performed at different times can resolve to different package releases. A compromised future release, dependency takeover, or malicious transitive dependency could execute code during package installation or import. This is particularly significant because the dependencies include large packages with extensive transitive dependency trees.

The audit did not identify a currently malicious dependency. The vulnerability is the absence of controls that ensure users receive the versions reviewed and tested by the project.

Attack Path

  1. An attacker compromises a declared dependency or one of its transitive dependencies and publishes a malicious release that satisfies the open-ended version constraint.
  2. A user follows the documented installation command or installs dependencies from the manifest.
  3. The package resolver selects the malicious release because no exact version or integrity hash prevents it.
  4. Malicious installation hooks or imported module code execute in the user's Python environment.
  5. That code can act with the invoking user's permissions and potentially access resources available to the Skill.

Impact Assessment

Successful exploitation could execute a ...[truncated 443 chars]

Remediation
View remediation

Remediation Suggestions

  1. Pin every direct dependency to an exact, reviewed version rather than using unrestricted or minimum-only constraints.
  2. Generate and commit a lock file that also fixes transitive dependency versions.
  3. Require package integrity hashes, for example through a hash-locked requirements file and pip install --require-hashes.
  4. Install packages exclusively from a controlled or explicitly trusted package index.
  5. Add automated dependency vulnerability and provenance scanning to the release process.
  6. Review dependency updates before regenerating the lock file.
  7. Keep documentation and manifest constraints synchronized so the documented command installs the reviewed dependency set.

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/mover.py:70
Finding

Unencrypted Persistence of Full-Screen Captures

Content
View full analysis

Vulnerability Details

File Location: scripts/mover.py:70-80
Vulnerability Type: Plaintext storage and insecure lifecycle management of sensitive screenshots
Risk Level: Medium

Vulnerable Code

python
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
filename = f"screenshot_{timestamp}.png"

if region:
    screenshot = pyautogui.screenshot(region=region)
else:
    screenshot = pyautogui.screenshot()

screenshot.save(filename)

Technical Analysis

When no region is supplied, the function captures the entire screen. It saves the resulting image as a plaintext PNG in the current working directory using a predictable timestamp-based filename.

The implementation does not apply restrictive file permissions, encryption, secure temporary-file creation, retention controls, or automatic deletion after OCR. Screen contents can include credentials, authentication tokens, private messages, personal information, customer records, or confidential business data.

Saving to the current directory can also place the screenshot in a shared directory, synchronized folder, source repository, backup scope, or other location readable by unrelated processes. The behavior conflicts with the documentation's claim that sensitive data is stored in encrypted form.

Attack Path

  1. A user displays sensitive content while the Skill is active.
  2. The user or an automation workflow invokes the --screenshot operation without restricting the capture region.
  3. The Skill captures the complete screen and writes it to a predictable plaintext file such as screenshot_20260316_160500.png.
  4. The file remains after OCR processing because the implementation has no cleanup mechanism.
  5. Another local user, process, backup service, synchronization client, or subsequent task with access to the directory reads or copies the residual screenshot.

Impact Assessment

Exploitation can disclose everything visible on t ...[truncated 434 chars]

Remediation
View remediation

Remediation Suggestions

  1. Pass screenshots directly to the OCR engine in memory and avoid writing them to disk whenever possible.
  2. Require explicit user approval before full-screen capture and prefer a narrowly defined capture region.
  3. If temporary persistence is necessary, use the platform's secure temporary-file API with a randomized filename and owner-only permissions.
  4. Delete the temporary image in a finally block immediately after OCR processing, including error paths.
  5. If screenshots must be retained, encrypt them with a securely managed key and define an explicit retention period.
  6. Reject unsafe output locations and prevent screenshots from being written to shared, synchronized, or repository directories by default.
  7. Clearly disclose the capture scope and retention behavior to users.
  8. Update the documentation so its encryption claims accurately reflect the implementation.
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • Behavioral ASTexec() Call, eval() Call, Dynamic Import
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
Findings (22)

Tp4

High
Category
MCP Tool Poisoning
Confidence
94% confidence
Finding

The description promises a practical cross-system data mover featuring OCR, automatic copy/paste, and support for multiple systems. The code does partially support OCR via PaddleOCR and screenshot capture via pyautogui, which aligns with part of the description. However, the core 'automatic copy/paste' and 'cross-system data moving' behavior is not actually realized: clipboard helper methods exist, but they reference pyperclip without importing it, and there is no implemented workflow that automates pasting data into external applications or systems. The Excel-to-CRM function only reads Excel, maps fields, validates records, and logs a simulated CRM write; it explicitly notes that real CRM API support is not implemented. Additionally, advertised/demo capabilities like email-to-Excel extraction and batch PDF processing are absent. Therefore, the description overstates the implemented functionality in material ways.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

The declared description promises substantial functionality related to OCR-driven data movement across systems. However, the provided code chunk is only a placeholder test file (tests/__init__.py) containing a comment and no executable logic. Because the actual code does not demonstrate or implement the described primary purpose or capabilities, the description does not accurately represent the supplied code.

Content

No source excerpt is available for this finding.

Missing User Warnings

High
Category
Not specified by scanner
Confidence
95% confidence
Finding

The skill describes OCR-based screen capture and automated cross-system data manipulation but does not provide a clear warning about the privacy, integrity, and compliance risks. In this context, users may unknowingly expose sensitive on-screen data, move confidential records into the wrong system, or trigger bulk modifications without appreciating the consequences.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The README advertises OCR-based screen scraping and automated cross-system copy/paste into external applications, but it does not clearly warn users that the skill can read sensitive on-screen data and perform actions in other systems. In this context, missing safety guidance increases the chance of unintended data transfer, privacy violations, or accidental modification of production systems because users may run the demo or automation without understanding the operational risk.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
89% confidence
Finding

The skill advertises capabilities that imply file access and shell execution, but it does not declare any explicit tool scope or permission boundaries. For a skill that handles OCR, local files, and automation, missing scope definitions increase the chance of overbroad execution and unintended access to sensitive data or system resources.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The trigger phrase includes a broad natural-language command that could overlap with ordinary conversation and invoke screen/OCR/data-movement behavior unexpectedly. In a skill that can capture screen contents and automate copying between systems, accidental activation can expose sensitive information or cause unintended data entry actions.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

Scheduled and hotkey activation are underspecified for a skill that can perform screen capture and automated cross-system manipulation. Without strong guardrails, the skill could run at unsafe times, act on the wrong window or dataset, or be triggered unintentionally, leading to privacy leakage and unauthorized changes in target systems.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
87% confidence
Finding

The manifest description is written entirely in Chinese ("跨系统数据自动搬运工 - OCR 识别 + 自动复制粘贴 + 多系统支持") with no indication that the skill supports other languages or that it is intentionally limited to a Chinese-speaking audience. For a general productivity skill, this can constitute a language/locale policy issue because users are not offered a language choice or an explicit regional justification.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

The file’s natural-language description and user-facing text are entirely in Chinese, and the OCR engine is explicitly initialized with lang='ch' without any documented user opt-in or locale selection. This creates a language/locale policy concern because the skill appears to require a specific language rather than offering a choice.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The OCR engine is configured with lang='ch', which enforces a specific language setting in code. There is no accompanying natural-language disclosure that this is a region- or language-specific tool, nor any mechanism for user opt-in or language selection.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
89% confidence
Finding

The skill includes OS-level clipboard read/write capabilities, which allow access to and movement of sensitive host data beyond narrowly scoped OCR processing. In a cross-system automation tool, this can facilitate unintended collection, staging, or exfiltration of secrets and personal data across application boundaries.

Content

No source excerpt is available for this finding.

subprocess module call

Medium
Category
Dangerous Code Execution
Confidence
90% confidence
Finding

This code invokes an OS command with shell=True to write arbitrary text to the Windows clipboard. Even though the command string is fixed, shell invocation increases risk and the broader clipboard-access capability can move sensitive data across application boundaries or into attacker-observable contexts if the skill is misused.

Content

Scanner excerpt · scripts/mover.py (reported line 187)May include surrounding context.

python
import platform
            system = platform.system()
            if system == 'Windows':
                subprocess.run(['clip'], input=text.encode(), shell=True)
            elif system == 'Darwin':
                subprocess.run(['pbcopy'], input=text.encode())
            else:  # Linux

subprocess module call

Medium
Category
Dangerous Code Execution
Confidence
73% confidence
Finding

This subprocess call writes provided text to the macOS clipboard, enabling transfer of potentially sensitive data outside the intended application workflow. While the command itself is fixed and not shell-injected, the clipboard side effect can still be abused for unintended data staging or exfiltration.

Content

Scanner excerpt · scripts/mover.py (reported line 189)May include surrounding context.

python
if system == 'Windows':
                subprocess.run(['clip'], input=text.encode(), shell=True)
            elif system == 'Darwin':
                subprocess.run(['pbcopy'], input=text.encode())
            else:  # Linux
                subprocess.run(['xclip', '-selection', 'clipboard'], input=text.encode())

subprocess module call

Medium
Category
Dangerous Code Execution
Confidence
73% confidence
Finding

This Linux clipboard write uses xclip to place arbitrary text onto the global clipboard, which may be read by other applications or users in the session. That broad host interaction is security-relevant because the skill handles OCR-extracted and spreadsheet-derived data that may contain sensitive information.

Content

Scanner excerpt · scripts/mover.py (reported line 191)May include surrounding context.

python
elif system == 'Darwin':
                subprocess.run(['pbcopy'], input=text.encode())
            else:  # Linux
                subprocess.run(['xclip', '-selection', 'clipboard'], input=text.encode())
    
    def paste_from_clipboard(self) -> str:
        """从剪贴板粘贴"""

subprocess module call

Medium
Category
Dangerous Code Execution
Confidence
79% confidence
Finding

This code reads the system clipboard using PowerShell, which can expose secrets copied from unrelated applications such as passwords, tokens, or personal data. In a data-mover skill with OCR and automation, unrestricted clipboard reads materially expand access to sensitive host data.

Content

Scanner excerpt · scripts/mover.py (reported line 201)May include surrounding context.

python
import platform
            system = platform.system()
            if system == 'Windows':
                result = subprocess.run(['powershell', '-command', 'Get-Clipboard'], 
                                      capture_output=True, text=True)
                return result.stdout
            elif system == 'Darwin':

subprocess module call

Medium
Category
Dangerous Code Execution
Confidence
77% confidence
Finding

This call reads clipboard contents from macOS, creating access to global user data unrelated to the current task. Clipboard harvesting is dangerous in automation tooling because copied credentials, PII, or business data may be silently ingested and processed.

Content

Scanner excerpt · scripts/mover.py (reported line 205)May include surrounding context.

python
capture_output=True, text=True)
                return result.stdout
            elif system == 'Darwin':
                result = subprocess.run(['pbpaste'], capture_output=True, text=True)
                return result.stdout
            else:  # Linux
                result = subprocess.run(['xclip', '-selection', 'clipboard', '-o'],

subprocess module call

Medium
Category
Dangerous Code Execution
Confidence
77% confidence
Finding

This Linux command reads the global clipboard and returns its contents to the program, which can expose secrets from unrelated applications. The capability is broader than simple OCR processing and becomes more dangerous in a skill designed to automate cross-system data movement.

Content

Scanner excerpt · scripts/mover.py (reported line 208)May include surrounding context.

python
result = subprocess.run(['pbpaste'], capture_output=True, text=True)
                return result.stdout
            else:  # Linux
                result = subprocess.run(['xclip', '-selection', 'clipboard', '-o'], 
                                      capture_output=True, text=True)
                return result.stdout

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

This Python test file contains user-facing natural-language strings and comments entirely in Chinese, including the module docstring and test descriptions. Under the policy rule, forcing a specific language without opt-in or a documented region-specific justification is a natural-language policy violation.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
93% confidence
Finding

This markdown file uses Chinese for all substantive changelog entries, and there is no indication that the skill is region-specific or that users can opt into this locale. Under the policy, forcing a specific language without user choice can be a natural-language policy violation.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
80% confidence
Finding

The natural-language description and headings are written in Chinese, which effectively forces a specific language for users reading the skill documentation. The file does not offer an alternate language, opt-in choice, or justification that this skill is intended only for a Chinese-speaking or region-specific context.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
93% confidence
Finding

The description text is entirely in Chinese, which can constitute a language/locale policy issue when the skill does not indicate that users can choose their preferred language or that the skill is intended only for a Chinese-speaking context. In a manifest, this may limit accessibility and appears to impose a locale without opt-in or documented justification.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Low
Category
Not specified by scanner
Confidence
97% confidence
Finding

The docstring for move_data_excel_to_crm claims 'Excel → CRM 数据搬运(模拟)', implying a simulated end-to-end transfer to CRM. In reality, the function reads Excel data, maps fields, validates records, and counts successes without any CRM write logic, simulated API call, or paste automation, so the documentation overstates what the code does.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.