Back to skill

Security audit

WPS Web Builder

Security checks for vulnerabilities and agentic risk

Overview

This web-building skill is coherent, but it should be reviewed because it installs/runs local web tooling and exposes a development server on the local network by default.

Install only if you are comfortable with the skill creating project files, updating .web-builder/plan.md, installing dependencies, running npm/pip/build commands, and starting a Vite preview server. Prefer using it in a disposable or trusted workspace, review generated package files before install, pin dependencies, bind previews to localhost unless you intentionally want LAN sharing, and stop the server after use.

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

T08 · Insecure Dependencies

Warning
Location
SKILL.md:332
Finding

Unpinned Package Retrieval and Execution Through npx

Content
View full analysis

Vulnerability Details

File Location: SKILL.md, lines 332-338 and 365
Vulnerability Type: Unpinned third-party package execution
Risk Level: Medium

Vulnerable Code

python
process = subprocess.Popen(
    f"npx vite --port {port} --host",
    shell=True,
    cwd="project path",
    env=env,
    stdin=subprocess.DEVNULL,
    stdout=subprocess.PIPE,
    stderr=subprocess.STDOUT,
)

The instruction reinforces this behavior:

markdown
- **Directly use `npx vite`**: specify the port and `--host` arguments without relying on the `package.json` configuration

Technical Analysis

The prescribed launch procedure executes npx vite without pinning Vite to a reviewed version or requiring resolution through a verified lockfile. If the package is not already installed locally, npx may retrieve and execute it from the configured package registry at runtime.

This creates a mutable software supply-chain path: the effective executable can differ from what was reviewed. The surrounding workflow also requires dependency installation without mandating a trusted registry, lockfile integrity verification, package provenance checks, or lifecycle-script restrictions.

Use of shell=True is not directly exploitable in the shown static command because the randomly generated port is an integer and the project path is passed separately through cwd. Nevertheless, a shell is unnecessary and increases the fragility of the execution pattern.

Attack Path

  1. An attacker compromises or influences the configured package registry, dependency metadata, generated package.json, or package-resolution environment.
  2. The requested Vite executable is absent locally, or dependency installation resolves an attacker-controlled package version.
  3. The Agent follows the mandatory workflow and invokes npx vite.
  4. npx downloads or resolves the unreviewed package and executes its CLI or associated lifecycle code.
  5. The package code runs with the same ...[truncated 483 chars]
Remediation
View remediation

Remediation Suggestions

  1. Require a committed and reviewed lockfile and install dependencies with npm ci rather than unconstrained resolution.
  2. Pin Vite and other dependencies to reviewed versions.
  3. Invoke only the locked local executable, such as through a validated package script or npm exec --offline -- vite.
  4. Configure and verify an approved registry and enable package provenance or integrity validation where available.
  5. Consider installing with --ignore-scripts, where compatible, and explicitly permit only required lifecycle scripts after review.
  6. Replace shell=True with an argument array, for example:
python
process = subprocess.Popen(
    ["npm", "exec", "--offline", "--", "vite", "--port", str(port), "--host", "127.0.0.1"],
    shell=False,
    cwd=project_path,
    env=env,
    stdin=subprocess.DEVNULL,
    stdout=subprocess.PIPE,
    stderr=subprocess.STDOUT,
)

T09 · Insecure Skill Coding Practices

Warning
Location
SKILL.md:332
Finding

Development Server Exposed to the Local Network by Default

Content
View full analysis

Vulnerability Details

File Location: SKILL.md, lines 332-365
Vulnerability Type: Unnecessary network exposure of a development service
Risk Level: Medium

Vulnerable Code

python
process = subprocess.Popen(
    f"npx vite --port {port} --host",
    shell=True,
    cwd="project path",
    env=env,
    stdin=subprocess.DEVNULL,
    stdout=subprocess.PIPE,
    stderr=subprocess.STDOUT,
)

The mandatory behavior is further specified as:

markdown
- **Directly use `npx vite`**: specify the port and `--host` arguments without relying on the `package.json` configuration

The workflow subsequently extracts and publishes both local and network URLs. plan-template.md, lines 126-130, also requires a LAN-access link as part of delivery:

markdown
- [ ] Development server remains running in the background
- [ ] Local access link has been output in Markdown hyperlink format
- [ ] LAN access link has been output in Markdown hyperlink format
- [ ] Project has been completed and delivered

Technical Analysis

Passing --host without a loopback address causes Vite to listen on network-accessible interfaces rather than limiting access to the local machine. The workflow also directs the Agent to expose the resulting LAN URL and keep the development server running in the background.

A development server is intended for local development and may expose source modules, source maps, debugging details, unfinished routes, mocked information, or development-only APIs. It generally lacks the authentication, transport security, access controls, and hardening expected of a shared production service. A random port reduces accidental conflicts but is not an access-control mechanism.

Attack Path

  1. The Agent generates an application that may contain development data, source maps, unfinished endpoints, or insecure development functionality.
  2. It launches Vite with an unrestricted --host option.
  3. Vite binds to network interfaces acce ...[truncated 844 chars]
Remediation
View remediation

Remediation Suggestions

  1. Bind the development server to loopback by default:
bash
vite --host 127.0.0.1
  1. Remove mandatory LAN-link publication and the requirement to keep the server running after validation.
  2. Require explicit, informed user consent before binding to non-loopback interfaces.
  3. If shared access is necessary, restrict allowed hosts and network ingress through firewall rules or an authenticated reverse proxy.
  4. Do not use a development server as a deployment mechanism. Build static production assets and serve them through a hardened production server.
  5. Ensure shared deployments use authentication where needed, TLS, least-privilege service credentials, and disabled source maps or debugging features as appropriate.
  6. Terminate the development process automatically after validation unless the user explicitly requests continued local operation.
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Tool MisuseTool Parameter Abuse, Chaining Abuse, Unsafe Defaults
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
Findings (14)

Natural-Language Policy Violations

High
Category
Not specified by scanner
Confidence
95% confidence
Finding

The manifest description and nearly all operational instructions are written to conduct the workflow in Chinese, including required prompts and output conventions, while no user opt-in or language-selection mechanism is provided. This can violate language/locale policy because it implicitly forces a specific language rather than offering a choice.

Content

No source excerpt is available for this finding.

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
96% confidence
Finding

The skill recommends subprocess.run(..., shell=True, cwd="项目路径"), which is unsafe because shell invocation increases command-injection risk and cwd may be influenced by workspace context. In a skill that can operate on user-influenced project paths and generated content, using the shell unnecessarily magnifies the consequences of malformed or adversarial inputs.

Content

Scanner excerpt · SKILL.md (reported line 261)May include surrounding context.

import subprocess env = dict(subprocess.os.environ) env["NODE_OPTIONS"] = "" subprocess.run("npm run build", shell=True, cwd="项目路径", encoding="utf-8", errors="replace", env=env)

text

Env Variable Harvesting

High
Category
Data Exfiltration
Confidence
60% confidence
Finding

Code enumerates, copies, or searches environment variables for secrets. Bulk environment access can collect credentials unrelated to the skill's stated purpose.

Content

Scanner excerpt · SKILL.md (reported line 330)May include surrounding context.

md
return 5173  # 降级到默认端口

port = get_free_port()
env = dict(os.environ)
env["NODE_OPTIONS"] = ""
process = subprocess.Popen(
    f"npx vite --port {port} --host",

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
97% confidence
Finding

This duplicate finding points to the same Popen(..., shell=True) pattern and represents the same unsafe command-execution design. In context, the danger is heightened because the skill automates process launch as part of normal completion, making risky shell usage part of the default workflow rather than an exceptional step.

Content

Scanner excerpt · SKILL.md (reported line 332)May include surrounding context.

md
port = get_free_port()
env = dict(os.environ)
env["NODE_OPTIONS"] = ""
process = subprocess.Popen(
    f"npx vite --port {port} --host",
    shell=True,
    cwd="项目路径",

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
97% confidence
Finding

This duplicate finding points to the same Popen(..., shell=True) pattern and represents the same unsafe command-execution design. In context, the danger is heightened because the skill automates process launch as part of normal completion, making risky shell usage part of the default workflow rather than an exceptional step.

Content

Scanner excerpt · SKILL.md (reported line 332)May include surrounding context.

md
port = get_free_port()
env = dict(os.environ)
env["NODE_OPTIONS"] = ""
process = subprocess.Popen(
    f"npx vite --port {port} --host",
    shell=True,
    cwd="项目路径",

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The manifest description uses broad trigger phrases like generic website/app creation requests, which can cause the skill to activate in contexts wider than intended. Over-broad activation matters here because the skill performs filesystem writes and local command execution, so accidental invocation can lead to unintended side effects.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The skill requires creating and repeatedly updating .web-builder/plan.md without first warning the user that files will be created or modified in the workspace. Silent persistent writes are risky because users may not expect stateful changes, and a broadly triggered skill can leave unwanted artifacts or overwrite planning state.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The skill directs installing dependencies and running build/dev commands without a clear warning that local commands will execute and may change the environment. Dependency installation and builds can run third-party package scripts, consume resources, alter lockfiles, and introduce supply-chain exposure, making silent execution especially dangerous.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The skill instructs launching a development server and surfacing a network-accessible URL without an explicit privacy or security warning. Exposing a service, especially with host binding, can make unfinished code or local resources reachable to others on the network and is a material integrity/privacy risk.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
82% confidence
Finding

The skill instructs invoking npx vite without pinning a package version, which allows whatever version resolves in the local environment or registry at execution time. In an automated skill that also launches processes, this weakens reproducibility and increases supply-chain risk if a malicious or compromised package/version is pulled.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The skill explicitly directs starting the dev server with --host, which binds it beyond localhost and can expose the generated application on the local network. For a website-building skill, network exposure is not required to complete core file-generation tasks, so this unnecessarily expands attack surface and may leak in-progress apps or local data.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
82% confidence
Finding

This second reference repeats the same unpinned npx vite guidance in the operational instructions, creating the same supply-chain and reproducibility exposure. Because the skill is meant to be followed automatically, repeated unsafe command patterns increase the chance of insecure execution.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

This markdown file consists entirely of Chinese-language instructions and does not indicate that the user can choose another language or that the skill is restricted to a Chinese-speaking context. Under the policy, forcing a specific language without user opt-in is a natural-language policy concern.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

This markdown template is entirely written in Chinese and labels the plan as "Web Builder 计划," which implies the skill's generated planning artifact is expected in a fixed language. The file does not indicate that users may choose another language or locale, so it creates a natural-language policy risk if the organization requires user language choice or opt-in.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.