Back to skill

Security audit

Demo Website Product Manager 小白建站

Security checks for vulnerabilities and agentic risk

Overview

The skill is mostly a coherent demo-deployment guide, but it tells agents to allow plaintext password storage and gives beginner users deployment/package-install workflows without enough safety gates.

Review this skill carefully before installing. It is not deceptive and does not ship executable malware, but you should change any generated requirements to forbid plaintext passwords, review dependencies before npm/pip installation, confirm what will be public before GitHub/Vercel/WeChat upload, and avoid sharing real secrets, real user passwords, or unnecessary account identifiers in chat or public repositories.

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)

T09 · Insecure Skill Coding Practices

Error
Location
SKILL.md:121
Finding

Technical Specification Permits Plaintext Password Storage

Content
View full analysis

Vulnerability Details

File Location: SKILL.md, line 121
Vulnerability Type: Plaintext storage of authentication credentials
Risk Level: High

Relevant excerpt translated into English:

markdown
- Core process: Include registration and login. Because this is only a demo,
  minimize complexity by asking whether the user accepts storing passwords in
  plaintext. If the user confirms, explicitly include this in the technical
  document. User permission is mandatory.

Technical Analysis

The Skill explicitly allows a downstream coding agent to implement plaintext password storage when the user consents. Consent does not mitigate the underlying security flaw: authentication secrets remain directly recoverable from the database, backups, logs, exports, or development artifacts.

Passwords must be processed with a password-specific, adaptive one-way hashing algorithm and a unique salt. Encryption alone is not an adequate substitute because compromise of the decryption key would expose every password. Describing the application as a demo also does not make plaintext storage safe, particularly because users may reuse real credentials or later deploy the demo publicly through the supported Vercel and Neon workflow.

Attack Path

  1. The Agent asks a nontechnical user whether plaintext password storage is acceptable.
  2. The user approves it without fully understanding the security consequences.
  3. The Agent adds plaintext storage as a requirement in the technical specification.
  4. A downstream coding AI implements registration and login by saving raw passwords in SQLite or Neon.
  5. The application or database is deployed, copied, backed up, exposed through a vulnerability, or accidentally published.
  6. An attacker reads the password column directly, without needing to crack password hashes.
  7. The attacker uses the recovered credentials against the demo and potentially against unrelated services where ...[truncated 558 chars]
Remediation
View remediation

Remediation Suggestions

  • Remove the option to store passwords in plaintext, regardless of user approval or demo status.
  • Require a maintained password-hashing implementation based on Argon2id, bcrypt, or scrypt, with unique salts and appropriate work factors.
  • Prefer passwordless authentication or fixed, clearly labeled non-secret demo identities when authentication security is outside the demo scope.
  • Warn users never to reuse real passwords in demonstration applications.
  • Ensure passwords are excluded from logs, error messages, analytics, fixtures, repository content, and database exports.
  • Add a technical-document requirement for secure session handling, generic authentication errors, and rate limiting where login is exposed publicly.
  • If existing plaintext credentials may already have been stored, invalidate them, remove the plaintext values, and require password resets rather than attempting to migrate the exposed credentials silently.

T08 · Insecure Dependencies

Warning
Location
reference/local-env-troubleshooting.md:29
Finding

Generated Third-Party Dependencies Are Installed and Executed Without a Mandatory Review Gate

Content
View full analysis

Vulnerability Details

File Location: reference/local-env-troubleshooting.md, lines 29-33 and 43-50
Vulnerability Type: Unsafe third-party dependency installation and execution
Risk Level: Medium

Relevant excerpt translated into English:

markdown
4. Frontend route (Node): Run `npm -v` to check npm.
5. Frontend route (Node): Run `npm install` to install dependencies.
   Expected result: The terminal displays download progress and eventually
   reports that installation is complete.
6. Frontend route (Node): Run `npm run dev` to start the local service.
   Expected result: The terminal displays a local address, such as
   `http://localhost:3000`.

11. Backend route (Python): Run `pip3 --version` to check pip3.
12. Backend route (Python): Run `python3 -m venv .venv` to create a virtual environment.
13. Backend route (Python): Run `source .venv/bin/activate` to activate it.
14. Backend route (Python): Run `pip3 install -r requirements.txt` to install dependencies.
    Expected result: The terminal displays installation progress and eventually
    reports success or that dependencies are already satisfied.

Technical Analysis

The workflow instructs a nontechnical user to install dependencies from project manifests that may have been generated by another AI. It does not require package-name review, source verification, lockfile validation, integrity checking, or inspection of npm lifecycle scripts before installation.

npm install can execute package lifecycle scripts during installation. A malicious or compromised package can therefore run code before the user starts the application. Python packages can also execute build-related code during installation, while malicious package code may execute when the generated application starts.

The use of a Python virtual environment limits Python package installation to the project environment, but it does not sandbox package installation or runti ...[truncated 1762 chars]

Remediation
View remediation

Remediation Suggestions

  • Add a mandatory dependency-review step before running any package-manager command.
  • Verify every package name against the intended official project, especially packages suggested by generative AI.
  • Require pinned versions and committed lockfiles. For Node projects, prefer reproducible installation with npm ci after reviewing the lockfile.
  • Review npm lifecycle scripts and consider initially installing with lifecycle scripts disabled, then enabling only scripts that have been inspected and are required.
  • Use trusted package registries explicitly and inspect local package-manager configuration for unexpected private or alternate registries.
  • For Python, require exact version pinning and hash verification where practical, such as hash-locked requirements generated from reviewed dependencies.
  • Perform installation in an isolated, disposable development environment with no production secrets, cloud credentials, SSH keys, or unrelated sensitive files available.
  • Run dependency vulnerability and provenance checks before application startup, while recognizing that vulnerability scanners do not replace package-identity review.
  • Never respond to installation failures by adding administrative privileges or disabling security controls.
  • Instruct users to stop if a package name is unfamiliar, unexpectedly requests access, introduces install scripts, or differs from the package specified by official framework documentation.
Vulnerability Patterns
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Tool MisuseTool Parameter Abuse, Chaining Abuse, Unsafe Defaults
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
Findings (17)

Ssd 3

High
Category
Not specified by scanner
Confidence
99% confidence
Finding

The skill explicitly instructs the agent to ask whether plaintext password storage is acceptable for demo purposes and, if the user agrees, to write that into the technical requirements. This normalizes insecure credential handling and can directly lead downstream coding agents to implement storage of passwords in cleartext, creating severe risk of credential theft, reuse attacks, and accidental long-term persistence of insecure patterns beyond a demo.

Content

No source excerpt is available for this finding.

Chaining Abuse

High
Category
Tool Misuse
Confidence
75% confidence
Finding

Tool calls are chained to bypass individual safety checks or escalate capabilities beyond what any single tool call would allow.

Content

Scanner excerpt · reference/github-onboarding.md (reported line 39)May include surrounding context.

text
* **Linux - Ubuntu / Debian 体系**:
    ```bash
    sudo apt update && sudo apt install git -y
    ```
* **Linux - CentOS / RedHat / Fedora 体系**:
    ```bash

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
65% confidence
Finding

Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Content

Scanner excerpt · reference/github-onboarding.md (reported line 98)May include surrounding context.

md
- 问题:推送时提示认证失败。  
  处理:重新登录 GitHub;按提示使用浏览器授权;不要重复输入错误密码。
- 问题:提示仓库已存在内容,无法直接推送。  
  处理:先中止并回报,不建议新手自行执行 `git pull origin main --allow-unrelated-histories`。
- 问题:上传后仓库没有文件。  
  处理:先执行 `git status` 看是否有未提交文件,再补 `git add` 和 `git commit`。

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The skill actively guides non-technical users to push projects to GitHub and deploy to Vercel, but does not require an explicit warning that project contents may be uploaded to third-party services and potentially made public or accessible beyond the local machine. In this context, users may unknowingly publish source code, embedded secrets, personal data, or proprietary demo materials, especially because the skill targets beginners and normalizes direct deployment.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

This instruction hard-codes a language/locale behavior for all users rather than offering a choice. Under the policy, forcing a specific language without user opt-in is a natural-language policy violation unless clearly justified as region-specific, which is not stated here.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
88% confidence
Finding

标题与全文指令均以中文固定呈现,且面向用户的操作引导默认要求使用中文解释,没有看到可按用户偏好切换语言的说明。根据规则,未获用户选择即强制特定语言/locale 属于自然语言政策问题。

Content

No source excerpt is available for this finding.

Sudo/Root Execution

Medium
Category
Privilege Escalation
Confidence
70% confidence
Finding

Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.

Content

Scanner excerpt · reference/github-onboarding.md (reported line 39)May include surrounding context.

text
* **Linux - Ubuntu / Debian 体系**:
    ```bash
    sudo apt update && sudo apt install git -y
    ```
* **Linux - CentOS / RedHat / Fedora 体系**:
    ```bash

Sudo/Root Execution

Medium
Category
Privilege Escalation
Confidence
70% confidence
Finding

Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.

Content

Scanner excerpt · reference/github-onboarding.md (reported line 43)May include surrounding context.

text
* **Linux - Ubuntu / Debian 体系**:
    ```bash
    sudo apt update && sudo apt install git -y
    ```
* **Linux - CentOS / RedHat / Fedora 体系**:
    ```bash

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The entire skill is written as Chinese-only operational guidance, including headings, instructions, and troubleshooting steps. Under the policy, forcing a specific language without giving the user a language or locale choice is a natural-language policy violation.

Content

No source excerpt is available for this finding.

Sudo/Root Execution

Medium
Category
Privilege Escalation
Confidence
70% confidence
Finding

Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.

Content

Scanner excerpt · reference/local-env-troubleshooting.md (reported line 93)May include surrounding context.

md
## 何时中止并回报
- 同一错误连续出现 3 次。
- 你需要执行删除系统文件或提权命令,但不确定风险。
- 你准备使用 `sudo pip3` 或修改系统级 Python,但不确定影响范围。
- 你发现虚拟环境与系统 Python 混用,且无法判断当前生效的是哪一个解释器。
- 报错涉及账号密钥、环境变量泄露风险。
- 你无法判断哪条报错是“第一条关键错误”。

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The document instructs users to translate the interface into Chinese and explains key UI terms only in Chinese, while the skill title and content are entirely Chinese. Under the policy, forcing a specific language or locale without offering a user choice is a natural-language policy violation unless the locale constraint is explicitly justified.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The instructions tell users to collect and enter friends' WeChat IDs to grant tester access, but provide no privacy or consent guidance. For a zero-technical audience, this can lead to unnecessary collection and sharing of personal identifiers without informing users to obtain permission or limit retention.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
98% confidence
Finding

The document explicitly says not to ask the user for IDs, but later instructs the operator to have the user copy and send the cloud environment ID. This creates inconsistent handling guidance and can normalize collecting deployment identifiers that may grant access scope, enable misconfiguration, or expose project metadata to an external agent unnecessarily.

Content

No source excerpt is available for this finding.

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
85% confidence
Finding

The document mentions AppID and cloud environment ID being written into configuration and cautions against pushing copies with real configuration to a public repository, but it does not clearly frame this as a safety warning tied to later sharing and deployment steps. Because these identifiers affect account-linked deployments and configuration exposure, clearer user-facing disclosure would reduce accidental publication risk.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Low
Category
Not specified by scanner
Confidence
95% confidence
Finding

L053-L056 的状态表只列出了 S1、S2、S3 三种状态;但 L057 又写明“默认从 S0 开始”。这不是单纯信息缺失,而是文档内部对同一控制流入口给出了互相冲突的说明,可能导致执行者误判初始阶段。

Content

No source excerpt is available for this finding.

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
88% confidence
Finding

The guide instructs non-technical users to hardcode a real cloud environment ID into app.js, which embeds deployment-specific configuration directly in source files. While an environment ID is not typically a secret by itself, this practice increases the chance of accidental disclosure, confusion across environments, and propagation of real deployment details into shared code or screenshots.

Content

No source excerpt is available for this finding.

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
84% confidence
Finding

The instruction to copy and send the cloud environment ID lacks a privacy and scope warning, so a non-technical user may disclose deployment metadata without understanding who receives it or how it could be used. While an environment ID alone is not typically a secret credential, it can still aid targeting, configuration abuse, or accidental cross-environment operations when combined with other access.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.