Back to skill

Security audit

bold-ui

Security checks for vulnerabilities and agentic risk

Overview

This UI theming skill is mostly coherent, but its GitHub template import can permanently install untrusted template instructions across projects with weak validation.

Review carefully before installing. The design features are reasonable, but only import templates from trusted repositories, avoid global template installation unless you understand the source, and check imported manifest IDs and Markdown descriptions for unsafe instructions before use.

Vulnerability Patterns
  • 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
  • Insecure Skill Coding PracticesFinds exploitable flaws such as hardcoded secrets or command injection
  • Remote Payload Retrieval and ExecutionFetches external code whose behavior can change after review
  • Embedded Malicious CodeShips malicious scripts inside the skill and executes them locally
Findings (3)

T01 · Skill Instruction Hijacking

Error
Location
SKILL.md:150
Finding

Untrusted GitHub Template Descriptions Can Hijack Agent Instructions

Content
View full analysis
/manifest.yaml Read: templates//description.md ``` ``` ```markdown Users can create their own design templates. A custom template needs at minimum a `manifest.yaml` with `meta.name` and `meta.id`, plus a `description.md` for the AI to understand the design intent. ### Adding Templates from GitHub (`add-temp`) When a user asks to add templates from a GitHub URL (e.g., "add this template: https://github.com/xxx/yyy", or "/bold-ui add-temp https://github.com/xxx/yyy"), follow this workflow: **Step A — Parse the GitHub URL** The URL can be any of these forms: - `https://github.com/owner/repo` — entire repo is a template collection - `https://github.com/owner/repo/tree/branch/path/to/template` — a specific template subdirectory - `https://github.com/owner/repo` where the repo root IS a single template (has `manifest.yaml`) **Step B — Fetch and Validate** Clone the repo to a temporary location (use `git clone --depth 1`), then validate each template candidate: ``` # Clone shallow for speed git clone --depth 1 /tmp/boldui-temp-import ``` ``` ```markdown | Rule | Required? | Check | |------|-----------|-------| | `manifest.yaml` exists | **Required** | File must be present and valid YAML | | `meta.name` | **Required** | Non-empty string | | `meta.id` | **Required** | Non-empty string, kebab-case recommended (e.g., `my-brand-style`) | | `meta.id` unique | **Required** | Must not conflict with existing template IDs (check `templates/index.yaml` + `~/.claude/bold-ui/templates/`) | | `description.md` | Recommended | Warn if missing, but don't reject | ``` ```sh mkdir -p ~/.clau ...[truncated 2807 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Error
Location
SKILL.md:315
Finding

Insufficient Template ID Validation Enables Shell and Path Injection

Content
View full analysis
/`: ``` mkdir -p ~/.claude/bold-ui/templates/ cp -r /tmp/boldui-temp-import//manifest.yaml ~/.claude/bold-ui/templates// cp -r /tmp/boldui-temp-import//description.md ~/.claude/bold-ui/templates// # Also copy any optional files: reference/, examples/, notes.md ``` ``` ### Technical Analysis The only mandatory constraint on `meta.id` is that it be a non-empty, unique string. Kebab-case is recommended but not enforced. The attacker-controlled value is subsequently inserted into unquoted shell-command templates and used as a destination path. Consequently, a malicious ID may contain: - Path traversal sequences such as `../`. - Absolute-path or separator characters. - Shell metacharacters such as `;`, `&`, `|`, backticks, or command substitutions. - Whitespace that creates additional command arguments. - Leading hyphens that may be interpreted as command options. If an Agent performs literal shell interpolation based on these instructions, the ID can escape the intended `~/.claude/bold-ui/templates/` directory or alter the command being executed. The source `` is also shown ...[truncated 1569 chars]
Remediation
View remediation

T02 · Agent Memory Poisoning

Error
Location
SKILL.md:343
Finding

Untrusted Template Instructions Are Persisted Globally Across Projects

Content
View full analysis
/`: ``` mkdir -p ~/.claude/bold-ui/templates/ cp -r /tmp/boldui-temp-import//manifest.yaml ~/.claude/bold-ui/templates// cp -r /tmp/boldui-temp-import//description.md ~/.claude/bold-ui/templates// # Also copy any optional files: reference/, examples/, notes.md ``` **Step F — Update Registry** Append newly installed templates to `templates/index.yaml` under the `templates:` list: ```yaml - id: my-brand-style name: "My Brand Style" source: "https://github.com/xxx/yyy" status: custom installed_at: "2026-05-24" ``` ``` ```markdown ### Local Templates Place custom templates in one of these locations (checked in order): 1. `/.bold-ui/templates/` — project-level (highest priority) 2. `~/.claude/bold-ui/templates/` — global (cross-project) 3. `/templates/` — built-in (lowest priority) ``` ```yaml # Custom template discovery paths (checked in order) # 1. /.bold-ui/templates/ # 2. ~/.claude/bold-ui/templates/ # 3. /templates/ (built-in) # To add templates from GitHub, use: # /bold-ui add-temp https://github.com/user/repo # Custom templates are appended below with `source` and `installed_at` fields. ``` ### Technical Analysis The import workflow copies attacker-controlled manifests, descriptions, references, examples, and notes into `~/.claude/bold-ui/templates/`, explicitly described as a global cross-project location. It also registers imported templates for later discovery. No integrity hash, trust state, quarantine marker, expiration, revalidation r ...[truncated 1812 chars]
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Tool MisuseTool Parameter Abuse, Chaining Abuse, Unsafe Defaults
  • Rogue AgentSelf-Modification, Session Persistence
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
Findings (43)

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
Fall back to `data/icon-fallback.json` if Iconify is unreachable.

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
Fall back to `data/icon-fallback.json` if Iconify is unreachable.

Context-Inappropriate Capability

High
Category
Not specified by scanner
Confidence
96% confidence
Finding

The workflow directs the agent to clone arbitrary GitHub repositories via git for template import, even though the skill's primary purpose is UI beautification. Pulling remote repositories introduces supply-chain and content-ingestion risk, especially when the fetched files are later copied into trusted local locations without strong isolation.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

High
Category
Not specified by scanner
Confidence
96% confidence
Finding

The instructions write imported templates into a global user directory and update a registry, creating persistent changes outside the current project. For a theming skill, this exceeds least privilege and can poison future sessions or projects by making untrusted templates globally available.

Content

No source excerpt is available for this finding.

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
90% 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 · SKILL.md (reported line 369)May include surrounding context.

Remove the temporary directory:

text
rm -rf /tmp/boldui-temp-import

Report final result: "Added 2 template(s): my-brand-style, another-theme. Now available when choosing templates."

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
90% 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 · SKILL.md (reported line 369)May include surrounding context.

Remove the temporary directory:

text
rm -rf /tmp/boldui-temp-import

Report final result: "Added 2 template(s): my-brand-style, another-theme. Now available when choosing templates."

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The skill is presented as a local UI theming/design assistant, but it also documents importing arbitrary GitHub repositories and installing their contents into local and global template stores. That expands the trust boundary from project-local design assistance to persistent ingestion of untrusted external content, which is a meaningful capability escalation users may not expect from the manifest and description.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The skill allows proactive suggestion whenever a project 'lacks visual polish,' which is vague and broad enough to trigger in many ordinary contexts. Over-broad activation increases the chance that higher-risk capabilities in the skill, such as external fetches or persistent writes, are invoked without a tightly relevant user request.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
84% confidence
Finding

The skill instructs network access to Iconify to fetch icons, which is an external transmission capability not clearly disclosed by the skill's stated scope. Even if the payload is limited to icon names, undisclosed network access can leak usage context and violates least surprise for a local design skill.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
83% confidence
Finding

The documented curl request to Iconify is an outbound network call to a third-party service. In the context of a local UI skill, this is risky because it creates external data transmission and supply dependency where a local asset bundle or offline fallback would be safer.

Content

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

| hugeicons | hugeicons | hugeicons:home-01 |

text
curl -s "https://api.iconify.design/lucide/arrow-right.svg?height=24"

Fall back to data/icon-fallback.json if Iconify is unreachable.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The markdown describes cloning repositories, copying files into user directories, updating registries, and deleting temporary directories without an explicit warning that filesystem modifications will occur. Users may not realize a design skill can persist changes outside the project, undermining informed consent and increasing the chance of unsafe execution.

Content

No source excerpt is available for this finding.

File System Enumeration

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Code scans file system directories looking for sensitive files. This could be reconnaissance for credential theft.

Content

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

git clone --depth 1 /tmp/boldui-temp-import

text

Walk the directory structure and identify template candidates — any directory containing a `manifest.yaml`.

**Step C — Validate Each Template**

Session Persistence

Medium
Category
Rogue Agent
Confidence
95% confidence
Finding

Copying imported content into ~/.claude/bold-ui/templates creates session-persistent state from untrusted external sources. That persistence can influence future runs and projects, effectively turning a one-time import into a long-lived trust decision without strong review or sandboxing.

Content

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

For each validated template, copy to ~/.claude/bold-ui/templates/<template-id>/:

text
mkdir -p ~/.claude/bold-ui/templates/<template-id>
cp -r /tmp/boldui-temp-import/<path>/manifest.yaml ~/.claude/bold-ui/templates/<template-id>/
cp -r /tmp/boldui-temp-import/<path>/description.md ~/.claude/bold-ui/templates/<template-id>/
# Also copy any optional files: reference/, examples/, notes.md

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The adapter’s stated purpose is local CSS/theme generation, but it also instructs the agent to perform network-based icon retrieval from Iconify. In an agent setting, that expands scope from deterministic file generation to outbound requests, which can leak user/project context via requested icon names and introduce dependency on external services without explicit user consent.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
84% confidence
Finding

This URL explicitly directs the agent or user to a third-party endpoint for icon retrieval. In the context of a CSS adapter, that is unnecessary external transmission capability and expands the trust boundary to an outside service.

Content

Scanner excerpt · adapters/css-variables.md (reported line 326)May include surrounding context.

md
| Template source | Iconify prefix | Example URL |
|----------------|---------------|-------------|
| lucide         | `lucide`       | `https://api.iconify.design/lucide/search.svg` |
| phosphor       | `ph`           | `https://api.iconify.design/ph/magnifying-glass.svg` |
| heroicons      | `heroicons-outline` / `heroicons-solid` | `https://api.iconify.design/heroicons-outline/search.svg` |
| feather        | `feather`      | `https://api.iconify.design/feather/search.svg` |

External Transmission

Medium
Category
Data Exfiltration
Confidence
84% confidence
Finding

This example URL points to external icon retrieval infrastructure, enabling outbound requests unrelated to pure local styling. Such instructions can cause project activity to depend on or disclose information to a remote service.

Content

Scanner excerpt · adapters/css-variables.md (reported line 327)May include surrounding context.

md
| Template source | Iconify prefix | Example URL |
|----------------|---------------|-------------|
| lucide         | `lucide`       | `https://api.iconify.design/lucide/search.svg` |
| phosphor       | `ph`           | `https://api.iconify.design/ph/magnifying-glass.svg` |
| heroicons      | `heroicons-outline` / `heroicons-solid` | `https://api.iconify.design/heroicons-outline/search.svg` |
| feather        | `feather`      | `https://api.iconify.design/feather/search.svg` |
| tabler         | `tabler`       | `https://api.iconify.design/tabler/search.svg` |

External Transmission

Medium
Category
Data Exfiltration
Confidence
84% confidence
Finding

The adapter includes another third-party icon API URL, further embedding external transmission behavior into otherwise local styling guidance. Repeated inclusion increases the likelihood an agent will treat network access as normal and automatic.

Content

Scanner excerpt · adapters/css-variables.md (reported line 328)May include surrounding context.

md
|----------------|---------------|-------------|
| lucide         | `lucide`       | `https://api.iconify.design/lucide/search.svg` |
| phosphor       | `ph`           | `https://api.iconify.design/ph/magnifying-glass.svg` |
| heroicons      | `heroicons-outline` / `heroicons-solid` | `https://api.iconify.design/heroicons-outline/search.svg` |
| feather        | `feather`      | `https://api.iconify.design/feather/search.svg` |
| tabler         | `tabler`       | `https://api.iconify.design/tabler/search.svg` |

External Transmission

Medium
Category
Data Exfiltration
Confidence
84% confidence
Finding

This external endpoint reference contributes to a pattern of unnecessary outbound-service dependence in a CSS generation skill. While not malicious, it broadens attack surface and may expose usage metadata to the provider.

Content

Scanner excerpt · adapters/css-variables.md (reported line 329)May include surrounding context.

| lucide | lucide | https://api.iconify.design/lucide/search.svg | | phosphor | ph | https://api.iconify.design/ph/magnifying-glass.svg | | heroicons | heroicons-outline / heroicons-solid | https://api.iconify.design/heroicons-outline/search.svg | | feather | feather | https://api.iconify.design/feather/search.svg | | tabler | tabler | https://api.iconify.design/tabler/search.svg |

text

External Transmission

Medium
Category
Data Exfiltration
Confidence
84% confidence
Finding

The file continues to enumerate external API URLs for asset retrieval, which is inconsistent with a least-privilege, local-only adapter design. In agent contexts, every such URL is a potential unreviewed exfiltration path for prompts, icon names, or contextual metadata.

Content

Scanner excerpt · adapters/css-variables.md (reported line 330)May include surrounding context.

| phosphor | ph | https://api.iconify.design/ph/magnifying-glass.svg | | heroicons | heroicons-outline / heroicons-solid | https://api.iconify.design/heroicons-outline/search.svg | | feather | feather | https://api.iconify.design/feather/search.svg | | tabler | tabler | https://api.iconify.design/tabler/search.svg |

text
# Fetch icon SVG from Iconify

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

Including a shell curl command gives the skill an operational pattern for outbound HTTP retrieval that is unnecessary for core CSS variable generation. In agent environments, this can normalize command execution and external access, creating risk of unintended data transmission, policy bypass, or supply-chain dependence on remote content.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
92% confidence
Finding

The curl example operationalizes external transmission by showing exactly how to fetch remote SVG content. In an automated agent environment, executable network examples are more dangerous than passive references because they can be copied directly into workflows and trigger outbound traffic immediately.

Content

Scanner excerpt · adapters/css-variables.md (reported line 334)May include surrounding context.

text
# Fetch icon SVG from Iconify
curl -s "https://api.iconify.design/lucide/search.svg?height=24"

Embed the returned SVG inline with the nv-icon class:

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The adapter instructs the agent to fetch icon SVGs from an external service, which expands the skill from local code generation into network activity. In an agent setting, this can leak user/project context through outbound requests, introduce supply-chain trust in third-party SVG content, and violate least-privilege expectations for a Tailwind adapter.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
88% confidence
Finding

This line embeds a third-party Iconify API endpoint in the skill instructions, encouraging outbound network access during execution. Even if only icon names are requested, the agent may disclose usage patterns or derived project details to an external service, and the returned SVG content becomes an untrusted input source.

Content

Scanner excerpt · adapters/tailwindcss.md (reported line 197)May include surrounding context.

md
| Template source | Iconify prefix | Example URL |
|----------------|---------------|-------------|
| lucide         | `lucide`       | `https://api.iconify.design/lucide/search.svg` |
| phosphor       | `ph`           | `https://api.iconify.design/ph/magnifying-glass.svg` |
| heroicons      | `heroicons-outline` / `heroicons-solid` | `https://api.iconify.design/heroicons-outline/search.svg` |
| feather        | `feather`      | `https://api.iconify.design/feather/search.svg` |

External Transmission

Medium
Category
Data Exfiltration
Confidence
88% confidence
Finding

This example directs the agent to use an external API for icon retrieval, creating unnecessary network egress for a styling adapter. In the skill context, that is more dangerous because the adapter's primary purpose is token translation and component generation, not external data access.

Content

Scanner excerpt · adapters/tailwindcss.md (reported line 198)May include surrounding context.

md
| Template source | Iconify prefix | Example URL |
|----------------|---------------|-------------|
| lucide         | `lucide`       | `https://api.iconify.design/lucide/search.svg` |
| phosphor       | `ph`           | `https://api.iconify.design/ph/magnifying-glass.svg` |
| heroicons      | `heroicons-outline` / `heroicons-solid` | `https://api.iconify.design/heroicons-outline/search.svg` |
| feather        | `feather`      | `https://api.iconify.design/feather/search.svg` |
| tabler         | `tabler`       | `https://api.iconify.design/tabler/search.svg` |

External Transmission

Medium
Category
Data Exfiltration
Confidence
88% confidence
Finding

The presence of this external endpoint indicates the skill may contact a third-party service as part of normal operation. That can create privacy, compliance, and integrity risks because generated code may incorporate untrusted remote SVGs without verification.

Content

Scanner excerpt · adapters/tailwindcss.md (reported line 199)May include surrounding context.

md
|----------------|---------------|-------------|
| lucide         | `lucide`       | `https://api.iconify.design/lucide/search.svg` |
| phosphor       | `ph`           | `https://api.iconify.design/ph/magnifying-glass.svg` |
| heroicons      | `heroicons-outline` / `heroicons-solid` | `https://api.iconify.design/heroicons-outline/search.svg` |
| feather        | `feather`      | `https://api.iconify.design/feather/search.svg` |
| tabler         | `tabler`       | `https://api.iconify.design/tabler/search.svg` |

Static analysis

No suspicious patterns detected.