Back to skill

Security audit

Fanli

Security checks for vulnerabilities and agentic risk

Overview

This shopping discount skill is purpose-aligned, but it needs Review because it runs an unpinned external helper with API-key access and has an unsafe local script dispatch path.

Install only if you trust the publisher and the feima-lab/fenxianglife API, and avoid sharing shopping links that contain account-specific or private parameters. Prefer a pinned, reviewed fx-base version before use, and be aware that generated purchase links, images, and prices come from a remote service and should be treated as untrusted until verified.

Vulnerability Patterns
  • 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
  • Remote Payload Retrieval and ExecutionFetches external code whose behavior can change after review
Findings (3)

T09 · Insecure Skill Coding Practices

Error
Location
scripts/run.mjs:83
Finding

Path Traversal Allows Execution of Unintended Local JavaScript Modules

Content
View full analysis
{ const child = spawn(process.execPath, [scriptPath, ...args], { stdio: 'inherit', env: process.env, }); child.on('close', (code) => { process.exit(code ?? 0); }); child.on('error', reject); }); } ``` ### Technical Analysis The `call` command treats the user-controlled `name` argument as a path component. The code appends `.mjs` and passes the result to `join()`, but it does not reject absolute paths, directory separators, or `..` traversal components. `join()` normalizes traversal sequences. Consequently, a value such as `../../some/path/module` can resolve outside the intended `scripts` directory. The only security check is `existsSync()`, which confirms that the resolved file exists but does not verify that it belongs to the authorized endpoint directory. The resolved module is executed in a new Node.js process. That child inherits the complete parent environment through `env: process.env`, including `FX_AI_API_KEY` and any other credentials available to the Agent process. ### Attack Path 1. An attacker influences the arguments passed to `scripts/run.mjs`, directly or through prompt injection affecting an Agent invocation. 2. The attacker selects the `call` command and supplies a traversal-based ...[truncated 1208 chars]
Remediation
View remediation

T08 · Insecure Dependencies

Error
Location
SKILL.md:14
Finding

Unpinned External Dependency Is Installed and Executed with Credential Access

Content
View full analysis
**CRITICAL** — 开始前 **必须**用 Read 工具读取 [`../fx-base/SKILL.md`](../fx-base/SKILL.md),其中包含 feima-lab API 认证和请求规范。 > > fx-base 未安装?执行 `npx skills install fangshan101-coder/fx-base` 安装到同目录下。 ``` `scripts/convert.mjs:10-19` dynamically imports code from that dependency: ```js const _scriptDir = dirname(fileURLToPath(import.meta.url)); const _fxApiPath = join(_scriptDir, '../../fx-base/scripts/fx-api.mjs'); if (!existsSync(_fxApiPath)) { process.stderr.write( '{"status":"error","error_type":"missing_dependency","suggestion":"缺少 fx-base,请安装:npx skills install fangshan101-coder/fx-base"}\n' ); process.exit(1); } const { fxCheckAuth, fxPost } = await import(_fxApiPath); ``` `scripts/compare-price.mjs:11-20` uses the same pattern: ```js const _scriptDir = dirname(fileURLToPath(import.meta.url)); const _fxApiPath = join(_scriptDir, '../../fx-base/scripts/fx-api.mjs'); if (!existsSync(_fxApiPath)) { process.stderr.write( '{"status":"error","error_type":"missing_dependency","suggestion":"缺少 fx-base,请安装:npx skills install fangshan101-coder/fx-base"}\n' ); process.exit(1); } const { fxCheckAuth, fxPost } = await import(_fxApiPath); ``` ### Technical Analysis The project does not contain the authentication and HTTP implementation it executes. Instead, it instructs users or Agents to install `fangshan101-coder/fx-base` using an unversioned `npx skills install` command and then dynamically imports the installed module. No immutable commit, release version, lockfile, checksum, or integrity signature is specified. The effective code can therefore differ from the code present wh ...[truncated 1993 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
references/convert-output.md:3
Finding

Remote API Fields Are Rendered as Unescaped Markdown and Unvalidated Links

Content
View full analysis
Remediation
View remediation
Vulnerability Patterns
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • 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 Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
Findings (12)

Lp1

High
Category
MCP Least Privilege
Confidence
89% confidence
Finding

The script forwards the entire parent process environment to spawned child scripts via env: process.env. This can expose secrets such as API keys, tokens, proxy settings, or credentials to any called subscript, expanding the blast radius if one of those scripts is compromised or logs its environment. In this skill context, the runner dispatches multiple helper scripts and sends user-supplied shopping links to a remote API, so unnecessary environment inheritance increases risk without clear need.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The README explains API key setup for an external platform but does not clearly disclose that submitted product links, shopping metadata, and possibly user-derived purchase-interest data may be sent to that external service for analysis. Users may therefore share links or shopping context without informed consent about third-party processing, creating privacy and data-handling risk.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
89% confidence
Finding

The README instructs users to run npx skills install fangshan101-coder/fanli without pinning a specific version or immutable reference. This can cause users to install a newer, changed, or compromised package than the one originally reviewed, creating a supply-chain risk if the upstream package is updated maliciously or accidentally introduces unsafe behavior.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The skill claims it can be triggered when a user sends a product link directly with no explicit command. That broad activation model can cause unintended invocation during ordinary conversation or casual link sharing, leading to unexpected processing of user content and accidental transmission of shopping links to external services.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The example trigger phrases include broad, everyday language such as asking whether something is worth buying or whether it is cheap. Because these phrases commonly appear in normal conversation, the skill may activate unexpectedly and process unrelated content, increasing the chance of privacy leakage or user confusion.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The trigger phrases are very broad shopping-related terms such as '优惠', '便宜', '划算', and '省钱', which can cause the skill to activate in loosely related conversations. Over-broad activation can unintentionally send user-provided links or shopping context to the external API, increasing privacy exposure and causing unintended tool execution.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
95% confidence
Finding

The skill instructs use of npx skills install fangshan101-coder/fx-base without a pinned version or integrity control, creating a supply-chain risk. If the upstream package or installer is compromised or changes unexpectedly, an agent/operator could fetch and run attacker-controlled code in the local environment.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The file instructs the assistant to always output in Chinese ('直接按模板填充输出') and all examples/templates are Chinese-only, without conditioning on the user's language preference. This can override user expectations or platform language settings, reducing usability and potentially causing misunderstanding, but it is not a direct security compromise.

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.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

This code file contains natural-language strings for usage, errors, and help text entirely in Chinese, which effectively forces a specific language for interacting with the skill. Under the policy, language constraints should either be optional for the user or clearly justified as region-specific.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
88% confidence
Finding

All user-facing guidance, invocation description, workflow text, and error messages are presented only in Chinese, and the file does not indicate that users may choose another language. Under the stated policy, forcing a specific language without user opt-in is a natural-language policy concern.

Content

No source excerpt is available for this finding.