Back to skill

Security audit

Screen Activity Tracker Lite

Security checks for vulnerabilities and agentic risk

Overview

This skill does what it claims at a high level, but it persistently captures full-screen screenshots and sends them to a plaintext network AI endpoint without enough user control or warning.

Review carefully before installing. Use it only if you are comfortable with recurring full-screen screenshots being stored locally and sent to the configured AI endpoint. Change the model URL to a trusted local or HTTPS endpoint, avoid using it around passwords or confidential work, verify the cron job can be stopped, and consider pinning the screenshot dependency.

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 (3)

T09 · Insecure Skill Coding Practices

Error
Location
scripts/screen-activity.sh:12
Finding

Full-screen screenshots are transmitted over plaintext HTTP

Content
View full analysis

Vulnerability Details

File Location: scripts/screen-activity.sh:12, 44-71; config.example.json:3; SKILL.md:76
Vulnerability Type: Plaintext transmission of sensitive screen contents
Risk Level: High

Vulnerable Code

bash
MLX_URL=$(python3 -c "import json; c=json.load(open('$CONFIG')); print(c.get('mlx_url','http://192.168.1.198:18000/v1'))" 2>/dev/null || echo "http://192.168.1.198:18000/v1")
python
import json, base64, urllib.request, sys

with open('$SCREENSHOT', 'rb') as f:
    img_b64 = base64.b64encode(f.read()).decode()

payload = {
    'model': 'Qwen3.5-9B-MLX-4bit',
    'messages': [{
        'role': 'user',
        'content': [
            {'type': 'image_url', 'image_url': {'url': f'data:image/png;base64,{img_b64}'}},
            {'type': 'text', 'text': prompt}
        ]
    }],
    'max_tokens': 80,
    'temperature': 0.3
}

try:
    req = urllib.request.Request(
        '$MLX_URL/chat/completions',
        data=json.dumps(payload).encode(),
        headers={'Content-Type': 'application/json', 'Authorization': 'Bearer placeholder'},
        method='POST'
    )
    resp = urllib.request.urlopen(req, timeout=60)
    data = json.loads(resp.read())

The default configuration establishes the destination as:

json
{
  "mlx_url": "http://192.168.1.198:18000/v1"
}

Technical Analysis

The script captures the entire screen, reads the resulting PNG file, Base64-encodes it, embeds it in a JSON data URI, and sends it to the configured vision-model endpoint. Base64 is an API serialization format and does not provide encryption, access control, anonymization, or confidentiality.

The default endpoint uses unencrypted HTTP. Consequently, any system capable of observing or modifying traffic between the workstation and the model server can recover the complete screenshot or alter the response. Screen captures can contain credentials, ...[truncated 1712 chars]

Remediation
View remediation

Remediation Suggestions

  1. Require explicit informed consent before enabling screenshot capture and remote transmission.
  2. Do not provide a non-loopback plaintext HTTP endpoint as the default.
  3. Require HTTPS with normal certificate and hostname verification for remote endpoints.
  4. If local plaintext service support is necessary, restrict it to explicitly approved loopback addresses and display a warning before use.
  5. Validate the endpoint scheme and destination before every request.
  6. Add application exclusions, sensitive-window filtering, pause controls, and configurable redaction.
  7. Consider extracting only the minimum necessary metadata locally instead of transmitting complete images.
  8. Clearly document who operates the model endpoint, what data is transmitted, retention behavior, and the security assumptions.
  9. Use a genuine authentication mechanism when required rather than the static Bearer placeholder header.

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/screen-activity.sh:43
Finding

Configuration-controlled URL is interpolated into executable Python source

Content
View full analysis

Vulnerability Details

File Location: scripts/screen-activity.sh:43-76
Vulnerability Type: Python source injection through configuration interpolation
Risk Level: Medium

Vulnerable Code

The shell starts an inline Python program inside a double-quoted shell string:

bash
DESCRIPTION=$(python3 -c "

The configuration-controlled URL is then inserted directly into a Python string literal:

python
req = urllib.request.Request(
    '$MLX_URL/chat/completions',
    data=json.dumps(payload).encode(),
    headers={'Content-Type': 'application/json', 'Authorization': 'Bearer placeholder'},
    method='POST'
)

The generated program is executed by python3 -c:

bash
" 2>&1)

Technical Analysis

The mlx_url value is read from config.json and then expanded by the shell into executable Python source. It is not passed to Python as an inert argument or environment variable. A value containing quote characters and a valid Python expression can terminate or modify the intended string expression.

For example, an attacker who can alter config.json can construct a URL value that closes the original string, evaluates a Python expression such as an os.system call, and then concatenates another string so that the generated program remains syntactically valid. The injected expression executes whenever the scheduled screenshot job reaches the analysis step.

This issue does not independently provide a remote entry point: an attacker must first influence config.json or persuade the user to install a malicious configuration. Nevertheless, configuration values should not become source code, especially in a persistent scheduled process.

Attack Path

  1. An attacker gains write access to config.json, supplies a malicious configuration package, or convinces the user to paste a crafted mlx_url.
  2. The recurring job invokes scripts/screen-activity.sh.
  3. The shell re ...[truncated 978 chars]
Remediation
View remediation

Remediation Suggestions

  1. Never interpolate configuration values into source supplied to python3 -c.
  2. Pass the URL as a positional argument or environment variable. For example, invoke Python with the URL as an argument and retrieve it through sys.argv.
  3. Prefer moving the inline Python program into a standalone script, which eliminates shell-generated Python source.
  4. Validate the URL with urllib.parse.urlparse.
  5. Permit only expected schemes such as https, with narrowly documented exceptions for loopback services.
  6. Reject control characters and unexpected URL components.
  7. Restrict the permissions of config.json so that untrusted local users cannot modify it.
  8. Run the scheduled task with no more filesystem and network access than required.

T08 · Insecure Dependencies

Warning
Location
SKILL.md:14
Finding

Unpinned globally installed screenshot dependency creates supply-chain exposure

Content
View full analysis

Vulnerability Details

File Location: SKILL.md:14-17; README.md:39; README_EN.md:39
Vulnerability Type: Unpinned global third-party dependency
Risk Level: Medium

Vulnerable Code

The Skill metadata requests a global npm installation without a version:

yaml
install:
  - kind: "npm-global"
    pkg: "@steipete/peekaboo"
    bins: ["peekaboo"]
    label: "Install Peekaboo (npm)"

The installation documentation likewise instructs users to install the latest available release:

bash
npm install -g @steipete/peekaboo

Technical Analysis

No dependency version, lockfile, or integrity hash is specified. Each installation can therefore resolve to whichever package release is current at that time. npm packages may execute lifecycle scripts during installation, and a global installation increases the package's availability and potential impact on the user's environment.

The reviewed repository contains no evidence that @steipete/peekaboo is malicious. The vulnerability is the absence of reproducible dependency controls: compromise of the publisher account, package registry, or a future release could cause new Skill installations to execute code that was not part of this audit.

The dependency is functionally necessary for screenshot capture, but installing an unconstrained latest version globally is broader than the minimum required dependency strategy.

Attack Path

  1. The package publisher account, registry entry, or a future package release is compromised.
  2. An attacker publishes a malicious version under the expected package name.
  3. A user follows the Skill instructions or the automated installer processes the unpinned package declaration.
  4. npm resolves and installs the malicious latest version globally.
  5. Malicious lifecycle code can execute during installation, or the substituted peekaboo binary can execute when the scheduled tracking job runs.
  6. The malici ...[truncated 635 chars]
Remediation
View remediation

Remediation Suggestions

  1. Pin the dependency to a specifically audited version.
  2. Publish and verify the expected package integrity hash.
  3. Use a lockfile or equivalent reproducible dependency mechanism where supported.
  4. Avoid global installation when a project-local, isolated, or otherwise constrained installation is sufficient.
  5. Document the expected package publisher, version, binary checksum, and verification procedure.
  6. Review npm lifecycle scripts and consider installation settings that disable them when they are unnecessary.
  7. Verify the installed binary and version before creating the recurring tracking job.
  8. Establish a controlled update process so dependency upgrades receive security review before deployment.
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
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
Findings (20)

Missing User Warnings

High
Category
Not specified by scanner
Confidence
96% confidence
Finding

The README explicitly says the skill will automatically take screenshots every 5 minutes and perform AI analysis, but it does not present a prominent privacy warning about capturing sensitive on-screen content such as passwords, messages, documents, or regulated data. Because this is a screen-recording style skill intended for continuous background use, users may enable it without understanding the scope of collection, creating a substantial privacy and data-exposure risk.

Content

No source excerpt is available for this finding.

Missing User Warnings

High
Category
Not specified by scanner
Confidence
98% confidence
Finding

The README states that screenshots are AI-analyzed and exposes a configurable model endpoint, but it does not clearly warn that screenshot contents may be transmitted to an AI service for processing. Screen images often contain highly sensitive data, and sending them to a local-network or remote inference endpoint without explicit disclosure can lead to unintended disclosure to another host, service, or operator.

Content

No source excerpt is available for this finding.

Missing User Warnings

High
Category
Not specified by scanner
Confidence
96% confidence
Finding

The README promotes continuous screenshot capture and AI analysis as a one-command, zero-config feature, but it does not prominently warn users that highly sensitive on-screen data may be collected, stored, and analyzed. In this skill context, screenshots can include passwords, messages, financial data, source code, and other confidential information, so minimizing or omitting privacy warnings materially increases the risk of unsafe deployment and uninformed consent.

Content

No source excerpt is available for this finding.

Missing User Warnings

High
Category
Not specified by scanner
Confidence
98% confidence
Finding

The configuration example includes a network AI endpoint (mlx_url) but the README does not clearly state that screenshots or derived screen contents may be sent over the network for processing. This is dangerous because users may assume processing is entirely local while in reality sensitive screen contents could be transmitted to another host, creating confidentiality, compliance, and data exposure risks.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding

The skill is described as minimal screen activity tracking, but the documented behavior goes further by capturing full-screen screenshots, storing them locally, and sending screen-derived data to an external model endpoint. This mismatch undermines informed consent and can expose sensitive on-screen information such as messages, credentials, documents, or proprietary data.

Content

No source excerpt is available for this finding.

Missing User Warnings

High
Category
Not specified by scanner
Confidence
98% confidence
Finding

The skill instructions describe ongoing tracking setup but do not present a clear privacy warning that screen activity is logged continuously and stored on disk. In the context of a screen-monitoring skill, this omission is especially dangerous because users may unknowingly retain sensitive workspace, personal, or regulated information in local logs.

Content

No source excerpt is available for this finding.

Missing User Warnings

High
Category
Not specified by scanner
Confidence
99% confidence
Finding

The configuration lists an external model endpoint, but the skill does not clearly warn users that screen-derived data may be transmitted off-device for analysis. Because screenshots can contain highly sensitive material, undisclosed network transmission materially increases privacy, compliance, and data exfiltration risk.

Content

No source excerpt is available for this finding.

Missing User Warnings

High
Category
Not specified by scanner
Confidence
96% confidence
Finding

The script captures the entire screen automatically and later sends the resulting image for analysis, but there is no visible warning, prompt, or confirmation in this code path. Silent collection of full-screen content is dangerous because users may expose passwords, personal communications, financial data, or proprietary information without realizing it is being recorded and processed.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

High
Category
Not specified by scanner
Confidence
98% confidence
Finding

The script reads a full screenshot, base64-encodes it, and sends it to a configurable network endpoint for vision analysis. Screenshots commonly contain highly sensitive data such as messages, credentials, documents, and internal tools, so transmitting them off-device materially increases privacy and data-exposure risk, especially since the default endpoint is a private-network host and the script provides no trust validation or user consent flow.

Content

No source excerpt is available for this finding.

Missing User Warnings

High
Category
Not specified by scanner
Confidence
98% confidence
Finding

These lines package the screenshot as base64 and POST it to a remote chat-completions endpoint without any visible disclosure or confirmation mechanism. Encoding does not reduce sensitivity; it simply transports the full image contents, so any secrets visible on screen are exposed to the receiving service and potentially to network interception or downstream retention.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
80% confidence
Finding

The README presents the skill description, examples, and spoken commands entirely in Chinese, including the activation phrases users are expected to say. There is no indication that language choice is optional or that the skill is intentionally restricted to a Chinese-language context.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
87% confidence
Finding

The skill advertises operational behavior that implies file access, log storage, and network communication, but it does not declare any explicit tool scope or allowed-tools boundary. That weakens reviewability and consent, making it easier for a user or host system to invoke a skill with broader capabilities than expected.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The trigger phrases include ordinary language like 'track screen,' 'daily summary,' and common Chinese equivalents that may occur in normal conversation. Broad triggers increase the chance of accidental activation of a privacy-sensitive skill that can start recurring screen capture without deliberate user intent.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

This code includes multiple natural-language strings shown to the user only in Chinese, such as status messages and command feedback. That forces a specific language/locale without user opt-in, which matches the policy-violation category for language or locale constraints.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

This code performs a destructive operation by deleting screenshot directories older than the configured retention period via shutil.rmtree. Although it prints after deletion, there is no prior confirmation prompt or clear user-facing warning in the module docstring/usage text that old screenshots will be removed automatically.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

For a skill presented as 'minimal screen activity tracking,' sending image contents over HTTP/network to a model service is a materially broader capability than users would reasonably expect. The mismatch between stated purpose and actual data handling increases the chance of undisclosed collection and weakens informed consent, even if the feature is intended for generating summaries.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

The prompt explicitly instructs the model to describe the screenshot in Chinese, which imposes a specific language behavior on all users. There is no indication in this file that the user can opt in to this locale choice or that the constraint is justified by the skill's scope.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
89% confidence
Finding

The cleanup step irreversibly removes stored screenshots using rm -rf. Although retention cleanup may be intended, this file provides no user-facing disclosure that historical screenshots will be automatically deleted.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
95% confidence
Finding

The markdown header is hard-coded in Chinese, which imposes a specific language on generated output regardless of user preference. The file does not offer a language choice or explain a region-specific requirement that would justify this locale constraint.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
90% confidence
Finding

The cleanup status message is emitted only in Chinese, which is a natural-language locale restriction in a user-facing string. There is no surrounding documentation or configuration indicating that Chinese-only output is intentional or user-selected.

Content

No source excerpt is available for this finding.

Static analysis

Detected: suspicious.install_untrusted_source

Install source points to URL shortener or raw IP.

Warn
Code
suspicious.install_untrusted_source
Location
config.example.json:3