Back to skill

Security audit

AnyLink to Note

Security checks for vulnerabilities and agentic risk

Overview

The skill has a coherent link-to-note purpose, but it uses broad network fetching and unsafe command examples that could expose private links or run unintended local commands.

Review this skill before installing. Use it only for links you are comfortable sending to third-party extraction services, avoid private/internal/tokenized URLs, and do not let an agent paste raw user-provided URLs into the documented shell commands without strict validation and argument-safe execution.

Vulnerability Patterns
  • Unauthorized Access and Privilege EscalationObtains permissions beyond the task's legitimate needs
  • 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
Findings (4)

T09 · Insecure Skill Coding Practices

Error
Location
SKILL.md:43
Finding

Shell Command Injection Through Unquoted Get Note URL Substitution

Content
View full analysis
``` `references/url-types.md:24`: ```bash node skills/anylink-to-note/scripts/getnote.js ``` ### Technical Analysis The Skill instructs an agent or user to substitute an externally supplied URL directly into an unquoted shell command. If the value contains shell control operators, command substitution, redirection, or whitespace, the shell can interpret those characters as syntax rather than as part of a single URL argument. Although `scripts/getnote.js` itself reads the URL through `process.argv[2]`, that protection occurs only after the shell has parsed the command. It therefore does not prevent command injection introduced by unsafe command construction. ### Attack Path 1. An attacker supplies a purported Get Note link containing shell metacharacters, such as a command separator followed by an attacker-selected command. 2. The Skill replaces the `` placeholder with the supplied text. 3. The generated command is passed to a shell. 4. The shell interprets the metacharacters and executes the injected command in addition to, or instead of, invoking `getnote.js`. 5. The injected command runs with the operating-system permissions of the user or agent executing the Skill. ### Impact Assessment Successful exploitation permits arbitrary local command execution. The attacker may read files accessible to the agent, access environment variables and locally stored credentials, alter project data, make network requests, install additional payloads, or otherwise act with the full privileges of the Skill process. ]]>
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Error
Location
SKILL.md:48
Finding

Command Injection Through RSS URL Interpolation

Content
View full analysis
" | python3 -c "import sys,xmltodict; d=xmltodict.parse(sys.stdin.read()); print(d['rss']['channel']['item'][0]['description'])" ``` `references/url-types.md:29`: ```bash curl -sL "" | python3 -c "import sys,xmltodict; d=xmltodict.parse(sys.stdin.read()); print(d['rss']['channel']['item'][0]['description'])" ``` ### Technical Analysis This pipeline does **not** pipe downloaded content into Bash or another shell interpreter. The remote response is passed to Python and parsed as XML, so the RSS response body is not directly executed as shell code. However, the attacker-controlled `` placeholder is embedded in a double-quoted shell argument. Double quotes do not prevent all shell evaluation: embedded quote termination, command substitution, and related shell syntax can still become executable if untrusted text is inserted into the command before shell parsing. Consequently, the dangerous component is URL interpolation into a shell command, not the XML pipeline itself. ### Attack Path 1. An attacker submits a purported RSS URL containing shell syntax or command substitution. 2. The Skill inserts the supplied value into the `` placeholder. 3. The resulting command is evaluated by a shell. 4. The shell evaluates the injected expression while preparing or executing the `curl` command. 5. The attacker's command runs locally with the privileges of the Skill process, regardless of whether RSS retrieval or XML parsing succeeds. ### Impact Assessment Exploitation can result in arbitrary command execution, access to local files and environment variables, credential disclosure, modification of project or user data, and execution of additional network or system operations under the ...[truncated 20 chars]
Remediation
View remediation

T05 · Unauthorized Access and Privilege Escalation

Warning
Location
scripts/getnote.js:8
Finding

Unrestricted Playwright Navigation Enables Server-Side Request Forgery

Content
View full analysis
'); process.exit(1); } ``` The rendered page text is subsequently extracted and returned: ```javascript const content = await page.evaluate(() => { const el = document.querySelector('#app') || document.body; return (el && 'innerText' in el) ? el.innerText : ''; }); ``` ### Technical Analysis The script is documented as an extractor for `d.biji.com` or `biji.com`, but the implementation does not enforce those hosts. It passes any supplied URL to Chromium without validating the scheme, hostname, resolved address, redirect destination, or subresource destinations. A browser running on the agent host may be able to reach loopback services, private-network interfaces, link-local endpoints, or other resources unavailable to an external attacker. Because the script extracts page text and prints it as JSON, content returned by an internal HTTP service may be exposed through the Skill output. The 25-second navigation timeout limits duration but does not establish an authorization boundary or prevent internal requests. ### Attack Path 1. An attacker causes the Skill to invoke `getnote.js` with an internal URL, or with an external URL that redirects to an internal destination. 2. Headless Chromium performs the request from the agent's network context. 3. The target responds with an HTML or text-renderable page. 4. The script reads the document title and the visible text from `#app` or `document ...[truncated 674 chars]
Remediation
View remediation

T08 · Insecure Dependencies

Warning
Location
SKILL.md:68
Finding

Unpinned Playwright Installation Through npx Creates Supply-Chain Exposure

Content
View full analysis
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
Findings (9)

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding

声明描述的是一个通用链接解析与笔记结构化工具,覆盖多类链接并生成包含标题、正文、摘要、标签的完整结果。而实际代码只是一个名为 getnote.js 的脚本:通过 Playwright 打开给定 URL,等待渲染后读取页面 title 和 #app/document.body 的 innerText,并做一些针对 Get Notes 页面不可访问状态的判断。其主要功能是抓取 Get Notes 分享页文本,而不是通用的多源链接解析器。代码没有任何摘要生成、标签生成、RSS 解析、微信公众号专用提取、任意网页适配等实现,因此描述明显夸大了能力范围与输出内容。

Content

No source excerpt is available for this finding.

External Script Fetching

High
Category
Supply Chain
Confidence
96% confidence
Finding

The skill recommends piping arbitrary remote RSS content directly into Python-based parsing, which creates a classic untrusted-input processing path. In the context of a link-ingestion skill, an attacker can supply crafted URLs pointing to malicious or internal resources, leading to SSRF-style access, unexpected resource consumption, or abuse of the environment's network reach even if the Python snippet itself is simple.

Content

Scanner excerpt · SKILL.md (reported line 48)May include surrounding context.

RSS 播客:

bash
curl -sL "<rss-url>" | python3 -c "import sys,xmltodict; d=xmltodict.parse(sys.stdin.read()); print(d['rss']['channel']['item'][0]['description'])"

3. 生成摘要 & 标签

External Script Fetching

High
Category
Supply Chain
Confidence
90% confidence
Finding

Remote code is downloaded and executed. This bypasses code review and could introduce malicious code.

Content

Scanner excerpt · references/url-types.md (reported line 29)May include surrounding context.

3. RSS (Podcasts)

bash
curl -sL "<rss-url>" | python3 -c "import sys,xmltodict; d=xmltodict.parse(sys.stdin.read()); print(d['rss']['channel']['item'][0]['description'])"

Jina Reader Limitations

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The trigger conditions are broad enough that ordinary words like '保存'、'解析'、'总结'、'收藏' may activate the skill unexpectedly when a user shares a link. Because the skill sends URLs to external services and may execute helper tooling, accidental invocation can cause unintended data disclosure or network access without clear user intent.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
84% confidence
Finding

L03 及整份说明均以中文规定技能行为和输出,没有提供语言选择、用户偏好继承或明确的区域限定理由。按照语言/locale 政策,若技能默认强制特定语言而未提供 opt-in,属于自然语言层面的策略问题。

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The skill explicitly forwards user-supplied URLs to r.jina.ai, a third-party content extraction service, but does not warn the user that their link and potentially sensitive query parameters will leave the local trust boundary. This is a privacy and data-handling risk, especially if users paste internal, private, or tokenized URLs assuming only local summarization will occur.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
70% confidence
Finding

npx commands without a version suffix (e.g. @1.0.0) create a rug-pull risk if the upstream server is compromised and publishes a malicious update.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
70% confidence
Finding

npx commands without a version suffix (e.g. @1.0.0) create a rug-pull risk if the upstream server is compromised and publishes a malicious update.

Content

No source excerpt is available for this finding.

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
85% confidence
Finding

The markdown instructs use of a local script and external network retrieval for Get notes and RSS content without a clear safety notice. Even though this is documentation, the described behavior can lead operators or agent frameworks to fetch attacker-controlled resources and process untrusted content without understanding the trust and privacy implications.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.