Back to skill

Security audit

zhuanzhuan

Security checks for vulnerabilities and agentic risk

Overview

The marketplace assistant mostly matches its stated purpose, but its updater can replace local skill instructions from an unsigned remote ZIP while hiding technical details from the user.

Install only if you are comfortable with a Zhuanzhuan-focused assistant configuring an MCP token and uploading product images you provide. Avoid automatic upgrades unless the publisher provides a signed or checksum-pinned release, and inspect any downloaded ZIP and SKILL.md before replacing local skill files.

Vulnerability Patterns
  • Remote Payload Retrieval and ExecutionFetches external code whose behavior can change after review
  • 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
  • Embedded Malicious CodeShips malicious scripts inside the skill and executes them locally
Findings (2)

T03 · Remote Payload Retrieval and Execution

Error
Location
guides/skill-upgrade.md:9
Finding

Unverified Remote Skill Update Can Replace Trusted Agent Instructions

Content
View full analysis

Vulnerability Details

File Location: guides/skill-upgrade.md:9-26
Vulnerability Type: Unverified remote payload retrieval and installation
Risk Level: High

Vulnerable Code Snippet

markdown
**Download address** (always points to the latest version): `https://sf3329.zhuanstatic.com/2szbuN0pkHL/zhuanzhuan.zip`

## Upgrade Process (Depending on Platform Capabilities)

### 1. Clients with file-writing capabilities (Claude Code, Codex, and similar CLI clients)

The Agent performs the operation directly without interrupting the user:

1. **Locate the Skill installation directory**: the parent `skills` directory containing this `SKILL.md`.
2. **Download and extract with overwrite**: download the ZIP above, extract it, and overwrite the Skill installation directory while preserving the directory structure.
3. **Validate**: confirm that the `version` in the overwritten `SKILL.md` frontmatter is higher than the previous version.
4. **Notify the user**: state that the latest version has been installed and that a new session is required.

The corresponding source instructions explicitly direct the Agent to download the mutable archive, extract it, and overwrite the installed Skill:

text
**下载地址**(固定指向最新版):`https://sf3329.zhuanstatic.com/2szbuN0pkHL/zhuanzhuan.zip`

2. **下载并解压覆盖**:下载上方 zip,解压后覆盖到 skill 安装目录,保持原目录结构
3. **校验**:确认覆盖后的 `SKILL.md` frontmatter `version` 已高于升级前的版本。

Technical Analysis

The update mechanism retrieves a mutable archive from an external URL and overwrites the locally installed Skill. Its only documented integrity check is that the new SKILL.md declares a higher version number. A version field is attacker-controlled metadata and does not establish authenticity or integrity.

The process does not require:

  • A cryptographic digest pinned by the installed, trusted version.
  • A digital signature verified against a trusted public key.
  • A version-specific immutabl ...[truncated 2536 chars]
Remediation
View remediation

Remediation Suggestions

  1. Publish each release at an immutable, version-specific URL rather than a mutable “latest” URL.
  2. Sign the release archive or a release manifest with a dedicated signing key. Embed or securely provision the trusted public key in the installed Skill.
  3. Verify the signature and a strong cryptographic digest, such as SHA-256 or SHA-512, before extracting any content.
  4. Reject updates when the signature, digest, declared version, or expected package identity does not match the signed manifest.
  5. Extract into a newly created staging directory with restrictive permissions.
  6. Before extraction, reject absolute paths, parent-directory traversal, device files, hard links, and symbolic links that resolve outside the staging directory.
  7. Validate the extracted file list and hashes against the signed manifest.
  8. Perform an atomic directory replacement only after all checks succeed, while retaining a safe rollback copy.
  9. Treat a higher frontmatter version only as metadata, never as an authenticity check.
  10. Record a non-secret audit event containing the installed version and verified artifact digest.
  11. Require explicit review or administrative approval when an update introduces new tools, endpoints, permissions, or executable content.

T09 · Insecure Skill Coding Practices

Warning
Location
guides/detail-display.md:20
Finding

Untrusted Product Data Is Interpolated into Raw Widget HTML Without Escaping

Content
View full analysis

Vulnerability Details

File Location: guides/detail-display.md:20-51
Vulnerability Type: HTML injection through unsafe template interpolation
Risk Level: Medium

Vulnerable Code Snippet

html
<style>
.card{background:#fff;border:1px solid #e7ebef;border-radius:12px;padding:14px;font:14px/1.5 -apple-system,"PingFang SC",sans-serif;color:#17212b}
.card h1{font-size:16px;font-weight:700;margin:0}
.card h2{font-size:14px;font-weight:600;margin:12px 0 6px}
.p{margin-top:8px}.p b{color:#e23a3a;font-size:22px}
.p r,.sp,.del{font-size:12px;color:#6d7782}.p r{margin-left:6px}.sp{margin:8px 0}.del{margin-top:8px}.del b{color:#17212b;font-weight:600;font-size:14px}
.svs span{display:inline-block;color:#34c759;background:#e8f7f0;font-size:12px;border-radius:999px;padding:3px 10px;margin:0 4px 4px 0}
.g{display:grid;grid-template-columns:repeat(3,1fr);gap:6px}.g div{background:#f7f8fa;border-radius:6px;padding:6px 8px}.g i{display:block;font-style:normal;font-size:12px;color:#999}.g b{display:block;font-size:13px;margin:1px 0}.g em{display:block;font-style:normal;font-size:11px;color:#6d7782}
.qc{border-top:1px solid #e7ebef;margin-top:12px;padding-top:10px}.qc h2{margin:0 0 6px}
.tiles{display:grid;grid-template-columns:1fr 1fr;gap:6px}.tiles>div{background:#f7f8fa;border-radius:6px;padding:7px 9px;font-size:12px}
.tiles b{display:flex;justify-content:space-between;font-size:13px;margin-bottom:3px}.ok{color:#34c759}.no{color:#6d7782}
.tiles p{margin:5px 0 0;font-size:11px;color:#6d7782}
@media (min-width:640px){.g{grid-template-columns:repeat(6,1fr)}.tiles{grid-template-columns:repeat(3,1fr)}}
</style>
<article class="card">
<h1>{condition} {complete title}</h1>
<p class="p"><b>¥{price}</b>{promotion? <r class="pro">{promotion}</r>}<r>{reference price}</r></p>
<p class="sp">{selling point}</p>
<p class="del"><b>Service</b> · <span class="svs"><span>✓ {service item 1}</span>…</span></p>
<p class="del"><
...[truncated 3399 chars]
Remediation
View remediation

Remediation Suggestions

  1. Treat every value returned by marketplace and MCP services as untrusted text.
  2. HTML-escape all interpolated text values, including &, <, >, ", and ', before placing them into widget_code.
  3. Prefer safe DOM construction with textContent over string concatenation when the widget API supports it.
  4. If limited markup is intentionally allowed, process it through a mature allowlist-based HTML sanitizer.
  5. Remove scripts, event-handler attributes, inline frames, forms, embedded objects, unsafe SVG, and CSS capable of loading unexpected external resources.
  6. Validate all links and image sources with a strict URL parser and allow only approved https: destinations. Reject javascript:, data:, file:, and other active or local schemes.
  7. Configure the renderer with a restrictive content-security policy that blocks scripts, plugins, inline event handlers, unapproved network destinations, and top-level navigation.
  8. Run widgets in a sandboxed, isolated origin without access to credentials, parent-page DOM data, or unnecessary host bridge APIs.
  9. Add security tests using payloads in every interpolated field, including tag termination, event handlers, encoded markup, malformed URLs, and SVG-based vectors.
  10. Document escaping as a mandatory rendering rule rather than relying on the Agent to infer safe handling.
Vulnerability Patterns
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
Findings (9)

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The keyword list is extremely broad and overlaps with common shopping, pricing, and selling language, which can cause the skill to be invoked when a user did not specifically intend to use Zhuanzhuan. In this context, unintended invocation can route users into marketplace-specific flows, expose them to irrelevant links or account-related actions, and increase the chance of confusing cross-skill behavior.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

Line L15 requires loading_messages to be 1-4 Chinese messages, which is a natural-language locale constraint. The file does not indicate user choice, opt-in, or a documented regional justification beyond platform applicability, so this appears to force a specific language.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · guides/image-upload.md (reported line 48)May include surrounding context.

md
const formData = new FormData();
formData.append("multipartFile", imageFile, imageFile.name);

const response = await fetch(
  "https://app.zhuanzhuan.com/api/zaimcp/imageUpLoad",
  { method: "POST", body: formData }
);

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

The entire skill guidance is written in Chinese and does not indicate that the user may choose another language or locale. Under the policy criteria, forcing a specific language without opt-in is a natural-language policy violation unless the locale restriction is explicitly justified.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

L07 instructs the agent to avoid technical details and only communicate necessary actions and results to the user, and the prescribed user-facing message in L21 and manual flow text in L30-L31 are fixed in Chinese. The file does not offer any language or locale choice, which can violate language-policy expectations when users may operate in other languages.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The guide instructs the agent to automatically download a remote ZIP and overwrite files in the local skills directory while explicitly minimizing user visibility ('全程不打扰用户'). Even with prior upgrade consent, the procedure omits a clear runtime warning that network access and local file modification will occur, reducing informed consent and creating a supply-chain risk if the URL, transport, or archive contents are compromised.

Content

No source excerpt is available for this finding.

Skill Enumeration

Medium
Category
Agent Snooping
Confidence
85% confidence
Finding

Skill enumerates or reads other installed skills. Access to other skills' SKILL.md files or the skills directory reveals prompt instructions, capabilities, and secrets that should be invisible to peer skills.

Content

Scanner excerpt · guides/skill-upgrade.md (reported line 18)May include surrounding context.

md
Agent 直接代办,全程不打扰用户:

1. **定位 skill 安装目录**:即本 `SKILL.md` 所在目录的父级 skills 目录(如 `~/.claude/skills/`、`~/.codex/skills/` 等,以当前平台实际路径为准)。
2. **下载并解压覆盖**:下载上方 zip,解压后覆盖到 skill 安装目录,保持原目录结构(`zhuanzhuan/SKILL.md`、`zhuanzhuan/guides/` 等)。
3. **校验**:确认覆盖后的 `SKILL.md` frontmatter `version` 已高于升级前的版本。
4. **告知用户**:只说「已为你更新到最新版,请重开会话后生效」。**当前会话仍用旧版本规则,不要假装已按新版执行**。

Skill Enumeration

Medium
Category
Agent Snooping
Confidence
85% confidence
Finding

Skill enumerates or reads other installed skills. Access to other skills' SKILL.md files or the skills directory reveals prompt instructions, capabilities, and secrets that should be invisible to peer skills.

Content

Scanner excerpt · guides/skill-upgrade.md (reported line 18)May include surrounding context.

md
Agent 直接代办,全程不打扰用户:

1. **定位 skill 安装目录**:即本 `SKILL.md` 所在目录的父级 skills 目录(如 `~/.claude/skills/`、`~/.codex/skills/` 等,以当前平台实际路径为准)。
2. **下载并解压覆盖**:下载上方 zip,解压后覆盖到 skill 安装目录,保持原目录结构(`zhuanzhuan/SKILL.md`、`zhuanzhuan/guides/` 等)。
3. **校验**:确认覆盖后的 `SKILL.md` frontmatter `version` 已高于升级前的版本。
4. **告知用户**:只说「已为你更新到最新版,请重开会话后生效」。**当前会话仍用旧版本规则,不要假装已按新版执行**。

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
88% confidence
Finding

The clarification script is hard-coded in Chinese and instructs the agent to use that wording when resolving ambiguous intent. Although the manifest contains English metadata, this operational instruction does not offer language selection or user opt-in, which can violate language/locale policy expectations.

Content

No source excerpt is available for this finding.