Back to skill

Security audit

Introspect

Security checks for vulnerabilities and agentic risk

Overview

This skill is a legitimate local session-analysis tool, but it creates persistent reports containing raw snippets from private Claude Code conversations despite privacy claims that may make users expect less exposure.

Install only if you are comfortable with a local agent reading recent Claude Code conversations and creating plaintext reports that may include snippets from prompts or assistant responses. Before running it, limit the date range and project filter, avoid sessions containing secrets or proprietary material, review and delete generated introspect-data JSON files when done, and prefer pinned/reviewed installation commands over unpinned npx/@latest examples.

Vulnerability Patterns
  • 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
  • Embedded Malicious CodeShips malicious scripts inside the skill and executes them locally
Findings (1)

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/analyze.py:819
Finding

Raw Claude Code conversation content is persisted in plaintext analysis reports

Content
View full analysis
list[dict]: """Extract representative conversation snippets for Claude to analyze. Picks diverse samples: longest, shortest, most frustrated, most efficient, etc. Truncates messages to keep token usage reasonable. """ if not sessions: return [] snippets = [] selected_ids = set() def add_snippet(s, reason, max_msgs=15): if s["session_id"] in selected_ids: return selected_ids.add(s["session_id"]) # Get user messages (truncated) user_msgs = [] for msg in s["user_messages"][:max_msgs]: user_msgs.append({ "text": msg["text"][:500], # Truncate long messages "timestamp": msg.get("timestamp"), }) # Get first message (full, up to 800 chars) — important for goal clarity first_msg = s["user_messages"][0]["text"][:800] if s["user_messages"] else "" # Get last 3 messages (for completion detection) last_msgs = [] for msg in s["user_messages"][-3:]: last_msgs.append(msg["text"][:300]) # Frustration moments (full context) frustration_moments = [] for i, msg in enumerate(s["user_messages"]): if contains_signal(msg["text"], FRUSTRATION_SIGNALS_STRONG) or contains_signal(msg["text"], FRUSTRATION_SIGNALS_MILD): context = { "user_msg": msg["text"][:400], "position": f"turn {i + 1}/{s['user_msg_count']}", } ...[truncated 5447 chars]
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Rogue AgentSelf-Modification, Session Persistence
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
Findings (47)

Ssd 3

High
Category
Not specified by scanner
Confidence
91% confidence
Finding

The script is explicitly designed to collect Claude session content and prepare it for further analysis, which inherently handles potentially sensitive prompts, code, filenames, and behavioral data. In the context of an introspection skill, that purpose makes the access expected, but it also increases risk because the data being processed is highly privacy-sensitive by nature.

Content

No source excerpt is available for this finding.

Ssd 3

High
Category
Not specified by scanner
Confidence
98% confidence
Finding

Session snippet extraction copies user prompts, timestamps, completion context, and nearby conversation fragments into the output dataset. This is dangerous because prompts often contain credentials, proprietary code, internal URLs, incident details, or personal data, and the snippet selection intentionally surfaces 'interesting' examples that may be especially sensitive.

Content

No source excerpt is available for this finding.

Ssd 3

High
Category
Not specified by scanner
Confidence
98% confidence
Finding

The final output bundles comprehensive session-derived data, including metrics, project distribution, scope data, and extracted snippets, then both saves and prints it. This concentrates sensitive historical information into a single artifact and increases the likelihood of unintended disclosure through local compromise, backups, logs, or reuse by later tools and models.

Content

No source excerpt is available for this finding.

Ssd 3

High
Category
Not specified by scanner
Confidence
98% confidence
Finding

The script intentionally aggregates raw user conversation text, first and last messages, frustration moments, tool-derived file/path hints, and derived behavioral analysis into a plain-language JSON artifact. That creates a high-risk data exposure path because the output is easy for downstream tools, logs, or humans to read and may reveal sensitive prompts, credentials, internal project details, or personal information embedded in session history.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The README says the tool reads Claude conversation history, extracts raw metrics and conversation snippets, and has Claude interpret the data, but it does not prominently warn that sensitive prompts or snippets from prior sessions may be processed and included in generated reports. Users may unknowingly expose secrets, proprietary code fragments, credentials, or personal data present in their session history.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
94% confidence
Finding

The README instructs users to execute an unpinned package via npx, which fetches and runs the latest published code at install time. If the package is compromised, typosquatted, or a malicious update is published, users may execute attacker-controlled code on their local machine with their user privileges.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
94% confidence
Finding

This update command uses an unpinned npx package reference, so the command implicitly trusts whatever code is currently published under that package name. A malicious or compromised release could run arbitrary code during the update process and replace the local skill with attacker-controlled content.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
94% confidence
Finding

The check command also invokes the remote package without version pinning, which still requires trusting and executing whatever package version is published at that moment. Even seemingly harmless 'check' commands can execute arbitrary install scripts or package code and therefore present the same supply-chain risk.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
92% confidence
Finding

Referencing the unpinned npm command again reinforces a workflow where users repeatedly execute whatever the latest package code is. Repeated execution increases exposure to supply-chain compromise because users may rerun the command long after the README was reviewed.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
88% confidence
Finding

The skill instructs the agent to run a local Python script and write a markdown report, but it declares no explicit tool scope or permissions. That mismatch can lead to over-broad execution/file access at runtime and makes it harder to constrain what the skill may read or write.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The invocation text contains broad triggers like 'analyze my sessions', 'session report', and 'how am I performing', which may cause the skill to activate in situations the user did not clearly intend. Because this skill reads sensitive local session history, accidental invocation increases privacy risk and surprise data processing.

Content

No source excerpt is available for this finding.

Session Persistence

Medium
Category
Rogue Agent
Confidence
82% confidence
Finding

The skill is explicitly designed to read and analyze prior Claude sessions, then produce a personalized report. That creates a real session-persistence/privacy risk because historical prompts, snippets, and behavioral profiling may contain sensitive project, credential, or personal information and are persisted into another report file.

Content

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

md
---

> You are a **developer psychologist**. Not a calculator, not a template filler. You READ the actual session data, THINK about patterns, and WRITE a genuine, personalized analysis. Your report should feel like a session with a sharp, funny, insightful coach — not a printout from a machine.

## Phase 1: Collect Input

Session Persistence

Medium
Category
Rogue Agent
Confidence
80% confidence
Finding

This section reinforces using specific evidence from past sessions, increasing the chance the report reproduces or persists sensitive content from historical conversations. The danger is not the wording itself, but the skill behavior of mining prior session data and embedding details into durable output.

Content

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

md
- Do they pivot and show Phoenix behavior?
- Do they give up (abandon session)?

Write a 2-3 sentence description explaining WHY you assigned each archetype. Use specific evidence from the sessions.

### 3.3 — Behavioral Patterns (The Psychology Part)

Rp1

Medium
Category
MCP Rug Pull
Confidence
92% confidence
Finding

The README instructs users to execute the package via npx without pinning a specific version, which causes whatever version is current in the registry at execution time to be fetched and run. If the package is later compromised, typo-squatted, or a malicious update is published, users following the documentation may execute attacker-controlled code during installation.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
92% confidence
Finding

This command example runs the package from the npm registry without a pinned version, so users are exposed to the latest published package rather than a reviewed build. That creates a supply-chain risk where a malicious or compromised release could be executed directly on user machines.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
92% confidence
Finding

The install command is documented without a fixed version, meaning it will resolve to whichever package version is available at runtime. In a compromise scenario, this allows arbitrary code execution via a trojaned package update during installation.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
91% confidence
Finding

The update example intentionally pulls the latest package code but does so without any version constraint or authenticity verification. This magnifies supply-chain exposure because update paths are likely to be rerun over time, increasing the window for a malicious publication to be executed.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
88% confidence
Finding

Although check may sound passive, invoking npx still downloads and executes package code when the package is not already present, and the version is not pinned here. A malicious release could therefore abuse even a diagnostic command path.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
88% confidence
Finding

The uninstall command is also executed through unpinned npx, so users may run whatever code the registry serves at that time rather than the code they originally installed. An attacker could exploit trust in maintenance commands to execute arbitrary code under the guise of cleanup.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
86% confidence
Finding

Even the version-display example uses unpinned npx, which can trigger download and execution of the latest package code. While the expected action is low risk, the execution path still exposes users to registry compromise or malicious updates.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
86% confidence
Finding

The help command appears harmless, but invoking it through unpinned npx still trusts and executes the current registry version. This creates unnecessary supply-chain risk for users who may assume help output is safe by definition.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
94% confidence
Finding

The README explicitly encourages @latest, which guarantees execution of a mutable, unaudited package version and increases supply-chain risk rather than reducing it. If the maintainer account or package is compromised, users following this advice will immediately run attacker-controlled code.

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 · npm-package/bin/cli.js (reported line 167)May include surrounding context.

js
if (!hasPython) {
    log(`${RED}  ✖ Python 3 not found. Install it:${RESET}`);
    log(`    Ubuntu/Debian: sudo apt install python3`);
    log(`    macOS: brew install python3`);
    log(`    Android/Termux: pkg install python`);
    log("");

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 · npm-package/bin/cli.js (reported line 220)May include surrounding context.

js
const reportsDir = path.join(CLAUDE_SKILLS, "reports");
    fs.mkdirSync(reportsDir, { recursive: true });

    // Write version tracker
    writeVersionFile(version);

    log(`${GREEN}  ✔ Installed v${version} successfully!${RESET}`);

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The uninstall path removes the entire ~/.claude/skills/introspect directory with fs.rmSync(..., { recursive: true, force: true }) immediately after a status message. For code files, destructive operations should have some form of user disclosure or confirmation unless clearly covered; here there is no prompt or stronger warning before deletion.

Content

No source excerpt is available for this finding.

Static analysis

Detected: suspicious.dangerous_exec

Shell command execution detected (child_process).

Critical
Code
suspicious.dangerous_exec
Location
npm-package/bin/cli.js:53