T09 · Insecure Skill Coding Practices
- Location
scripts/download_images.py:119- Finding
Unrestricted URL Fetching Enables SSRF and Local File Disclosure
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This skill has a coherent Obsidian article-saving purpose, but its automatic external fetching and weak URL/path safeguards warrant Review before installation.
Review before installing. Use this only with public, non-sensitive article URLs unless you are comfortable sending target URLs through Jina.ai and possibly capturing browser-visible logged-in content. Avoid internal, localhost, file, cloud metadata, private, paywalled, or tokenized links. Configure the vault path carefully and watch disk/network usage until the publisher adds URL allowlisting, private-network blocking, bounded downloads, path containment, and explicit consent for third-party or authenticated-page retrieval.
scripts/download_images.py:119Unrestricted URL Fetching Enables SSRF and Local File Disclosure
scripts/config.py:27Insufficient Vault Path Validation Allows Writes Outside the Intended Directory
scripts/download_images.py:42Unbounded Response and Image Downloads Enable Resource Exhaustion
The skill description omits a material data flow: article URLs and fetched content may be sent to the third-party service r.jina.ai. In a tool that claims local Obsidian saving, this mismatch can mislead users into exposing private or sensitive reading targets to an external service without informed consent.
The skill description omits a material data flow: article URLs and fetched content may be sent to the third-party service r.jina.ai. In a tool that claims local Obsidian saving, this mismatch can mislead users into exposing private or sensitive reading targets to an external service without informed consent.
The script performs outbound network access to fetch arbitrary article pages, images, and a third-party markdown conversion service, but the finding indicates this capability is not declared in permissions. Undeclared network capability is dangerous because it expands the skill's effective trust boundary and can enable unreviewed data exfiltration or unexpected remote interactions.
The code sends the user-supplied article URL to https://r.jina.ai/ to obtain markdown, which means article access and potentially sensitive target URLs are disclosed to a third party despite the skill being described as saving content locally. This creates a privacy and data-handling risk because private, internal, tokenized, or otherwise sensitive URLs may be relayed outside the local Obsidian workflow.
Relaying article retrieval through a third-party endpoint is not necessary for the stated purpose of locally saving webpages and therefore introduces an unjustified external data flow. Because the skill context implies a local-only archival action, this mismatch makes the behavior more dangerous by violating user expectations and increasing the chance that sensitive browsing targets are exposed.
The skill is presented as a local save helper, but its documented capture path sends URLs and potentially article content through external services and browser-based retrieval. That discrepancy creates a privacy and trust risk because users may reasonably expect purely local handling when saving to a local Obsidian vault.
The manifest description and all invocation/setup instructions are presented in Chinese, including required trigger phrases and first-run prompts, with no indication that another language is accepted. This creates a locale/language constraint in the skill's natural-language interface without user opt-in or a documented region-specific justification.
The skill's allowed tools support persistent writes and command execution, which expands the blast radius of any misuse or prompt-injection-triggered action. Even if intended for normal article saving, these capabilities can create durable local changes and execute helper scripts on behalf of the user.
description: 将网页文章保存到本地 Obsidian Vault,支持图片抓取、Markdown 转换、YAML frontmatter 和用户笔记附加。
allowed-tools:
- Read
- Write
- Edit
- exec
---
The skill's allowed tools support persistent writes and command execution, which expands the blast radius of any misuse or prompt-injection-triggered action. Even if intended for normal article saving, these capabilities can create durable local changes and execute helper scripts on behalf of the user.
description: 将网页文章保存到本地 Obsidian Vault,支持图片抓取、Markdown 转换、YAML frontmatter 和用户笔记附加。
allowed-tools:
- Read
- Write
- Edit
- exec
---
The skill persists configuration data under the user's home directory and writes files into user-specified vault paths, but does not prominently warn about this local persistence. Silent filesystem writes can surprise users, expose sensitive path information, and create unwanted long-term artifacts on disk.
The skill does not provide a clear user-facing warning that URLs and retrieved content may be sent to Jina.ai. This is dangerous because even a URL alone can reveal sensitive interests, internal resources, or private documents, and fetched page content may also be disclosed to a third party.
The browser fallback explicitly contemplates accessing logged-in or crawler-blocked pages, which broadens the skill from simple article saving into access and extraction of potentially private content. If invoked on authenticated pages, the skill could capture sensitive account-specific data and store it locally or process it unexpectedly.
The command-line interface prints status messages in Chinese only, which forces a specific language for users without offering a choice or documenting a justified locale restriction. This matches the policy category for language or locale constraints in natural-language content.
The script forwards article retrieval to a third-party service without explicit user warning or informed consent beyond routine stderr logging. This is dangerous because users may reasonably believe content is processed locally, while in reality their requested URLs and associated content may be observable by an external provider.
The docstring for clean_html_to_markdown says 'Simple HTML to Markdown conversion,' and convert_html_to_markdown_with_local_images also claims to convert HTML to Markdown. In reality, the implementation only strips script/style tags and returns the remaining HTML without performing substantive markdown conversion, which contradicts the documented intent.
No suspicious patterns detected.