Back to skill

Security audit

React Local Business Website

Security checks for vulnerabilities and agentic risk

Overview

The skill is a coherent React website generator, but it can create misleading business pages and uses broader-than-needed setup and preview commands that deserve review before installation.

Install only in an isolated project environment, review and pin npm dependencies before running setup, and bind the dev server to localhost unless you intentionally need remote access. Before publishing any generated site, replace placeholder business details, verify all reviews/licenses/awards/statistics, and connect the contact form to a real backend or remove success/privacy claims.

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

T08 · Insecure Dependencies

Warning
Location
SKILL.md:34
Finding
Unpinned npm packages and mutable CLI dependencies are downloaded and executed<![CDATA[ ## Vulnerability Details **File Location**: `SKILL.md`, lines 34–37 **Vulnerability Type**: Supply-chain exposure through unpinned third-party dependencies **Risk Level**: Medium ### Vulnerable Code ```bash npm create vite@latest . -- --template react --force npm install npm install -D tailwindcss@3 postcss autoprefixer && npx tailwindcss init -p npm install react-router-dom framer-motion lucide-react ``` ### Technical Analysis The setup procedure downloads and executes mutable npm packages. In particular, `npm create vite@latest` explicitly selects the latest available release, while the other installation commands use broad or unspecified versions. The `npx tailwindcss` command also executes a package-provided CLI. npm installation can run package lifecycle scripts under the permissions of the user or agent performing the setup. Because the Skill does not provide a reviewed lockfile, exact versions, package-integrity expectations, or lifecycle-script restrictions, future executions may install code that differs from the code available when the Skill was audited. No dependency in the audited artifact was confirmed to be malicious. The risk arises from the mutable and insufficiently controlled dependency acquisition process. ### Attack Path 1. An upstream npm package, transitive dependency, maintainer account, or package release is compromised. 2. A user or agent follows the setup commands in `SKILL.md`. 3. npm resolves the unpinned dependency to the compromised release. 4. Package installation or `npx` invokes attacker-controlled lifecycle or CLI code. 5. That code executes with the filesystem, network, and process permissions of the user running npm. ### Impact Assessment Successful exploitation could allow arbitrary code execution under the invoking account. Depending on that account's permissions, the malicious package could read or modify accessible project files, environment variables, developer credentials, SSH configuration, or other ...[truncated 210 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Pin every direct dependency and CLI tool to an exact, reviewed version rather than using `@latest`, major-version ranges, or unspecified versions. 2. Include a reviewed `package-lock.json` and use `npm ci` to reproduce the locked dependency graph. 3. Review lockfile changes before updating dependencies and use automated vulnerability and provenance checks. 4. Where operationally practical, install dependencies with lifecycle scripts disabled and explicitly permit only packages that require reviewed installation scripts. 5. Execute scaffolding and builds in an isolated, least-privileged environment without unrelated credentials. 6. Configure npm to use an approved registry and verify package names, publishers, integrity metadata, and provenance before upgrades. ]]>

T09 · Insecure Skill Coding Practices

Warning
Location
SKILL.md:137
Finding
Vite development server is bound to all network interfaces by default<![CDATA[ ## Vulnerability Details **File Location**: `SKILL.md`, lines 137–139 **Vulnerability Type**: Unnecessary network exposure **Risk Level**: Medium ### Vulnerable Code ```bash # Keep alive via OpenClaw background exec (not nohup): # exec(command: "cd <dir> && npx vite --host 0.0.0.0 --port 5173", background: true) # Access: http://localhost:5173 ``` ### Technical Analysis The `--host 0.0.0.0` option binds the Vite development server to every available IPv4 network interface. This is broader than necessary for the documented localhost preview use case and conflicts with the following comment, which only identifies `http://localhost:5173` as the intended access point. A development server should not be treated as a production-hardened service. Its accessibility depends on host firewall, container, virtual-machine, and network configuration. Binding it to all interfaces can make it reachable by other devices on a local network or by infrastructure peers. ### Attack Path 1. The agent starts Vite using the documented command. 2. Vite listens on port 5173 on all interfaces. 3. The host firewall or surrounding network permits another system to reach that port. 4. A network-adjacent party connects to the development server and accesses the served application or exposed development endpoints. ### Impact Assessment The immediate impact is unauthorized access to the development website and any information exposed through the development server. The accessible scope depends on the Vite version, enabled plugins, project contents, network controls, and runtime configuration. The audited instructions do not establish remote code execution or privilege escalation. The confirmed issue is avoidable network exposure beyond the local preview requirement. ]]>
Remediation
<![CDATA[ ## Remediation Suggestions 1. Bind the development server to the loopback interface by default: ```bash npx vite --host 127.0.0.1 --port 5173 ``` 2. Require explicit user approval before exposing the server to other hosts. 3. If remote preview is necessary, use a restricted interface, firewall allowlist, authenticated reverse proxy, or controlled development tunnel. 4. Do not expose the development server directly to the public internet. 5. Stop the background server when the preview is complete and document how to verify that the listening process has terminated. ]]>

other

Warning
Location
assets/landscaping-template/pages/Contact.jsx:24
Finding
Contact form reports successful delivery without transmitting the request<![CDATA[ ## Vulnerability Details **File Location**: `assets/landscaping-template/pages/Contact.jsx`, lines 24–34 **Related Locations**: `assets/landscaping-template/pages/Contact.jsx`, lines 97–100 and line 180; `references/page-templates.md`, lines 181–193 **Vulnerability Type**: Deceptive form behavior and unsupported privacy assurance **Risk Level**: Medium ### Vulnerable Code ```jsx const validate = () => { const e = {}; if (!form.name.trim()) e.name = "Name is required"; if (!form.email.trim() || !/\S+@\S+\.\S+/.test(form.email)) e.email = "Valid email is required"; if (!form.message.trim()) e.message = "Please tell us about your project"; return e; }; const handleSubmit = (e) => { e.preventDefault(); const errs = validate(); if (Object.keys(errs).length) { setErrors(errs); return; } setSubmitted(true); }; ``` The resulting interface claims successful delivery: ```jsx <h3 className="font-display text-2xl font-bold text-stone-900 mb-2">Message Sent!</h3> <p className="text-stone-500 max-w-sm mx-auto"> Thanks, {form.name.split(" ")[0]}! We'll review your request and reach out within 1 business day. </p> ``` It also presents an unsupported privacy statement: ```jsx <span>Your information is secure and will never be shared with third parties.</span> ``` ### Technical Analysis After validation, `handleSubmit` only changes the local React `submitted` state. It does not call `fetch`, submit to an HTML action, invoke an email provider, or communicate with a backend. The interface nevertheless states that the message was sent and promises a business response. The form values remain in client-side React state during the page session; no data exfiltration was found. However, the success state misrepresents delivery. The statement that information is secure and will never be shared is also unsupported because no privacy policy, storage design, transport implementation, or server-side data handling exists in the template. The same fake ...[truncated 933 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Integrate the form with a controlled backend or reputable form service. 2. Display a success message only after receiving a confirmed successful server response. 3. Handle timeouts, network failures, rate limits, and server validation errors without claiming delivery. 4. Add server-side input validation, anti-spam controls, request-size limits, and appropriate rate limiting. 5. Protect data in transit with HTTPS and document its collection, retention, sharing, and deletion in an accurate privacy policy. 6. Until a backend exists, disable submission and label the component clearly as a nonfunctional demonstration. 7. Remove unconditional claims such as “Your information is secure” and “will never be shared” unless they are supported by implemented controls and verified business policy. ]]>

other

Warning
Location
references/page-templates.md:195
Finding
Template prescribes and displays unverified business trust claims<![CDATA[ ## Vulnerability Details **File Location**: `references/page-templates.md`, lines 195–201 **Related Locations**: `assets/landscaping-template/pages/Home.jsx`, lines 12–15 and 65–73; `assets/landscaping-template/pages/About.jsx`, lines 60–72 and 115–122; `assets/landscaping-template/pages/Contact.jsx`, lines 294–318 **Vulnerability Type**: Fabricated or unverified reviews, accreditation, licensing, statistics, and awards **Risk Level**: Medium ### Vulnerable Instructions ```text ### Social Proof Strip (flex wrap justify-center) Items to include (pick 3-4): - Google Reviews (Star icons + "4.9/5.0" + "N+ Reviews") - BBB Accredited (badge bg-blue-600 + "A+ Rating") - Licensed & Insured (badge + state license number) - Industry awards (Houzz, Angi, etc.) ``` The bundled template includes concrete statistical claims: ```jsx const stats = [ { value: "500+", label: "Projects Completed", icon: Trophy }, { value: "15+", label: "Years Experience", icon: Award }, { value: "98%", label: "Client Satisfaction", icon: ThumbsUp }, { value: "50+", label: "Awards Won", icon: Star }, ]; ``` It also includes concrete accreditation and award claims: ```jsx const awards = [ { icon: "🌿", title: "Green Business Certification", org: "Oregon Environmental Council" }, { icon: "⭐", title: "5-Star Houzz Pro", org: "Houzz Platform, 2023–2024" }, { icon: "🎖️", title: "BBB Accredited Business", org: "A+ Rating Since 2012" }, { icon: "🌱", title: "Sustainable Landscaping Award", org: "NW Landscape Assoc., 2023" }, { icon: "🏅", title: "Top Rated Contractor", org: "Angi & HomeAdvisor, 2024" }, ]; ``` ### Technical Analysis The page-generation instructions tell the agent to include social-proof assertions without requiring the user to supply or verify them. The bundled landscaping template then presents specific review counts, ratings, certifications, accreditation status, licensing status, awards, staffing figures, project counts, and customer-satisfaction ...[truncated 1309 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Require the user to provide verified values for every factual trust claim. 2. Do not generate license numbers, accreditations, awards, certifications, reviews, customer counts, project counts, or satisfaction metrics automatically. 3. Replace unverified values with conspicuous placeholders such as `[VERIFIED REVIEW COUNT]` that cannot reasonably be mistaken for production content. 4. Omit social-proof sections entirely when verification is unavailable. 5. Add a pre-deployment checklist requiring documentary confirmation of licensing, insurance, accreditation, award, and review claims. 6. Keep fictional demonstration businesses clearly labeled as fictional and prevent example content from being deployed as a real business representation. 7. Where third-party marks or platform names are used, comply with their trademark, badge, and attribution requirements. ]]>
Vulnerability Patterns
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
Findings (3)

Vague Triggers

Medium
Confidence
91% confidence
Finding
The manifest says to use the skill when a user asks to 'build or design a website for a local/small business using React,' which is broad natural language that could overlap with many ordinary website-design requests. It does not provide explicit boundaries, trigger phrases, or exclusion cases to clarify when this skill should or should not activate.

Rp1

Medium
Category
MCP Rug Pull
Confidence
83% confidence
Finding
The skill instructs use of `npx tailwindcss` without pinning an exact version for the invoked package binary. Because `npx` may resolve and execute whatever version is available or fetched at runtime, this can lead to non-reproducible builds and supply-chain exposure if a compromised or incompatible package version is installed or executed.

Rp1

Medium
Category
MCP Rug Pull
Confidence
90% confidence
Finding
The dev-server instruction uses `npx vite` without pinning the exact package version. This means the executed tool may vary by environment or fetch a newer package at runtime, increasing supply-chain risk and making behavior less predictable if a malicious or breaking release is resolved.

Static analysis

No suspicious patterns detected.