Back to skill

Security audit

design-panel

Security checks for vulnerabilities and agentic risk

Overview

The skill’s design-review purpose is coherent, but it adds persistent local telemetry and sourceable shell state that users should review before installing.

Install only if you are comfortable with this skill writing design reports into your project and creating ~/.gstack analytics/session state. Review or disable the telemetry, timeline, and learnings hooks first, especially the sourceable .sh telemetry state and execution of helpers under ~/.claude/skills/gstack/bin.

Vulnerability Patterns
  • Tool Hijacking and SpoofingModifies or replaces tools so legitimate-looking calls execute attacker logic
  • 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 (3)

T09 · Insecure Skill Coding Practices

Error
Location
SKILL.md:80
Finding

Shell Injection Through Sourceable Telemetry State

Content
View full analysis
~/.gstack/analytics/.tel-design-panel-"$_SESSION_ID".sh </dev/null || true ``` The `_TEL` value originates from an external helper: ```bash _TEL=$(~/.claude/skills/gstack/bin/gstack-config get telemetry 2>/dev/null || echo "off") ``` ### Technical Analysis The Skill serializes runtime values by placing them directly inside a shell script. No shell escaping, validation, or allowlist is applied before `_TEL` is interpolated into the here-document. The resulting file is then executed with `source`. If `_TEL` contains quotation marks, command substitutions, newlines, or other shell syntax, it can terminate the intended assignment and introduce additional commands. For example, a malicious value structurally equivalent to the following would produce executable statements in the state file: ```text "; attacker_command; # ``` This is unsafe even if telemetry is normally expected to return a simple value such as `off`. The security boundary depends on the behavior and integrity of an external executable and its configuration, neither of which is validated by this Skill. The state file is also executable data stored under a persistent home-directory path. Any party capable of modifying it before the epilogue can inj ...[truncated 1396 chars]
Remediation
View remediation
"$STATE_FILE" ``` 3. Recover each field as data using `jq -r`, never as shell syntax. 4. Validate telemetry mode against a strict allowlist before use: ```bash case "$_TEL" in off|anonymous|full) ;; *) _TEL="off" ;; esac ``` 5. Create the analytics directory and state file with restrictive permissions: ```bash umask 077 mkdir -p -- "$HOME/.gstack/analytics" ``` 6. Use `mktemp` or an unpredictable, securely created state filename rather than constructing one directly. 7. If shell serialization is unavoidable, use a robust shell-escaping mechanism such as `printf '%q'`; however, structured non-executable storage is strongly preferred. ]]>

T07 · Tool Hijacking and Spoofing

Warning
Location
SKILL.md:48
Finding

Unverified Execution of Mutable External gstack Helpers

Content
View full analysis
/dev/null || echo "off") _TEL_START=$(date +%s) _SESSION_ID="$$-$(date +%s)" _OUTCOME="success" # default; abort/error gates override before epilogue _BRANCH=$(git branch --show-current 2>/dev/null || echo "unknown") echo "TELEMETRY: ${_TEL:-off} SESSION: $_SESSION_ID BRANCH: $_BRANCH" ``` ```bash # Timeline event for skill start. Best-effort; failures are silenced. if [ -x ~/.claude/skills/gstack/bin/gstack-timeline-log ]; then _TL_PAYLOAD=$(jq -nc --arg branch "$_BRANCH" --arg sid "$_SESSION_ID" \ '{skill:"design-panel",event:"started",branch:$branch,session:$sid}' 2>/dev/null || echo '{}') ~/.claude/skills/gstack/bin/gstack-timeline-log "$_TL_PAYLOAD" 2>/dev/null & fi ``` The Skill also mandates another optional helper: ```markdown - **Learnings hook (if gstack present):** at the start of the skill, run `~/.claude/skills/gstack/bin/gstack-learnings-search --limit 3` and include any prior `/design-panel` findings from the same repo. Marks them as `Prior learning applied:` in the report. ``` The epilogue invokes the timeline helper again: ```bash if [ -x ~/.claude/skills/gstack/bin/gstack-timeline-log ]; then _TL_BR=$(git branch --show-current 2>/dev/null || echo unknown) _TL_PAYLOAD=$(jq -nc --arg branch "$_TL_BR" --arg sid "$_SESSION_ID" --arg outcome "$_OUTCOME" --argjson dur "$_TEL_DUR" \ '{skill:"design-panel",event:"completed",branch:$branch,outcome:$outcome,duration_s:$dur,session:$sid}' 2>/dev/null || echo '{}') ~/.claude/skills/gstack/bin/gstack-timeline-log "$_TL_PAYLOAD" 2>/dev/null || true fi ``` ### Technical Analysis The Skill exec ...[truncated 2310 chars]
Remediation
View remediation

other

Note
Location
SKILL.md:48
Finding

Telemetry Collection and Persistent Analytics Exceed Core Skill Requirements

Content
View full analysis
~/.gstack/analytics/.pending-"$_SESSION_ID" 2>/dev/null || true # Local analytics start row (gated on gstack telemetry tier) if [ "$_TEL" != "off" ]; then echo '{"skill":"design-panel","ts":"'$(date -u +%Y-%m-%dT%H:%M:%SZ)'","repo":"'$(basename "$(git rev-parse --show-toplevel 2>/dev/null)" 2>/dev/null || echo unknown)'"}' \ >> ~/.gstack/analytics/skill-usage.jsonl 2>/dev/null || true fi ``` ```bash # Timeline event for skill start. Best-effort; failures are silenced. if [ -x ~/.claude/skills/gstack/bin/gstack-timeline-log ]; then _TL_PAYLOAD=$(jq -nc --arg branch "$_BRANCH" --arg sid "$_SESSION_ID" \ '{skill:"design-panel",event:"started",branch:$branch,session:$sid}' 2>/dev/null || echo '{}') ~/.claude/skills/gstack/bin/gstack-timeline-log "$_TL_PAYLOAD" 2>/dev/null & fi ``` ```bash if [ "$_TEL" != "off" ]; then echo '{"skill":"design-panel","duration_s":"'"$_TEL_DUR"'","outcome":"'"$_OUTCOME"'","session":"'"$_SESSION_ID"'","ts":"'$(date -u +%Y-%m-%dT%H:%M:%SZ)'"}' >> ~/.gstack/analytics/skill-usage.jsonl 2>/dev/null || true fi ``` The intended event format additionally includes review-specific metadata: ```json {"skill":"design-panel","personas":["ia","a11y","power","mobile"],"app_type":"APP_UI","n_findings":26,"top_impact":12.4,"duration_s":87,"outcome":"success"} ``` ### Technical Analysis The Skill’s declared purpose is to conduct a multi-persona design review. Telemetry is not required to browse the target applicati ...[truncated 2060 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 (19)

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
93% confidence
Finding

The command removes a path constructed with an interpolated session identifier and executes it via Bash. Although the session ID is intended to be locally generated, building shell commands around mutable variables and deleting files in the user's home directory creates a path-manipulation and destructive-action risk if the variable is ever influenced, corrupted, or reused unexpectedly.

Content

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

md
_TEL_END=$(date +%s)
_TEL_DUR=$(( _TEL_END - ${_TEL_START:-$_TEL_END} ))
rm -f ~/.gstack/analytics/.pending-"$_SESSION_ID" 2>/dev/null || true

if [ -x ~/.claude/skills/gstack/bin/gstack-timeline-log ]; then
  _TL_BR=$(git branch --show-current 2>/dev/null || echo unknown)

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
95% confidence
Finding

This deletes a dynamically named shell-state file from the user's home directory using rm -f with variable interpolation. Combined with the earlier creation and sourcing of that file, this pattern reflects unsafe lifecycle management of executable state and creates risk of deleting unintended files if the identifier or path handling is compromised.

Content

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

echo '{"skill":"design-panel","duration_s":"'"$_TEL_DUR"'","outcome":"'"$_OUTCOME"'","session":"'"$_SESSION_ID"'","ts":"'$(date -u +%Y-%m-%dT%H:%M:%SZ)'"}' >> ~/.gstack/analytics/skill-usage.jsonl 2>/dev/null || true fi

[ -n "${_SESSION_ID:-}" ] && rm -f ~/.gstack/analytics/.tel-design-panel-"$_SESSION_ID".sh 2>/dev/null || true

text

---

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 · SKILL.md (reported line 775)May include surrounding context.

echo '{"skill":"design-panel","duration_s":"'"$_TEL_DUR"'","outcome":"'"$_OUTCOME"'","session":"'"$_SESSION_ID"'","ts":"'$(date -u +%Y-%m-%dT%H:%M:%SZ)'"}' >> ~/.gstack/analytics/skill-usage.jsonl 2>/dev/null || true fi

[ -n "${_SESSION_ID:-}" ] && rm -f ~/.gstack/analytics/.tel-design-panel-"$_SESSION_ID".sh 2>/dev/null || true

text

---

Skill Enumeration

Medium
Category
Agent Snooping
Confidence
85% confidence
Finding

Skill enumerates or reads other installed skills. Access to other skills' SKILL.md files or the skills directory reveals prompt instructions, capabilities, and secrets that should be invisible to peer skills.

Content

Scanner excerpt · README.md (reported line 47)May include surrounding context.

Or copy if you don't want a symlink:

bash
mkdir -p ~/.claude/skills/design-panel
cp -r ~/repos/design-panel/* ~/.claude/skills/design-panel/

Session Persistence

Medium
Category
Rogue Agent
Confidence
60% confidence
Finding

Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.

Content

Scanner excerpt · README.md (reported line 47)May include surrounding context.

Or copy if you don't want a symlink:

bash
mkdir -p ~/.claude/skills/design-panel
cp -r ~/repos/design-panel/* ~/.claude/skills/design-panel/

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

This markdown manifest-style description lists invocation phrases, and one of them, "panel review," is generic enough to collide with ordinary requests for a review by a group. The file does not provide exclusion conditions or negative examples to narrow when this skill should activate versus a general review workflow.

Content

No source excerpt is available for this finding.

Session Persistence

Medium
Category
Rogue Agent
Confidence
60% confidence
Finding

Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.

Content

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

md
allowed-tools:
  - Bash
  - Read
  - Write
  - Edit
  - Glob
  - Grep

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The skill's stated purpose is design review of a live web app, but it also performs local telemetry and analytics writes under the user's home directory. This expands its behavior beyond user-visible review tasks and creates undisclosed data collection and persistence, which is risky in a security-sensitive agent environment even if the data appears operational rather than overtly malicious.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

The skill writes telemetry and usage data to disk without up-front disclosure in the user-facing description. Hidden persistence is dangerous because users may invoke a design-review skill without realizing it records repo, branch, session, and timing metadata under their home directory.

Content

No source excerpt is available for this finding.

Session Persistence

Medium
Category
Rogue Agent
Confidence
96% confidence
Finding

This creates persistent files under ~/.gstack/analytics unrelated to the user's requested design review, leaving behind session markers in the home directory. Undisclosed cross-session state is risky because it can accumulate metadata, survive beyond the task, and interact with later skill executions.

Content

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

md
# Pending marker — epilogue clears it; if the skill crashes the next gstack
# skill to start finalizes it as outcome=unknown.
mkdir -p ~/.gstack/analytics
echo '{"skill":"design-panel","ts":"'$(date -u +%Y-%m-%dT%H:%M:%SZ)'","session_id":"'"$_SESSION_ID"'"}' \
  > ~/.gstack/analytics/.pending-"$_SESSION_ID" 2>/dev/null || true

Session Persistence

Medium
Category
Rogue Agent
Confidence
98% confidence
Finding

The skill persists shell state, including session identifiers and telemetry variables, into an executable .sh file in the user's home directory for later sourcing. Writing executable state files increases risk because later commands may trust or execute that file, creating a persistence and integrity hazard if the file is modified or reused unexpectedly.

Content

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

md
# Persist telemetry state to disk so the epilogue can recover it even after
# the shell context is lost (each Bash tool call is a fresh shell).
mkdir -p ~/.gstack/analytics
cat > ~/.gstack/analytics/.tel-design-panel-"$_SESSION_ID".sh <<EOF
export _TEL="$_TEL"
export _TEL_START="$_TEL_START"

Autonomous Decision Making

Medium
Category
Excessive Agency
Confidence
85% 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 · SKILL.md (reported line 103)May include surrounding context.

md
- `--personas <list>` — explicit roster (e.g. `a11y,brand,mobile,conversion`), `+id` to add to defaults, `-id` to remove.
- `--deep` — runs all 8 personas instead of the default 4.
- `--report-only` — skip the Phase 7 "next steps" suggestion.
- `--yes` — non-interactive. Auto-confirms the `--deep` cost prompt.

Capture into shell variables: `URL`, `PERSONAS_OVERRIDE`, `DEEP`, `REPORT_ONLY`, `YES`.

Autonomous Decision Making

Medium
Category
Excessive Agency
Confidence
85% 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 · SKILL.md (reported line 737)May include surrounding context.

md
- `--personas <list>` — explicit roster (e.g. `a11y,brand,mobile,conversion`), `+id` to add to defaults, `-id` to remove.
- `--deep` — runs all 8 personas instead of the default 4.
- `--report-only` — skip the Phase 7 "next steps" suggestion.
- `--yes` — non-interactive. Auto-confirms the `--deep` cost prompt.

Capture into shell variables: `URL`, `PERSONAS_OVERRIDE`, `DEEP`, `REPORT_ONLY`, `YES`.

Session Persistence

Medium
Category
Rogue Agent
Confidence
60% confidence
Finding

Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.

Content

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

md
### 0.4 Hard duration caps

- Standard run: 300s ceiling. If exceeded, abort and write partial findings with `[aborted-at-cap]` tag.
- `--deep` run: 600s ceiling. Same partial-write behavior.

Implement via wall-clock checks at each phase boundary, not signal handlers.

Session Persistence

Medium
Category
Rogue Agent
Confidence
60% confidence
Finding

Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.

Content

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

md
1. **The persona's full markdown content** — Read from `<base-dir>/personas/<id>.md` and include verbatim. This is the persona's role + rubric.
2. **The evidence pack path** — `~/.gstack/sessions/$SESSION_ID/design-panel/evidence/`. Tell the subagent to read `manifest.json` first to know what's available.
3. **The Finding schema (above)** — Include the schema definition verbatim so the subagent emits the exact shape.
4. **The output path** — Tell the subagent to write its findings JSON to `~/.gstack/sessions/$SESSION_ID/design-panel/findings/<persona_id>.json`.

### Dispatch rule

Session Persistence

Medium
Category
Rogue Agent
Confidence
60% confidence
Finding

Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.

Content

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

md
]
}

Write the result to: ~/.gstack/sessions/{SESSION_ID}/design-panel/findings/{persona_id}.json

## Rules

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
89% confidence
Finding

The learnings/telemetry hooks introduce extra execution paths and data access unrelated to core design review, including reading prior repo-linked learnings and emitting telemetry events. These integrations increase attack surface and privacy risk because a skill that appears to inspect a web app is also consulting and persisting local metadata behind the scenes.

Content

No source excerpt is available for this finding.

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
90% confidence
Finding

The README explicitly states that the skill writes report and fix-plan artifacts into docs/design-panel/ within the user's project, but it does not prominently warn that running the skill modifies the working tree. In a development workflow this can create surprise file changes, pollute repos, or interact poorly with automation that assumes read-only analysis, though it does not by itself indicate code execution or data exfiltration.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Low
Category
Not specified by scanner
Confidence
71% confidence
Finding

The documentation emphasizes that the skill 'never invokes other skills automatically,' suggesting a narrow orchestration scope. Later instructions direct the skill to execute gstack helper binaries such as gstack-config, gstack-timeline-log, and gstack-learnings-search, which contradict the impression of a self-contained review flow even if they are not Claude skills per se.

Content

No source excerpt is available for this finding.