Back to skill

Security audit

Frontend Design Polish

Security checks for vulnerabilities and agentic risk

Overview

The skill is mostly coherent as a frontend design tool, but its live-mode helper has concrete vulnerabilities that can expose project files or let a crafted project run commands.

Review before installing. Avoid live mode on untrusted repositories, sensitive local projects, authenticated production pages, or while browsing untrusted websites. Prefer a patched version that removes shell interpolation, pins npx usage, validates local-server origins, protects the live token, and enforces project-root containment for all reads and writes.

Vulnerability Patterns
  • Unauthorized Access and Privilege EscalationObtains permissions beyond the task's legitimate needs
  • 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)

T05 · Unauthorized Access and Privilege Escalation

Error
Location
scripts/live-server.mjs:181
Finding

Unauthenticated live.js endpoint discloses the privileged session token cross-origin

Content
View full analysis
{ const url = new URL(req.url, `http://localhost:${state.port}`); res.setHeader('Access-Control-Allow-Origin', '*'); res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS'); res.setHeader('Access-Control-Allow-Headers', 'Content-Type'); if (req.method === 'OPTIONS') { res.writeHead(204); res.end(); return; } const p = url.pathname; // --- Scripts --- if (p === '/live.js') { let liveScript; try { liveScript = fs.readFileSync(livePath, 'utf-8'); } catch (err) { res.writeHead(500, { 'Content-Type': 'text/plain' }); res.end('Error reading live-browser.js: ' + err.message); return; } const body = `window.__IMPECCABLE_TOKEN__ = '${state.token}';\n` + `window.__IMPECCABLE_PORT__ = ${state.port};\n` + liveScript; ``` ### Technical Analysis The helper server binds to `127.0.0.1`, but loopback binding does not prevent websites loaded in the victim's browser from sending requests to it. The server applies `Access-Control-Allow-Origin: *` to every response and serves `/live.js` without authentication. The response embeds the session bearer token in executable JavaScript. Consequently, an arbitrary website can attempt to fetch common live-mode ports such as `8400`, read the response because of the wildcard CORS policy, and extract `window.__IMPECCABLE_TOKEN__`. The disclosed token authenticates endpoints that: - Read project source through `/source` - Read `DESIGN.md` and `DESIGN.json` - Submit browser events - Poll events containing selected DOM content - Upload annotation screenshots - Stop the live helper server The local HTTP tran ...[truncated 1310 chars]
Remediation
View remediation

T05 · Unauthorized Access and Privilege Escalation

Error
Location
scripts/live-server.mjs:369
Finding

Source-file endpoint uses an unsafe string-prefix containment check

Content
View full analysis
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Error
Location
scripts/is-generated.mjs:41
Finding

Project-controlled filenames are interpolated into a shell command

Content
View full analysis
Remediation
View remediation

T05 · Unauthorized Access and Privilege Escalation

Error
Location
scripts/live-inject.mjs:75
Finding

Live injection configuration can direct file rewrites outside the project root

Content
View full analysis
{ const absFile = path.resolve(process.cwd(), relFile); if (!fs.existsSync(absFile)) return { file: relFile, error: 'file_not_found' }; const content = fs.readFileSync(absFile, 'utf-8'); const withoutOld = revertCspMeta(removeTag(content, config.commentSyntax)); const withTag = insertTag(withoutOld, config, port); if (withTag === withoutOld) { return { file: relFile, error: 'insertion_point_not_found', anchor: config.insertBefore || config.insertAfter }; } const updated = patchCspMeta(withTag, port); fs.writeFileSync(absFile, updated, 'utf-8'); return { file: relFile, inserted: true, cspPatched: updated !== withTag, }; }); ``` Configuration validation checks only that entries are non-empty strings: ```js if (!cfg.files.every((f) => typeof f === 'string' && f.length > 0)) { throw new Error('config.files must contain only non-empty strings'); } ``` ### Technical Analysis `config.files` may contain absolute paths or relative paths with parent traversal. `path.resolve(process.cwd(), relFile)` normalizes those values but does not verify that the result remains beneath the project root. Consequently, entries such as the following can target files outside the project ...[truncated 1804 chars]
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
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • System Prompt LeakageDirect Leakage, Indirect Extraction, Tool-Based Exfiltration
Findings (67)

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

The declared purpose is frontend/UI design improvement, but the detected behavior includes screenshot capture, remote asset fetching, binary image processing, and rendering pipelines that materially extend beyond simple design analysis or code editing. This mismatch is dangerous because users and policy systems may approve the skill under a benign design label while it performs higher-risk operations that can ingest external content, process sensitive visual data, or hide complex execution paths.

Content

No source excerpt is available for this finding.

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
`/impeccable live` already warms context via `live.mjs` — if you've run `live.mjs`, don't also run `load-context.mjs` this session.

Intent-Code Divergence

High
Category
Not specified by scanner
Confidence
97% confidence
Finding

The document claims the task is 'not a design critique' while later requiring judgment of subjective anti-patterns such as 'AI slop tells' and whether the UI 'looks AI-generated.' This internal contradiction creates inconsistent agent behavior, invites arbitrary or unverifiable outputs, and increases the chance of biased or fabricated audit findings presented as technical assessment.

Content

No source excerpt is available for this finding.

Hidden Instructions

High
Category
Prompt Injection
Confidence
70% confidence
Finding

Hidden instructions were detected in comments or invisible text. These could contain malicious directives. Manual review is recommended.

Content

Scanner excerpt · reference/document.md (reported line 74)May include surrounding context.

md
## Two paths

- **Scan mode** (default): the project has design tokens, components, or rendered output. Extract, then confirm descriptive language. Use when there's code to analyze.
- **Seed mode**: the project is pre-implementation (fresh teach, nothing built yet). Interview for five high-level answers, write a minimal DESIGN.md marked `<!-- SEED -->`. Re-run in scan mode once there's code.

Decide by scanning first (Scan mode Step 1). If the scan finds no tokens, no component files, and no rendered site, offer seed mode — don't silently switch. `/impeccable document --seed` forces seed mode regardless of code presence.

Hidden Instructions

High
Category
Prompt Injection
Confidence
70% confidence
Finding

Hidden instructions were detected in comments or invisible text. These could contain malicious directives. Manual review is recommended.

Content

Scanner excerpt · reference/live.md (reported line 214)May include surrounding context.

Write CSS + all variants in ONE edit at the insertLine reported by wrap. Colocate scoped CSS as a <style> tag inside the variant wrapper — <style> works anywhere in modern browsers and this ensures CSS and HTML arrive atomically (no FOUC).

html
<!-- Variants: insert below this line -->
<style data-impeccable-css="SESSION_ID">
  @scope ([data-impeccable-variant="1"]) { ... }
  @scope ([data-impeccable-variant="2"]) { ... }

Hidden Instructions

High
Category
Prompt Injection
Confidence
70% confidence
Finding

Hidden instructions were detected in comments or invisible text. These could contain malicious directives. Manual review is recommended.

Content

Scanner excerpt · reference/live.md (reported line 350)May include surrounding context.

md
The browser bar is waiting for variants. Even without a wrapper in source, you still need to show something:

1. Manually write the wrapper scaffold into the **served** file (the one the browser actually loaded). Use the same structure `live-wrap.mjs` produces — `<!-- impeccable-variants-start ID --><div data-impeccable-variants="ID" data-impeccable-variant-count="3" style="display: contents">…</div><!-- end -->`.
2. Insert your three variant divs inside it, same shape as the deterministic path.
3. Signal done with `--reply EVENT_ID done --file <served file>`. The browser's no-HMR fallback will fetch and inject.

Hidden Instructions

High
Category
Prompt Injection
Confidence
70% confidence
Finding

Hidden instructions were detected in comments or invisible text. These could contain malicious directives. Manual review is recommended.

Content

Scanner excerpt · reference/live.md (reported line 350)May include surrounding context.

md
The browser bar is waiting for variants. Even without a wrapper in source, you still need to show something:

1. Manually write the wrapper scaffold into the **served** file (the one the browser actually loaded). Use the same structure `live-wrap.mjs` produces — `<!-- impeccable-variants-start ID --><div data-impeccable-variants="ID" data-impeccable-variant-count="3" style="display: contents">...</div><!-- end -->`.
2. Insert your three variant divs inside it, same shape as the deterministic path.
3. Signal done with `--reply EVENT_ID done --file <served file>`. The browser's no-HMR fallback will fetch and inject.

Hidden Instructions

High
Category
Prompt Injection
Confidence
70% confidence
Finding

Hidden instructions were detected in comments or invisible text. These could contain malicious directives. Manual review is recommended.

Content

Scanner excerpt · reference/live.md (reported line 385)May include surrounding context.

md
Do these five steps in the current thread, synchronously, before the next poll. Do not poll again until the file is clean.

1. **Locate the carbonize block** in the source file (`_acceptResult.file`). It's bracketed by `<!-- impeccable-carbonize-start SESSION_ID -->` and `<!-- impeccable-carbonize-end SESSION_ID -->` and contains a `<style data-impeccable-css="SESSION_ID">` element. If the variant declared parameters, an `<!-- impeccable-param-values SESSION_ID: {...} -->` comment sits alongside the style tag with the user's chosen values — read it first; it drives steps 3 and 4 below.
2. **Move the CSS rules** into the project's real stylesheet. Which stylesheet depends on the project (e.g. `public/css/workflow.css` for this repo, or the component's co-located CSS file for a Vite/Next project — pick whichever already owns styling for the surrounding element).
3. **Bake in parameter values while rewriting selectors.** For `@scope ([data-impeccable-variant="N"])` wrappers: retarget to real, semantic classes on the accepted HTML (`.why-visual--v2 .v2-label { … }`). For `:scope[data-p-<id>="VALUE"]` selectors: keep only the branch matching the chosen value from the param-values comment; drop the others (they're dead after accept). For `var(--p-<id>, DEFAULT)` in the CSS: either substitute the literal value, or if the param is still useful as a knob going forward, leave the var and update its initial declaration to the chosen value.
4. **Unwrap the accepted content.** Delete the `<div data-impeccable-variant="N" style="display: contents">` that wraps it. Drop `data-impeccable-params` and any `data-p-*` attributes from it — those are live-mode plumbing, not source.

Direct Prompt Extraction

High
Category
System Prompt Leakage
Confidence
85% confidence
Finding

Skill contains instructions that could directly expose system prompts, internal rules, or hidden instructions to users or external parties.

Content

Scanner excerpt · scripts/design-parser.mjs (reported line 302)May include surrounding context.

js
rules.push({ name: nameRaw, body: stripBold(mm[2]).trim() });
  }

  return rules;
}

// ---------- Per-section extractors ----------

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
90% confidence
Finding

The skill appears to invoke scripts with network-capable behavior but does not declare any tool or permission scope. That creates an undeclared capability boundary, so a harness may grant broader access than users expect and the skill can fetch remote resources during execution without explicit review. In a design skill, network access can be legitimate, but it still needs to be surfaced and constrained because it expands data exfiltration and supply-chain risk.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The activation language is extremely broad and can match a large fraction of ordinary UI, UX, and frontend requests. Over-broad routing increases the chance this skill is invoked in situations where its stronger capabilities, command flow, or side effects are unnecessary, which raises the attack surface and can bypass more specialized safer skills.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The file redefines the skill as a code-only technical audit and explicitly says it is 'not a design critique,' which conflicts with the parent skill's broader frontend interface improvement scope. This can cause the agent to ignore visual UX, interaction, and product-level concerns users expect from the skill, producing mis-scoped behavior and unsafe over-reliance on a narrow checklist.

Content

No source excerpt is available for this finding.

Autonomous Decision Making

Medium
Category
Excessive Agency
Confidence
75% confidence
Finding

Skill enables autonomous high-impact decisions without human-in-the-loop verification. Critical operations (destructive commands, financial transactions, data deletion) should require explicit user confirmation.

Content

Scanner excerpt · reference/audit.md (reported line 132)May include surrounding context.

md
- Provide generic recommendations (be specific and actionable)
- Skip positive findings (celebrate what works)
- Forget to prioritize (everything can't be P0)
- Report false positives without verification

Remember: You're a technical quality auditor. Document systematically, prioritize ruthlessly, cite specific code locations, and provide clear paths to improvement.

Autonomous Decision Making

Medium
Category
Excessive Agency
Confidence
80% confidence
Finding

Skill enables autonomous high-impact decisions without human-in-the-loop verification. Critical operations (destructive commands, financial transactions, data deletion) should require explicit user confirmation.

Content

Scanner excerpt · reference/craft.md (reported line 64)May include surrounding context.

md
- The brief's scope is **mid-fi, high-fi, or production-ready**.
- The current harness has **built-in image generation capability** (for example, Codex with a native image tool). Do **not** ask the user to set up external APIs, shell scripts, or one-off tooling just to do this.

When those conditions are met, this step is mandatory for **both brand and product work** in Codex and any harness with built-in image generation. Use native image generation; in Codex, use the built-in `image_gen` tool via the imagegen skill. If image generation is unavailable, do not ask the user to install APIs or tooling. State in one line that the image step is skipped because the harness lacks native image generation, then proceed.

Do not skip this step because the eventual UI should be semantic, editable, code-native, responsive, or accessible. Those are implementation requirements, not reasons to avoid visual exploration.

Autonomous Decision Making

Medium
Category
Excessive Agency
Confidence
80% confidence
Finding

Skill enables autonomous high-impact decisions without human-in-the-loop verification. Critical operations (destructive commands, financial transactions, data deletion) should require explicit user confirmation.

Content

Scanner excerpt · reference/shape.md (reported line 77)May include surrounding context.

md
- The brief's scope is **mid-fi, high-fi, or production-ready**.
- The current harness has **built-in image generation capability** (for example, Codex with a native image tool). Do **not** ask the user to set up external APIs, shell scripts, or one-off tooling just to do this.

When those conditions are met, this step is mandatory for **both brand and product work** in Codex and any harness with built-in image generation. Use native image generation; in Codex, use the built-in `image_gen` tool via the imagegen skill. If image generation is unavailable, do not ask the user to install APIs or tooling. State in one line that the image step is skipped because the harness lacks native image generation, then proceed.

Do not skip this step because the eventual UI should be semantic, editable, code-native, responsive, or accessible. Those are implementation requirements, not reasons to avoid visual exploration.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
83% confidence
Finding

The manifest describes a UI/design improvement skill, but this file requires delegating work to separate sub-agents and later invokes shell-style commands and browser automation tooling. While UI inspection itself fits the skill, mandatory sub-agent orchestration and command execution are agent-environment capabilities that are not obviously implied by the manifest's stated design-review purpose.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
94% confidence
Finding

The skill instructs use of npx impeccable without pinning an exact package version, which allows the resolved package to change over time and can expose users to a malicious or compromised release. Because this command is presented as part of the normal workflow, an operator may execute unreviewed code from the registry with local system access.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The skill directs the agent to start a local server and inject a script into live pages, which materially expands its power from critique into active code execution within a browser context. In a real environment this can affect authenticated sessions, page data, and local development instances, especially because the behavior is framed as required and lacks strong scoping constraints.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The workflow instructs local server startup and browser script injection without an explicit safety or privacy warning, so users may unknowingly run active code against sensitive pages or logged-in sessions. This increases the likelihood of accidental exposure of page contents, tokens, or other session-linked information to tooling the user has not consciously approved.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
94% confidence
Finding

Starting the live server with unpinned npx impeccable live & executes whatever package version the registry resolves at runtime. This creates a supply-chain risk and is especially sensitive because the command launches a local service that may interact with browser state and local content.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
91% confidence
Finding

npx impeccable live stop is also unpinned and therefore subject to the same registry resolution risk, though the stop command is somewhat less impactful than initial execution. It still normalizes dynamic execution of unversioned code and could run attacker-controlled package logic.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
88% confidence
Finding

The 'When to run' section lists high-level situations like stale documentation, missing files, or 'before a large redesign' rather than precise invocation constraints. In a markdown skill reference, these broad conditions can overlap with many normal project states and make it unclear exactly when the skill should activate versus merely suggest itself.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
87% confidence
Finding

The skill explicitly encourages use of device APIs including geolocation and ambient light even though those capabilities are not necessary for most frontend polishing tasks. That broad guidance can lead an agent to request or incorporate sensitive device-derived data without a strong task-bound justification, increasing privacy risk and expanding the attack surface beyond what users would reasonably expect for UI enhancement.

Content

No source excerpt is available for this finding.

Autonomous Decision Making

Medium
Category
Excessive Agency
Confidence
75% confidence
Finding

Skill enables autonomous high-impact decisions without human-in-the-loop verification. Critical operations (destructive commands, financial transactions, data deletion) should require explicit user confirmation.

Content

Scanner excerpt · reference/personas.md (reported line 59)May include surrounding context.

md
- Technical jargon without explanation
- No visible help option or guidance
- Ambiguous next steps after completing an action
- No confirmation that an action succeeded

---

Autonomous Decision Making

Medium
Category
Excessive Agency
Confidence
75% confidence
Finding

Skill enables autonomous high-impact decisions without human-in-the-loop verification. Critical operations (destructive commands, financial transactions, data deletion) should require explicit user confirmation.

Content

Scanner excerpt · reference/document.md (reported line 422)May include surrounding context.

md
## Philosophy

Most AI-generated UIs fail not because of bad code, but because of skipped thinking. They jump to "here's a card grid" without asking "what is the user trying to accomplish?" This command inverts that: understand deeply first, so implementation is precise.

## Phase 1: Discovery Interview

Static analysis

Detected: suspicious.dangerous_exec

Shell command execution detected (child_process).

Critical
Code
suspicious.dangerous_exec
Location
scripts/is-generated.mjs:44

Shell command execution detected (child_process).

Critical
Code
suspicious.dangerous_exec
Location
scripts/live-server.mjs:606

Shell command execution detected (child_process).

Critical
Code
suspicious.dangerous_exec
Location
scripts/live.mjs:209