Back to skill

Security audit

Screen Activity Tracker

Security checks for vulnerabilities and agentic risk

Overview

The skill is a real screen-activity tracker, but it runs persistent screenshot capture and can transmit sensitive screen contents while its privacy protections are misleading or disabled.

Review carefully before installing. Only use this with accounts and screens where continuous full-screen capture is acceptable, change model and SiYuan endpoints to trusted HTTPS or strictly local services, do not rely on the advertised blacklist until fixed, protect config.json and tokens, and pin or independently verify 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 (4)

T09 · Insecure Skill Coding Practices

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

Advertised sensitive-application blacklist is disabled

Content
View full analysis
/dev/null || echo "未知") # for keyword in "${APP_BLACKLIST[@]}"; do # if echo "$FRONT_APP" | grep -qi "$keyword"; then # echo "SKIP: app '$FRONT_APP' matches blacklist keyword '$keyword'" # # Log text-only entry # DATE=$(date "+%Y-%m-%d") # TIME=$(date "+%H:%M") # if [ "$BACKEND" = "siyuan" ]; then # python3 "$SCRIPT_DIR/siyuan-logger.py" "NONE" "$DATE" "$TIME" "$FRONT_APP 正在使用中(黑名单跳过截图)" 2>/dev/null # else # echo "- **$TIME** $FRONT_APP 正在使用中(黑名单跳过截图)" >> "$OUTPUT_DIR/$DATE.md" # fi # exit 0 # fi # done ``` ### Technical Analysis The complete foreground-application blacklist implementation is commented out. Although `setup.py` creates default exclusions for banking, password, payment, and login applications, those exclusions are never enforced. Execution therefore continues into the screenshot block at `scripts/screen-activity.sh:80-95`, which captures the entire screen regardless of the active application. This contradicts the privacy guarantees in `README_EN.md:22` and `README_EN.md:73-77`. The screen capture permission is necessary for the declared tracking functionality, but capturing explicitly excluded applications exceeds the privacy boundary represented to the user. ### Attack Path 1. The user configures or accepts the default application blacklist. 2. The user opens a password manager, banking application, authentication prompt, or another excluded application. 3. The persistent tracking cron job invokes `screen-activity.sh`. 4. The commented blacklist code perf ...[truncated 974 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

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

Screenshots and SiYuan credentials may be transmitted over plaintext HTTP

Content
View full analysis
/dev/null) ``` The example configuration explicitly uses HTTP: ```json { "siyuan": { "url": "http://127.0.0.1:6806", "token": "YOUR_API_TOKEN", "notebook_id": "YOUR_NOTEBOOK_ID" }, "mlx_url": "http://192.168.1.198:18000/v1" } ``` The SiYuan client also places its token in a `curl` command argument and sends it to the configured URL: ```python cmd = [ "curl", "-s", "--connect-timeout", "10", "--max-time", "15", "-X", "POST", "-H", f"Authorization: Token {siyuan.get( ...[truncated 2125 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

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

Configuration values are interpolated into executable Python source

Content
View full analysis
/dev/null) ANALYSIS_PROMPT=$(python3 -c "import json; c=json.load(open('$CONFIG')); print(c.get('analysis_prompt',''))" 2>/dev/null) ``` Those values are then inserted directly into a Python program passed to `python3 -c`: ```bash SUMMARY=$(python3 -c " import json, base64, urllib.request, sys try: with open('$SCREENSHOT', 'rb') as f: img_b64 = base64.b64encode(f.read()).decode() payload = { 'model': 'Qwen3.5-2B-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 } 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()) content = data['choices'][0]['message']['content'].strip() print(content.split('\n')[0][:120]) except Exception as e: print('') " 2>/dev/null) ``` ### Technical Analysis `$PROMPT`, `$MLX_URL`, and `$SCREENSHOT` are expanded by the shell before Python parses the inline program. They are placed inside Python string literals without Python-aware escaping. A crafted prompt containing the triple-quote delimiter, or a URL/path conta ...[truncated 1656 chars]
Remediation
View remediation

T08 · Insecure Dependencies

Note
Location
SKILL.md:14
Finding

Globally installed screenshot dependency is not version-pinned

Content
View full analysis
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
Findings (34)

Description-Behavior Mismatch

High
Category
Not specified by scanner
Confidence
97% confidence
Finding

The README makes a strong privacy claim that data is local-only and not sent to the cloud, while elsewhere documenting screenshot analysis by an OpenAI-compatible vision model. That contradiction can mislead users into exposing highly sensitive screen contents under false assumptions about data handling and network transmission.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

High
Category
Not specified by scanner
Confidence
98% confidence
Finding

The FAQ reassures users that data stays in local files, but the same README instructs users to use a network-accessible vision model service and even test it via HTTP. This is a deceptive or at least dangerously incomplete disclosure because screenshots may contain credentials, personal messages, financial data, and other sensitive content.

Content

No source excerpt is available for this finding.

Missing User Warnings

High
Category
Not specified by scanner
Confidence
97% confidence
Finding

The README prominently markets silent, continuous screenshotting and AI analysis every 5 minutes without an equally prominent upfront warning that highly sensitive on-screen data may be captured, stored, and potentially transmitted for model analysis. In the context of a screen-tracking skill, inadequate disclosure increases the chance users enable pervasive monitoring without understanding the privacy and security consequences.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

The skill presents itself as an activity tracker, but the documented behavior materially expands to full-screen screenshot capture, storage, backend logging, and likely transmission of derived content to external services. In this context, that mismatch is dangerous because screen captures can contain credentials, private messages, internal documents, and other high-sensitivity data that a user may not expect to be collected or shared.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding

The skill presents itself as an activity tracker, but the documented behavior materially expands to full-screen screenshot capture, storage, backend logging, and likely transmission of derived content to external services. In this context, that mismatch is dangerous because screen captures can contain credentials, private messages, internal documents, and other high-sensitivity data that a user may not expect to be collected or shared.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding

The skill presents itself as an activity tracker, but the documented behavior materially expands to full-screen screenshot capture, storage, backend logging, and likely transmission of derived content to external services. In this context, that mismatch is dangerous because screen captures can contain credentials, private messages, internal documents, and other high-sensitivity data that a user may not expect to be collected or shared.

Content

No source excerpt is available for this finding.

Missing User Warnings

High
Category
Not specified by scanner
Confidence
97% confidence
Finding

The skill explicitly performs periodic screenshot capture and activity logging, but it does not provide a clear privacy warning or informed-consent language. Because screenshots can silently collect highly sensitive material from the entire screen, this omission materially increases the risk of accidental surveillance, credential capture, and exposure of confidential information.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

High
Category
Not specified by scanner
Confidence
96% confidence
Finding

The skill adds screenshot analysis and image submission functionality that goes beyond the declared scope of tracking, summary, and search. In a screen-activity tool, screenshots can contain highly sensitive data such as messages, credentials, documents, or financial information, so adding this capability without clear scope declaration materially increases privacy and data-exposure risk.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

High
Category
Not specified by scanner
Confidence
97% confidence
Finding

The code base64-encodes the full screenshot and sends it to a configurable endpoint via HTTP request, which can expose any visible on-screen secrets to another service. Because the manifest describes tracking/summary/search rather than image exfiltration or model-based screenshot inspection, this capability is not reasonably expected and creates a significant confidentiality risk.

Content

No source excerpt is available for this finding.

Missing User Warnings

High
Category
Not specified by scanner
Confidence
95% confidence
Finding

The script silently captures screenshots and proceeds with analysis/logging without any user-facing disclosure, confirmation, or runtime indication. Because screenshots can contain highly sensitive material, undisclosed collection is a privacy and security issue, especially for a background or scheduled tracking skill.

Content

No source excerpt is available for this finding.

Missing User Warnings

High
Category
Not specified by scanner
Confidence
97% confidence
Finding

The script transmits screen contents to an HTTP API without any user-facing warning or explicit consent, creating a significant privacy exposure. This is especially dangerous because the transferred content may include sensitive applications, personal communications, tokens, or confidential business data.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The opening description heavily promotes automatic screenshot capture and AI analysis without an immediate, prominent warning that the tool records on-screen content every 5 minutes. Users may enable it before understanding that private chats, tokens, documents, and other sensitive material can be captured and retained.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The privacy section says financial apps are skipped for screenshots, but it downplays that the timeline still records use of those apps. Even without screenshots, logging the time and presence of banking or password-manager usage is sensitive behavioral metadata that many users would reasonably expect to be excluded.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
88% confidence
Finding

The privacy messaging says sensitive apps are 'skipped,' but the documented behavior still logs that the user was using a financial or 2FA app at a given time. Metadata about use of banking, password, or authentication tools is itself sensitive and may reveal habits, account activity, or security workflows despite screenshots being omitted.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The README claims 'Zero cloud' and 'Everything stays on your machine,' yet it also documents use of an OpenAI-compatible vision model endpoint for screen analysis. That creates a material risk of users exposing screenshots containing sensitive data to a remote service, especially if they rely on the privacy assurances when enabling continuous capture.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
95% confidence
Finding

The skill invokes cron jobs, shell commands, file output, and network-connected backends, but it does not declare any explicit tool scope or allowed-tools boundary. This weakens reviewability and containment: a user or platform cannot easily verify that the skill's runtime capabilities match its declared purpose, increasing the chance of over-privileged execution and misuse.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The configuration example includes a SiYuan token and remote/local network endpoints for activity analysis and storage, but it does not warn users that screenshot-derived data may be transmitted or that credentials in config are sensitive. This can lead to inadvertent data sharing, unsafe token handling, and deployment of a privacy-invasive configuration without informed consent.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The blacklist contains only Chinese terms such as 银行, 密码, and 登录, which implies a language-specific privacy/safety behavior. There is no accompanying natural-language indication that this locale restriction is optional, user-selected, or justified as region-specific, so the config bakes in a language policy assumption.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
89% confidence
Finding

The script banner and manifest context describe a screen activity tracking skill, but the changelog text emitted for publishing advertises "screenshot tracking, AI analysis, and dual backend support." That is an active contradiction in the skill's documented intent within this file, because the release instructions represent the skill as having materially broader capabilities than the stated tracking-focused purpose.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

The model prompts explicitly require output in Chinese, and other user-visible strings in the file are also Chinese-only. This imposes a specific language/locale behavior without opt-in or justification, which is a natural-language policy concern under the language-choice rule.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The skill transmits screenshot contents to a model endpoint without any user-facing warning, consent flow, or disclosure of destination, retention, or sensitivity. That is dangerous because screenshots often include personal and security-sensitive information, and silent transmission prevents users from making an informed privacy decision.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The default and fallback prompts explicitly instruct the model to respond in Chinese, and the script provides no language selection or opt-in mechanism. This is a natural-language locale policy issue because the skill imposes a specific language on users without documented justification.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The script base64-encodes captured screenshots and posts them to a configurable HTTP endpoint, which can expose highly sensitive on-screen data such as credentials, messages, documents, and personal information. In the context of a screen-tracking skill, this materially increases data exfiltration risk beyond simple local logging, especially because the endpoint is configurable and there is no visible consent or trust validation in the script.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The script stores screenshots and derived summaries in local markdown files without informing the user, which can create a discoverable archive of sensitive activity on disk. Local persistence increases exposure to other local users, backups, indexing tools, and malware that can read these files later.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
86% confidence
Finding

The cleanup step removes old screenshot directories with rm -rf based on retention settings. This is a destructive file operation, and the script does not provide any visible warning, confirmation, or user-facing notice that stored data will be deleted automatically.

Content

No source excerpt is available for this finding.