Back to skill

Security audit

阅读助手

Security checks for vulnerabilities and agentic risk

Overview

This reading helper is mostly purpose-aligned, but its broad URL fetching and automatic local logging need careful review before installation.

Review this before installing. It should only be used if users understand that summaries and source details may be stored locally. Avoid sensitive documents, private emails, internal URLs, and local file-style URLs unless the skill is changed to require explicit logging consent, restrict URL fetching to safe HTTP/HTTPS destinations, enforce response-size limits, and provide a way to inspect and delete saved records.

Vulnerability Patterns
  • 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
  • Embedded Malicious CodeShips malicious scripts inside the skill and executes them locally
Findings (1)

T09 · Insecure Skill Coding Practices

Error
Location
SKILL.md:115
Finding

Unrestricted URL Fetching Enables SSRF, Local File Access, and Resource Exhaustion

Content
View full analysis
dict: """从URL抓取并提炼""" try: resp = urlopen(url, timeout=10) html = resp.read().decode("utf-8", errors="ignore") # 简单去标签 text = re.sub(r'<[^>]+>', '', html) text = re.sub(r'\s+', ' ', text).strip() reader = ReadingAssistant() return reader.extract(text, source=url) except Exception as e: return {"error": str(e)} ``` ### Technical Analysis The `extract_url` function passes an unvalidated, caller-controlled URL directly to `urllib.request.urlopen`. Although `urlparse` is imported, it is never used to validate the URL. This creates several related security risks: - **Server-Side Request Forgery (SSRF):** A caller can request loopback, link-local, private-network, or otherwise internal endpoints that are reachable from the process running the Skill. - **Local file access:** `urlopen` supports schemes other than HTTP and HTTPS, including `file://`. A crafted URL can therefore cause the process to read files available under its operating-system privileges. - **Redirect-based filter bypass:** Even if validation were later added only to the initial URL, `urlopen` follows HTTP redirects by default. A public endpoint could redirect the request to an internal destination unless every redirect target is independently validated. - **Unbounded response consumption:** `resp.read()` reads the entire response into memory without enforcing a maximum size. A large or indefinitely generated response can consume excessive memory and degrade or terminate the process. - **Persistence of extracted data:** The fetched text is passed to `ReadingAssistant.extract`, which stores extracted portions and metadata in `reading_lo ...[truncated 1940 chars]
Remediation
View remediation
Vulnerability Patterns
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
Findings (5)

Vague Triggers

High
Category
Not specified by scanner
Confidence
96% confidence
Finding

The activation phrases are extremely generic ('读一下 / 总结 / 提炼 / 摘要') and are likely to trigger during ordinary conversation or unrelated requests. This can cause the skill to activate unintentionally and process or log user content without clear user intent, increasing privacy and data-handling risk.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
88% confidence
Finding

The description is written as a Chinese-only experience and presents the extraction structure and behavior entirely in Chinese, without offering a language choice. This can violate language or locale policy when a skill imposes a specific language by default rather than letting the user opt in.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
98% confidence
Finding

The skill advertises webpage fetching and text summarization but does not clearly warn users that their content and source metadata are automatically saved locally. This undermines informed consent and may lead users to submit sensitive articles, emails, or URLs that are then retained unexpectedly.

Content

No source excerpt is available for this finding.

Ssd 3

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

Automatic saving of reading content to a local knowledge/log file creates a real data retention risk, especially because the skill is designed to handle arbitrary pasted text, web content, documents, and potentially sensitive emails. Even local-only logging can expose private material to other local users, backups, later compromise, or unintended reuse.

Content

No source excerpt is available for this finding.

Ssd 3

Medium
Category
Not specified by scanner
Confidence
99% confidence
Finding

The implementation appends extracted content, timestamps, and source metadata into a persistent JSON log every time extract() is called, with no consent, filtering, access control, or retention policy. Because this skill summarizes arbitrary user-supplied text and fetched webpages, the context makes the issue more dangerous: users may paste confidential documents, internal URLs, or sensitive correspondence that will be stored automatically.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.