YNote Clip

Security checks across malware telemetry and agentic risk

Overview

This mostly behaves like a YNote web clipper, but it needs review because it includes broad YNote MCP calling ability, a bundled Apify token for Twitter/X clipping, and extra account/local-state checks after saving.

Before installing, confirm you are comfortable with selected webpage content being sent to YNote, Twitter/X clipping being processed through Apify, and the skill having broad YNote MCP helper capabilities. Prefer using your own declared credentials, avoid sourcing a full shell profile, and clean up the /tmp clipping data file after sensitive saves.

VirusTotal

66/66 vendors flagged this skill as clean.

View on VirusTotal

Risk analysis

Artifact-based informational review of SKILL.md, metadata, install specs, static scan signals, and capability signals. ClawScan does not execute the skill or run runtime probes.

#
ASI02: Tool Misuse and Exploitation
Medium
What this means

If misused by the agent or by instructions that influence the agent, this helper could call YNote MCP tools beyond the clipping workflow, including any higher-impact tools the server exposes.

Why it was flagged

The helper forwards an arbitrary tool name and arbitrary JSON arguments to the YNote MCP server with the user's API key, with no local allowlist or confirmation boundary.

Skill content
TOOL_NAME="${1:?用法: mcp-call.sh <tool_name> '<json_args>'}" ... method:"tools/call",params:{name:$name,arguments:$args}
Recommendation

Restrict the helper to a small allowlist needed for clipping, and require explicit user confirmation for any read, delete, publish, or bulk-change operation.

#
ASI03: Identity and Privilege Abuse
Medium
What this means

Twitter/X URLs may be processed through an Apify account controlled by an unknown party, and the embedded credential creates unclear accountability and privacy expectations.

Why it was flagged

The Twitter/X flow uses a hardcoded Apify API token when APIFY_API_TOKEN is not set, even though the registry requirements only declare YNOTE_API_KEY.

Skill content
const DEFAULT_APIFY_TOKEN = 'apify_api_vsVgnrJKGDCfhfTil8FpBaMaM4vexW1TZocw'; ... const token = process.env.APIFY_API_TOKEN || DEFAULT_APIFY_TOKEN;
Recommendation

Remove the bundled token, declare APIFY_API_TOKEN if Apify is required, and ask the user before sending a Twitter/X URL to Apify.

#
ASI03: Identity and Privilege Abuse
Medium
What this means

A user asking only to save a page may also have recent-note metadata and local scheduled-task state inspected for a promotional suggestion.

Why it was flagged

After a successful clip, the skill instructs the agent to read recent favorite notes and local cron state to decide whether to show a briefing prompt.

Skill content
剪藏成功后... bash {baseDir}/mcp-call.sh getRecentFavoriteNotes '{"limit":3}' ... openclaw cron list --json
Recommendation

Make this follow-up check opt-in, clearly disclose it to the user, and avoid reading note lists or cron state unless the user asks for briefing setup.

#
ASI05: Unexpected Code Execution
Low
What this means

The skill runs injected JavaScript inside the browser page to collect content from the URL being clipped.

Why it was flagged

The skill decodes a large base64 JavaScript payload for browser-page injection; this is aligned with extracting page content, but it is less transparent than plain source.

Skill content
(()=>{const s=document.createElement('script');s.textContent=atob('dmFyIGNvbGxlY3RQYXJzZXI7...
Recommendation

Keep the injected source in readable form, verify the base64 matches the bundled collect-window.js, and avoid changing page state beyond extraction.

#
ASI05: Unexpected Code Execution
Low
What this means

Sourcing the whole shell profile can execute user-defined shell startup code and expose additional exported environment variables to the clipping process.

Why it was flagged

The default workflow suggests sourcing the user's shell profile before running the Node script so environment variables are available.

Skill content
source ~/.zshrc && node {baseDir}/clip-note.mjs --data-file /tmp/ynote-clip-data.json
Recommendation

Prefer passing only the required YNOTE_API_KEY to the command environment instead of sourcing the full shell profile.

#
ASI06: Memory and Context Poisoning
Low
What this means

Content from the clipped page may remain on local disk after the note is created, which matters for private or logged-in pages.

Why it was flagged

The final JSON file containing extracted title/content/image URLs is written to a fixed /tmp path, while only the intermediate .raw file is removed.

Skill content
DATA_FILE="${2:-/tmp/ynote-clip-data.json}" ... writeFileSync('$DATA_FILE', JSON.stringify(d)); ... rm -f "$DATA_FILE.raw"
Recommendation

Delete /tmp/ynote-clip-data.json after successful clipping or write it with restrictive permissions in a per-run temporary directory.