Back to skill

Security audit

Bloom Supporter Identity

Security checks for vulnerabilities and agentic risk

Overview

This skill needs review before installation because it automatically downloads and runs unpinned external code while reading stored chat transcripts.

Install only if you are comfortable with a skill downloading and running live GitHub/npm code, reading local OpenClaw session transcripts, creating persistent local config, and sending derived identity results to Bloom services. Review or pin the external repository and dependencies first, replace the default JWT secret, and avoid using it on sensitive conversations until the session-selection and data-flow behavior is explicit.

Vulnerability Patterns
  • Remote Payload Retrieval and ExecutionFetches external code whose behavior can change after review
  • 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
Findings (4)

T03 · Remote Payload Retrieval and Execution

Error
Location
execute.sh:22
Finding

Unpinned Remote Repository and Dependencies Are Installed and Executed

Content
View full analysis
/dev/null; then echo "❌ Error: Failed to download Bloom Identity Skill" echo " Please check your internet connection and try again" exit 1 fi # Install dependencies echo "📦 Installing dependencies..." cd "$BLOOM_SKILL_DIR" if ! npm install --silent 2>/dev/null; then echo "⚠️ Warning: npm install had issues, but continuing..." fi echo "✅ Installation complete!" echo "" ``` ```bash # Run analyzer with session file cd "$BLOOM_SKILL_DIR" npx tsx scripts/run-from-session.ts "$SESSION_FILE" "$USER_ID" ``` ### Technical Analysis The wrapper retrieves the current default branch of an external GitHub repository without pinning an immutable commit, release artifact, signature, or expected cryptographic hash. It then runs `npm install`, which can execute package lifecycle scripts, and launches TypeScript code from the downloaded checkout through `npx`. Consequently, the effective code executed by this Skill is not contained in the audited package and can change after publication or review. The behavior of `npx` may also involve downloading a package if an appropriate local executable is unavailable. Suppressing installation errors and continuing makes the situation less predictable: the wrapper may execute a partially installed, stale, or otherwise inconsistent dependency tree. ### Attack Path 1. An attacker compromises the referenced GitHub repository, its maintainer account, or a dependency in its npm dependency graph. 2. The attacker inserts malicious code into the default branch, a package lifecycle script, or a dependency. 3. A user invokes the Skill on a system wh ...[truncated 1091 chars]
Remediation
View remediation

T05 · Unauthorized Access and Privilege Escalation

Error
Location
execute.sh:83
Finding

Private Conversation Transcript Is Automatically Exposed to Unreviewed Runtime Code

Content
View full analysis
/dev/null | head -1) if [ -n "$SESSION_FILE" ]; then echo "📁 Using session file: $(basename "$SESSION_FILE")" fi fi fi ``` ```bash # Run analyzer with session file cd "$BLOOM_SKILL_DIR" npx tsx scripts/run-from-session.ts "$SESSION_FILE" "$USER_ID" ``` ### Technical Analysis When no transcript is explicitly supplied, the wrapper automatically selects the newest JSONL file in the main OpenClaw sessions directory. It passes the full filesystem path to analyzer code obtained from a mutable external repository. Although `SKILL.md` discloses conversation-read and external-network capabilities, the analyzer that enforces the claimed local-only processing is absent from this project. Therefore, this artifact cannot establish that only the last 120 messages are read, that sensitive fields are removed, or that raw conversation text is not transmitted. Selecting the newest file also does not establish that it belongs to the conversation that invoked the Skill. On a shared or multi-session installation, the most recently modified transcript may represent another session. ### Attack Path 1. A user invokes `/bloom` without explicitly selecting a session file. 2. The wrapper scans `~/.openclaw/agents/main/sessions`. 3. It selects the newest `.jsonl` file, which may not be the intended conversation. 4. The wrapper passes that transcript path and the user identifier to externally downloaded TypeScript. 5. The analyzer read ...[truncated 713 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Error
Location
execute.sh:49
Finding

Predictable Default JWT Signing Secret Is Written to Configuration

Content
View full analysis
"$BLOOM_SKILL_DIR/.env" << 'EOF' # Bloom Identity Configuration JWT_SECRET=default_secret_change_me DASHBOARD_URL=https://bloomprotocol.ai BLOOM_API_URL=https://api.bloomprotocol.ai NETWORK=base-mainnet EOF ``` ### Technical Analysis The wrapper silently creates a `.env` file containing the publicly known value `default_secret_change_me` as `JWT_SECRET`. `SKILL.md` states that JWT tokens are used for dashboard authentication, making the confidentiality and unpredictability of this signing secret security-sensitive. If the application signs or validates authentication tokens using this value, any attacker who knows the default can generate cryptographically valid tokens. The script does not generate a random secret, reject the known default, warn that startup is unsafe, or set explicit restrictive permissions on the resulting file. Whether a forged token is accepted by a remote service depends on the omitted analyzer and server implementation, but the configuration itself creates an unsafe default authentication state. ### Attack Path 1. The Skill runs without an existing `.env` file and writes the known default secret. 2. The user does not manually replace the value. 3. The analyzer uses that value to sign or validate dashboard JWTs. 4. An attacker reproduces the expected token structure and signs an arbitrary payload with `default_secret_change_me`. 5. A component that trusts tokens under the same secret accepts the forged token. 6. The attacker may impersonate a user or identity, subject to the authorization behavior of the receiving service. ### Impact Assessment Possible consequences include: - Forged dashboard authentication tokens. - User or identity impersonation. - Unauthorized access to identity-card functions or data. - Unau ...[truncated 213 chars]
Remediation
View remediation

other

Warning
Location
README.md:5
Finding

Privacy and Execution Documentation Contradicts the Implemented Session-File Workflow

Content
View full analysis
/dev/null | head -1) fi ``` ```bash # Run analyzer with session file cd "$BLOOM_SKILL_DIR" npx tsx scripts/run-from-session.ts "$SESSION_FILE" "$USER_ID" ``` ### Technical Analysis The README claims that the wrapper processes conversation context directly, does not need session files, and invokes `run-from-context.ts`. The actual executable searches the persistent sessions directory, selects a JSONL transcript, and invokes `run-from-session.ts`. This discrepancy affects security-relevant consent because direct processing of supplied context and automatic access to stored session files have different privacy boundaries. The documentation may lead users to believe that no p ...[truncated 854 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
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Rogue AgentSelf-Modification, Session Persistence
Findings (25)

Scope Creep

High
Category
Not specified by scanner
Confidence
96% confidence
Finding

The script performs local writes and package installation despite no declared file-write permission, creating a mismatch between manifest expectations and actual behavior. This is dangerous because users and policy engines may trust the declared permission set while the code persists files and executes install hooks locally.

Content

No source excerpt is available for this finding.

Credential Access

High
Category
Privilege Escalation
Confidence
60% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · execute.sh (reported line 45)May include surrounding context.

sh
fi

# Check for required environment variables
if [ ! -f "$BLOOM_SKILL_DIR/.env" ]; then
  echo "⚙️  Setting up configuration..."

  # Copy .env.example if it exists

Credential Access

High
Category
Privilege Escalation
Confidence
60% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · execute.sh (reported line 50)May include surrounding context.

sh
fi

# Check for required environment variables
if [ ! -f "$BLOOM_SKILL_DIR/.env" ]; then
  echo "⚙️  Setting up configuration..."

  # Copy .env.example if it exists

Credential Access

High
Category
Privilege Escalation
Confidence
60% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · execute.sh (reported line 55)May include surrounding context.

sh
fi

# Check for required environment variables
if [ ! -f "$BLOOM_SKILL_DIR/.env" ]; then
  echo "⚙️  Setting up configuration..."

  # Copy .env.example if it exists

Credential Access

High
Category
Privilege Escalation
Confidence
60% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · execute.sh (reported line 51)May include surrounding context.

sh
# Copy .env.example if it exists
  if [ -f "$BLOOM_SKILL_DIR/.env.example" ]; then
    cp "$BLOOM_SKILL_DIR/.env.example" "$BLOOM_SKILL_DIR/.env"
    echo "📝 Created .env file from template"
    echo "   Edit $BLOOM_SKILL_DIR/.env to customize settings"
  else
    # Create minimal .env

Credential Access

High
Category
Privilege Escalation
Confidence
60% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · execute.sh (reported line 52)May include surrounding context.

sh
# Copy .env.example if it exists
  if [ -f "$BLOOM_SKILL_DIR/.env.example" ]; then
    cp "$BLOOM_SKILL_DIR/.env.example" "$BLOOM_SKILL_DIR/.env"
    echo "📝 Created .env file from template"
    echo "   Edit $BLOOM_SKILL_DIR/.env to customize settings"
  else
    # Create minimal .env

Credential Access

High
Category
Privilege Escalation
Confidence
60% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · execute.sh (reported line 62)May include surrounding context.

sh
# Copy .env.example if it exists
  if [ -f "$BLOOM_SKILL_DIR/.env.example" ]; then
    cp "$BLOOM_SKILL_DIR/.env.example" "$BLOOM_SKILL_DIR/.env"
    echo "📝 Created .env file from template"
    echo "   Edit $BLOOM_SKILL_DIR/.env to customize settings"
  else
    # Create minimal .env

Credential Access

High
Category
Privilege Escalation
Confidence
74% confidence
Finding

The script writes a default JWT_SECRET=default_secret_change_me into a generated .env file. Shipping a predictable secret can lead to insecure deployments if users forget to change it, enabling token forgery or impersonation in any component that relies on that secret.

Content

Scanner excerpt · execute.sh (reported line 54)May include surrounding context.

sh
echo "📝 Created .env file from template"
    echo "   Edit $BLOOM_SKILL_DIR/.env to customize settings"
  else
    # Create minimal .env
    cat > "$BLOOM_SKILL_DIR/.env" << 'EOF'
# Bloom Identity Configuration
JWT_SECRET=default_secret_change_me

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
89% confidence
Finding

The README claims the skill analyzes conversations 'without needing ... external APIs,' but later documents JWT_SECRET and DASHBOARD_URL for dashboard token generation and a remote dashboard endpoint. This inconsistency can mislead operators about where conversation-derived data may flow, undermining informed consent, privacy review, and secure deployment decisions.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
86% confidence
Finding

The documentation presents the wrapper as conversation-only and not requiring external APIs, while other sections imply external dashboard interaction. In a skill with network:external permission and access to conversations, this discrepancy is security-relevant because maintainers may under-assess egress, logging, and privacy risks.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The README explicitly describes automatic collection of current conversation context for analysis, but does not include any warning about privacy implications, retention, or sensitive-content handling. Given the skill has read:conversations and network:external permissions, users and operators may unknowingly expose personal, credential-like, or proprietary content to analysis pipelines or remote services.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
70% confidence
Finding

npx commands without a version suffix (e.g. @1.0.0) create a rug-pull risk if the upstream server is compromised and publishes a malicious update.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
70% confidence
Finding

npx commands without a version suffix (e.g. @1.0.0) create a rug-pull risk if the upstream server is compromised and publishes a malicious update.

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 70)May include surrounding context.

text
"discover my supporter type"
"what's my bloom identity"
"create my supporter card"

Works with as few as 3 messages—but richer history = deeper insights.

Rp1

Medium
Category
MCP Rug Pull
Confidence
86% confidence
Finding

Using npx tsx without a pinned version allows the fetched package version to drift over time and may pull an unexpected or compromised release at execution time. In a security-sensitive skill that processes conversation data, this creates a supply-chain risk where arbitrary code could run with the user's local context and granted permissions.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
86% confidence
Finding

This second npx tsx invocation has the same unpinned-package risk: execution may resolve to a mutable upstream package version, enabling dependency confusion or compromised release scenarios. Because the command can process piped conversation context, exploitation could expose sensitive local data or execute attacker-controlled code.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The wrapper silently clones and executes a separate GitHub repository at runtime, which is much broader than the stated personality-analysis/recommendation behavior exposed to the user. This creates a hidden trust boundary: the reviewed file is not the only code that runs, so repository compromise or unexpected upstream changes can lead to arbitrary code execution.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The script automatically downloads code from GitHub and installs npm packages, then proceeds toward execution without a confirmation prompt. That exposes the user to silent supply-chain compromise and install-script execution from third-party content not included in the reviewed skill.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The skill writes into ~/.openclaw/workspace, creates configuration files, and installs npm dependencies even though its stated purpose is conversation analysis and recommendations. Those side effects are unnecessary for a minimally scoped skill and expand persistence and attack surface on the host.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
88% confidence
Finding

The wrapper locates a local session file containing conversation history and passes it into an analyzer that is configured with external service endpoints, without an explicit consent gate at execution time. Given the skill permission read:conversations and the sensitive nature of chat history, this creates a meaningful privacy and data-exfiltration risk.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
80% confidence
Finding

The script executes npx tsx without pinning a version or vendoring the dependency, so runtime behavior depends on whatever package resolution occurs on the host or via npm. That creates supply-chain risk and makes execution non-reproducible, especially because this wrapper already downloads and runs external code automatically.

Content

No source excerpt is available for this finding.

Lp4

Low
Category
MCP Least Privilege
Confidence
65% confidence
Finding

Declared permissions with no matching code capability may indicate removed functionality or pre-staging for future abuse.

Content

No source excerpt is available for this finding.

Lp4

Low
Category
MCP Least Privilege
Confidence
65% confidence
Finding

Declared permissions with no matching code capability may indicate removed functionality or pre-staging for future abuse.

Content

No source excerpt is available for this finding.

Excessive Permissions

Low
Category
Privilege Escalation
Confidence
80% confidence
Finding

The declared permission set includes crypto:wallet for an optional future feature while the core function is supporter-type analysis and recommendation. Granting wallet capability broadens the attack surface unnecessarily; if the skill or a dependency is compromised, wallet creation or key material handling introduces more severe consequences than the primary feature requires.

Content

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

md
## ⚠️ Permissions & Capabilities

This skill requires the following permissions:

**📖 Read Conversations** - Analyzes your last ~120 messages to understand your interests and supporter type. Raw conversation text stays local; only analysis results are used.

Intent-Code Divergence

Low
Category
Not specified by scanner
Confidence
76% confidence
Finding

The file claims raw conversation text stays local, but other sections instruct users to run scripts over full session files and note access to ~/.openclaw/agents/main/sessions/*.jsonl. Even if data is not intentionally exfiltrated, this mismatch weakens informed consent and may cause users to underestimate the scope of sensitive local data handling.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.