Back to skill

Security audit

Article To Html

Security checks for vulnerabilities and agentic risk

Overview

The skill mostly does its advertised article-to-infographic job, but its screenshot workflow can expose a local directory and leave a server running, and its templates contact Google Fonts despite claiming self-contained output.

Review before installing. Use the skill only on content you are comfortable writing to local HTML files, and prefer running screenshot serving from a dedicated temporary directory bound to 127.0.0.1 with cleanup. Remove or replace remote font imports if offline or no-third-party-network rendering matters, and ignore the unrelated sample output install command unless you separately intended to evaluate that other project.

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 (3)

T09 · Insecure Skill Coding Practices

Warning
Location
rules/02-截图流程.md:18
Finding
Temporary HTTP Server Exposes the Output Directory on All Network Interfaces<![CDATA[ ## Vulnerability Details **File Location**: `rules/02-截图流程.md`, lines 18-22 **Vulnerability Type**: Unrestricted network binding and directory exposure **Risk Level**: Medium ### Vulnerable Code ```bash □ 0. Start a temporary HTTP server if one is not already running. Start it from the HTML directory: python3 -m http.server 8899 --directory <HTML_DIRECTORY> & Then open http://localhost:8899/filename.html ``` The security-relevant command in the original file is: ```bash python3 -m http.server 8899 --directory <html所在目录> & ``` ### Technical Analysis Python's `http.server` binds to all available network interfaces by default. Although the documented browser URL uses `localhost`, the listening socket is not restricted to the loopback interface. The command serves the entire selected directory rather than only the intended HTML file. Every readable file under that directory can consequently be requested by another host that can reach TCP port 8899. The process is also placed in the background without PID tracking or guaranteed cleanup, increasing the chance that the service remains available after screenshot generation. No authentication, authorization, transport encryption, or directory isolation is applied. ### Attack Path 1. A user supplies an article or note containing sensitive information. 2. The Agent generates HTML in a working directory that may also contain other files. 3. The screenshot workflow starts `python3 -m http.server 8899 --directory ... &`. 4. Python listens on all interfaces, including a LAN or container-facing interface. 5. An attacker with network access discovers or predicts port 8899. 6. The attacker requests the generated HTML or another known file beneath the served directory. 7. The service may remain available because the workflow does not retain and terminate its PID. ### Impact Assessment This issue does not provide operating-system privilege escalation or arbitrary code execution. It can, however, gr ...[truncated 381 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Bind the server explicitly to loopback: ```bash python3 -m http.server 8899 \ --bind 127.0.0.1 \ --directory "$TEMP_OUTPUT_DIRECTORY" & SERVER_PID=$! ``` 2. Create a dedicated temporary directory and copy only the intended HTML file and required local assets into it. 3. Do not serve the conversation working directory or project root. 4. Record the exact server PID and terminate it reliably: ```bash cleanup() { if kill -0 "$SERVER_PID" 2>/dev/null; then kill "$SERVER_PID" wait "$SERVER_PID" 2>/dev/null || true fi rm -rf "$TEMP_OUTPUT_DIRECTORY" } trap cleanup EXIT INT TERM ``` 5. Use a randomly selected free port to reduce collisions. 6. Disable directory listings through a minimal custom handler or serve only an explicitly selected file. 7. Confirm that the browser navigates only to `127.0.0.1`, not a non-loopback hostname. ]]>

T09 · Insecure Skill Coding Practices

Note
Location
templates/style-business.html:8
Finding
Remote Google Font Imports Violate the Self-Contained Output Boundary<![CDATA[ ## Vulnerability Details **File Locations**: - `templates/style-business.html`, line 8 - `templates/style-dark-tech.html`, line 8 - `templates/style-journal.html`, line 8 - `templates/style-magazine.html`, line 8 - `templates/style-memphis.html`, line 8 - `templates/style-newspaper.html`, line 8 - `templates/style-nordic.html`, line 8 - `templates/style-retro-future.html`, line 8 - `outputs/app-store-preflight-summary.html`, line 7 - `outputs/style-journal-test.html`, line 8 **Vulnerability Type**: Undisclosed third-party network requests and external dependency **Risk Level**: Low ### Vulnerable Code Representative complete import from `templates/style-business.html`: ```css @import url('https://fonts.googleapis.com/css2?family=DM+Sans:wght@300;400;500;600;700&family=Noto+Sans+SC:wght@300;400;500;700;900&display=swap'); ``` Another generated artifact contains: ```css @import url('https://fonts.googleapis.com/css2?family=Playfair+Display:ital,wght@0,400;0,700;0,900;1,400&family=Noto+Serif+SC:wght@400;700;900&family=Noto+Sans+SC:wght@300;400;500;700&display=swap'); ``` ### Technical Analysis The templates use CSS `@import` directives that cause the browser to contact `fonts.googleapis.com`. The returned stylesheet normally causes additional requests to Google-hosted font resources. This behavior conflicts with the project's declared output boundary: - `SKILL.md`, line 29, describes generated HTML as self-contained. - `docs/01-快速开始.md`, line 36, states that styles are embedded and there are no external dependencies. When generated HTML retains one of these imports, simply opening or screenshotting the file causes third-party communication. The requests can disclose the viewer's IP address, request timing, browser/network metadata, and the fact that the document was opened. They also make rendering dependent on network availability and mutable third-party responses. No evidence was found that executable JavaScript is retrieved or run through ...[truncated 1106 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Remove all remote `@import` declarations from templates and generated examples. 2. Prefer a system-font stack that requires no network access: ```css font-family: Inter, Arial, "Helvetica Neue", sans-serif; ``` 3. If custom fonts are required, package vetted font files with the Skill and embed them using local `@font-face` rules or data URLs. 4. Verify font licensing before redistribution or embedding. 5. Add a post-generation validation step that rejects external resources, including: - `http://` and `https://` URLs - CSS `@import` - Remote `url(...)` values - Remote scripts, images, frames, and stylesheets 6. Apply a restrictive Content Security Policy suitable for standalone output, such as: ```html <meta http-equiv="Content-Security-Policy" content="default-src 'none'; style-src 'unsafe-inline'; img-src data:; font-src data:;"> ``` 7. Update existing generated artifacts so that examples do not normalize behavior that contradicts the documented security boundary. ]]>

T09 · Insecure Skill Coding Practices

Note
Location
rules/02-截图流程.md:60
Finding
Pattern-Based Process Termination Can Kill Unrelated Browser Automation Sessions<![CDATA[ ## Vulnerability Details **File Location**: `rules/02-截图流程.md`, line 60 **Vulnerability Type**: Overbroad process termination **Risk Level**: Low ### Vulnerable Code ```bash pkill -f "chrome-devtools-mcp" ``` ### Technical Analysis The `-f` option makes `pkill` match against the complete command line. The command terminates every process whose command line contains `chrome-devtools-mcp`, rather than only a process launched by the current Skill execution. There is no PID ownership tracking, parent-process validation, user confirmation, or graceful shutdown. As a result, unrelated Chrome DevTools MCP sessions running under the same account can be terminated. The command appears as troubleshooting guidance rather than an automatically executed script. Exploitation therefore requires the Agent or user to follow that guidance. ### Attack Path 1. One or more legitimate browser automation sessions are running with `chrome-devtools-mcp` in their command lines. 2. The current screenshot workflow encounters an error or believes that a stale process remains. 3. The Agent or user executes the documented `pkill -f` command. 4. The operating system sends termination signals to all matching processes owned by the invoking account. 5. Unrelated sessions terminate, potentially interrupting active tasks or losing unsaved automation state. ### Impact Assessment This issue does not allow an attacker to gain additional privileges. The command can only terminate processes that the invoking account is already permitted to signal. The primary impact is availability loss within that account's process scope. It can interrupt unrelated browser automation, concurrent Agent jobs, screenshot operations, or development sessions. Data loss is possible if a terminated process holds unsaved state. ]]>
Remediation
<![CDATA[ ## Remediation Suggestions 1. Remove the blanket `pkill -f` instruction. 2. Record the PID whenever the Skill launches a browser or MCP process. 3. Before termination, verify that the PID still exists and corresponds to the process created by the current run. 4. Terminate only the recorded PID: ```bash if kill -0 "$MCP_PID" 2>/dev/null; then kill "$MCP_PID" wait "$MCP_PID" 2>/dev/null || true fi ``` 5. Prefer the MCP or browser tool's supported close or shutdown operation before sending operating-system signals. 6. Use a cleanup trap to stop only processes created by the current invocation. 7. If manual recovery remains necessary, instruct the user to inspect matching processes and select a specific PID rather than terminating every match. ]]>
Vulnerability Patterns
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
Findings (45)

Tp4

High
Category
MCP Tool Poisoning
Confidence
93% confidence
Finding
The declared purpose is article-to-infographic conversion, but the instructions also require local file modification and shell-based post-processing that are not clearly represented in the description. This mismatch can mislead users and reviewers about the real operational behavior, reducing informed consent and making risky side effects harder to detect.

Description-Behavior Mismatch

High
Confidence
99% confidence
Finding
The output file is materially unrelated to the declared skill purpose ('article-to-html') and instead contains a polished summary of an external 'App Store Preflight Skills' project. This kind of skill-definition inconsistency is dangerous because it can conceal prompt injection, supply-chain redirection, or unauthorized promotional behavior under the cover of a benign formatting skill.

Hidden Instructions

High
Category
Prompt Injection
Content
<body>
<div class="container">

  <!-- HEADER -->
  <div class="header">
    <span class="coord">SEC-00</span>
    <div class="sys-line">SYS.INIT — AGENT COGNITION MODULE</div>
Confidence
70% confidence
Finding
Hidden instructions were detected in comments or invisible text. These could contain malicious directives. Manual review is recommended.

Hidden Instructions

High
Category
Prompt Injection
Content
<body>
<div class="container">

  <!-- HEADER -->
  <div class="header">
    <span class="coord">SEC-00</span>
    <div class="sys-line">SYS.INIT — AGENT COGNITION MODULE</div>
Confidence
70% confidence
Finding
Hidden instructions were detected in comments or invisible text. These could contain malicious directives. Manual review is recommended.

Vague Triggers

Medium
Confidence
94% confidence
Finding
The README describes very broad trigger phrases such as ‘文章转图’, ‘笔记转图’, ‘信息图’, and ‘做张图’ without clear scoping, consent, or content-type constraints. In an agent environment, overly generic activation can cause the skill to trigger on unrelated user requests or sensitive content, increasing the chance of unintended processing, data exposure to downstream tools, or unsafe autonomous actions.

Lp3

Medium
Category
MCP Least Privilege
Confidence
91% confidence
Finding
The skill instructs the agent to generate and then modify local HTML files, but it declares no tool scope or permissions. This creates an implicit file-write capability that users and the platform cannot review or constrain, increasing the chance of unauthorized file creation or overwriting in the local environment.

Vague Triggers

Medium
Confidence
96% confidence
Finding
L03 的触发场景同时列出“做张图”“信息图”“文生图”等宽泛表达,其中“做张图”尤其缺乏领域约束,容易与普通作图请求混淆。该描述也没有给出明确边界或排除条件,难以判断何时应触发本技能、何时不应触发。

Missing User Warnings

Medium
Confidence
94% confidence
Finding
The skill makes shell execution mandatory via a local post-processing script, but does not clearly warn the user that a shell command will be run. Hidden or undisclosed command execution is dangerous because it can perform arbitrary local actions, especially when the script path is user-environment specific and the script contents are not visible from this file.

Natural-Language Policy Violations

Medium
Confidence
91% confidence
Finding
All user-facing instructions and invocation examples are presented only in Chinese, including the exact example prompts to send to the system. Under the stated policy, forcing a specific language without user opt-in can be a natural-language policy violation when no alternative language option or justification is provided.

Natural-Language Policy Violations

Medium
Confidence
96% confidence
Finding
The document declares `lang="zh-CN"`, and the visible content is entirely in Chinese, which imposes a specific language/locale on users without any opt-in or alternative. Under the policy criteria, this is a natural-language locale constraint that is neither optional nor justified as region-specific.

Context-Inappropriate Capability

Medium
Confidence
96% confidence
Finding
The skill output includes promotional/documentation content for an external GitHub project, including install instructions and dependencies, despite the skill being described as an article-to-HTML converter. This creates a trust-boundary violation: user-triggered rendering may be repurposed to advertise or redirect users to third-party tooling, which can facilitate social engineering or unintended package installation.

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.

Description-Behavior Mismatch

Medium
Confidence
97% confidence
Finding
The manifest describes a skill that transforms a provided article or note into a mobile-readable HTML infographic. This file instead contains a fixed 'AI_RECORDING_CARD / PRODUCT_ARCHITECTURE' layout with hard-coded compliance and cost content, indicating the output is template content unrelated to a source article rather than a conversion of user-provided material.

Natural-Language Policy Violations

Medium
Confidence
93% confidence
Finding
The document declares `lang="zh-CN"`, and all visible user-facing content is in Chinese, which imposes a specific language/locale. The file does not indicate that the locale is optional, user-selected, or required for a region-specific purpose, so this is a natural-language locale policy concern.

Natural-Language Policy Violations

Medium
Confidence
95% confidence
Finding
The document declares `lang="zh-CN"` and all visible product text is presented in Simplified Chinese, while the content itself references the North American market. This imposes a specific language/locale on users without any opt-in or explanation, which matches the policy's language/locale violation criteria.

Description-Behavior Mismatch

Medium
Confidence
95% confidence
Finding
The manifest describes a skill that transforms a provided article or note into a mobile-readable HTML infographic with automatically matched visual style. This file instead contains a fixed infographic about an 'AI 录音卡片' product architecture, suggesting hard-coded demo/business content rather than a generic article-to-infographic transformation output.

Description-Behavior Mismatch

Medium
Confidence
96% confidence
Finding
The manifest describes a skill that converts arbitrary articles or notes into mobile-readable HTML infographics with automatically matched visual style. This file instead contains a fixed, prewritten infographic about 'AI 录音卡片' product architecture and cost/compliance details, with no code or template logic for transforming user-supplied article content.

Natural-Language Policy Violations

Medium
Confidence
91% confidence
Finding
The file states the output as "HTML 生成时的技术硬约束," and the entire instruction set is written as mandatory guidance in Chinese with no indication that users may choose another language or locale. Under the policy, forcing a specific language without opt-in is a natural-language policy violation unless clearly justified as region-specific.

Natural-Language Policy Violations

Medium
Confidence
95% confidence
Finding
This code file contains natural-language comments and CLI usage text exclusively in Chinese, including the script description and invocation help. Under the policy rule, forcing a specific language without opt-in is a locale/language policy violation unless the constraint is explicitly justified, which is not documented here.

Natural-Language Policy Violations

Medium
Confidence
95% confidence
Finding
The document declares `lang="zh-CN"`, which hard-codes a specific language/locale for the skill output. Under the policy, locale constraints should either be user-selectable or clearly justified as region-specific; neither is present in this file.

Natural-Language Policy Violations

Medium
Confidence
93% confidence
Finding
The document declares `lang="zh-CN"`, which hard-codes a specific language/locale for the skill output. Under the policy, locale constraints should either be optional for the user or clearly justified as region-specific; this file provides neither.

Description-Behavior Mismatch

Medium
Confidence
95% confidence
Finding
The manifest describes a skill that converts arbitrary articles or notes into mobile-readable HTML infographics with automatic style matching. This file instead contains hard-coded title, metrics, sections, and body text for a specific topic ('Agent认知:OS与Application'), so it does not behave as a reusable conversion template on its own.

Natural-Language Policy Violations

Medium
Confidence
95% confidence
Finding
The HTML document declares `lang="zh-CN"`, and the visible content is written in Chinese throughout the template, which effectively fixes the output to a specific language/locale. The file does not indicate that this is optional, user-selected, or required for a region-specific use case.

Natural-Language Policy Violations

Medium
Confidence
95% confidence
Finding
The document declares `lang="zh-CN"`, and the visible content is written exclusively in Chinese, which imposes a specific language/locale on users. Under the policy, locale-specific behavior should either be user-selectable or clearly justified as region-specific; neither is indicated here.

Natural-Language Policy Violations

Medium
Confidence
93% confidence
Finding
The document declares `lang="zh-CN"`, which fixes the content to a specific language/locale. Under the policy, language constraints should either be user-selectable or clearly justified as region-specific; this file provides neither.

Static analysis

No suspicious patterns detected.