Back to skill

Security audit

Bloom Discovery

Security checks for vulnerabilities and agentic risk

Overview

The skill broadly matches its discovery and identity purpose, but it needs review because it reads sensitive local conversation/profile data, uploads more derived identity data than its privacy text says, and includes an invocation path that can download and run remote code.

Review this skill before installing, especially in shared OpenClaw environments. Use it only if you are comfortable with local conversation and USER.md analysis, derived identity profile upload to Bloom, a stable conversation hash being sent for deduplication, and npm/GitHub supply-chain exposure during installation or wrapper first-run setup. Prefer an updated version that validates session ownership, shows the full outbound payload before upload, pins remote code by immutable commit, and fixes vulnerable dependencies.

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 (3)

T05 · Unauthorized Access and Privilege Escalation

Error
Location
openclaw-wrapper/execute.sh:113
Finding
Conversation Session Selection Is Not Bound to the Invoking User## Vulnerability Details **File Location**: `openclaw-wrapper/execute.sh:113-120`; `src/integrations/openclaw-session-reader.ts:91-96` **Vulnerability Type**: Improper authorization and cross-user session access **Risk Level**: High ### Vulnerable Code `openclaw-wrapper/execute.sh:113-120` ```bash if [ -z "$SESSION_FILE" ]; then # Try to locate session file from OpenClaw directory OPENCLAW_SESSIONS="$HOME/.openclaw/agents/main/sessions" if [ -d "$OPENCLAW_SESSIONS" ]; then # Find most recent .jsonl file SESSION_FILE=$(ls -t "$OPENCLAW_SESSIONS"/*.jsonl 2>/dev/null | head -1) ``` `src/integrations/openclaw-session-reader.ts:91-96` ```ts const sessionKey = `agent:main:${userId}`; let sessionId = sessionsMeta[sessionKey]?.sessionId; if (!sessionId) { // Fallback to default main session sessionId = sessionsMeta['agent:main:main']?.sessionId; } return sessionId || null; ``` ### Technical Analysis The wrapper accepts a user identity independently from the session file but does not verify that the selected session belongs to that user. When no session file is supplied, it selects the most recently modified JSONL file from the entire main-agent session directory. The alternative TypeScript session reader first attempts an exact user lookup but falls back to the global `agent:main:main` session when that lookup fails. This fallback crosses the intended user-to-session authorization boundary. In a shared or multi-user OpenClaw installation, the newest or default session may belong to a different user. The selected conversation is then treated as if it belonged to the invoking user. The session runner extracts up to 120 recent events, including both user and assistant text, and passes the resulting conversation to the personality-analysis pipeline. Path traversal protections on the session ID do not address this issue because the vulnerability concerns authorization and ownership, not path syntax. ### Attack Path 1. Multiple users interact ...[truncated 1391 chars]
Remediation
## Remediation Suggestions 1. Remove selection of the globally newest session file. 2. Remove the `agent:main:main` fallback when a user-specific session cannot be found. 3. Resolve session files only through an authoritative mapping between the authenticated invoking user and session ID. 4. Fail closed when no exact mapping exists or when multiple sessions are ambiguous. 5. Validate that an explicitly supplied session path belongs to the invoking user rather than merely checking that the file exists. 6. Restrict accepted session paths to the canonical OpenClaw session directory after resolving symlinks with `realpath`. 7. Require explicit user confirmation before processing a session selected through any fallback or administrative workflow. 8. Add multi-user tests proving that one user cannot analyze another user's newest, default, or explicitly named session. 9. Do not upload or save derived identity data if session ownership cannot be established.

T09 · Insecure Skill Coding Practices

Warning
Location
src/bloom-identity-skill-v2.ts:543
Finding
Privacy Disclosure Materially Understates the Identity Data Transmitted to Bloom## Vulnerability Details **File Location**: `src/bloom-identity-skill-v2.ts:543-580`; disclosure mismatch in `SKILL.md:65-75` **Vulnerability Type**: Misleading privacy controls and excessive transmission of derived sensitive data **Risk Level**: Medium ### Vulnerable Code `src/bloom-identity-skill-v2.ts:543-580` ```ts const identityPayload = { personalityType: identityData!.personalityType, tagline: identityData!.customTagline, description: identityData!.customDescription, longDescription: identityData!.customLongDescription, mainCategories: identityData!.mainCategories, subCategories: identityData!.subCategories, confidence: dataQuality, mode: (usedManualQA ? 'manual' : 'data') as 'data' | 'manual', dimensions, // LDP: noise spectrum scores before transmission (user sees originals) tasteSpectrums: identityData!.tasteSpectrums ? privatizeSpectrums(identityData!.tasteSpectrums) : undefined, strengths: identityData!.strengths, hiddenInsight: identityData!.hiddenInsight, aiPlaybook: identityData!.aiPlaybook, recommendations, // SHA-256 fingerprint of conversation (irreversible, for deduplication only) conversationHash: rawConversationText ? conversationFingerprint(rawConversationText) : undefined, privacyVersion: 'ldp-1.0', }; let registration: { agentId: string; assignedTribe: string; isNew: boolean } | undefined; // Step 4: Save identity + sync discoveries IN PARALLEL console.log('📝 Step 4: Saving identity + registering agent...'); const apiBase = process.env.BLOOM_API_URL || 'https://api.bloomprotocol.ai'; // Fire both requests concurrently — don't wait for save before syncing const savePromise = fetch(`${apiBase}/x402/agent-save`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ agentName: 'Bloom Discovery Agent', identityData: identityPayload, platform: 'openclaw', }), signal: AbortSignal.timeout(6000), }); ``` The main Skill disclosure ...[truncated 2655 chars]
Remediation
## Remediation Suggestions 1. Update all privacy disclosures to enumerate every transmitted field accurately. 2. Display the complete outbound payload to the user and obtain explicit confirmation before uploading it. 3. Minimize the server payload to fields strictly necessary for the requested dashboard or identity function. 4. Keep `hiddenInsight`, `aiPlaybook`, long descriptions, strengths, and recommendations local unless the user explicitly chooses to publish them. 5. Apply the documented privacy mechanism consistently to every score, including `dimensions`, or stop claiming those values are differentially private. 6. Replace the deterministic conversation hash with a keyed HMAC under a device-local secret or a randomized deduplication token. Do not transmit a stable unsalted transcript fingerprint. 7. Provide a local-only mode that creates the identity card without contacting Bloom. 8. Define retention, deletion, purpose limitation, and access controls for all derived profile data. 9. Add automated tests that compare documented outbound fields with the actual serialized request body.

T03 · Remote Payload Retrieval and Execution

Warning
Location
openclaw-wrapper/execute.sh:38
Finding
Skill Invocation Downloads and Executes a Remote Codebase## Vulnerability Details **File Location**: `openclaw-wrapper/execute.sh:38-55` **Vulnerability Type**: Remote payload retrieval and supply-chain code execution **Risk Level**: Medium ### Vulnerable Code ```bash # Auto-install bloom-identity-skill if not present if [ ! -d "$BLOOM_SKILL_DIR" ] || [ ! -d "$BLOOM_SKILL_DIR/src" ]; then echo "First-time setup: Installing Bloom Identity Skill..." echo "" # Create workspace directory if needed mkdir -p "$WORKSPACE_DIR" # Clone from canonical GitLab repository (pinned to release tag) BLOOM_VERSION="v4.0.1" echo "Downloading from GitLab (bloom-protocol/bloom-discovery-skill@${BLOOM_VERSION})..." if ! git clone --depth 1 --branch "$BLOOM_VERSION" "$BLOOM_REPO" "$BLOOM_SKILL_DIR" 2>/dev/null; then echo "Error: Failed to download Bloom Identity Skill" echo " Please check your internet connection and try again" echo " Repo: $BLOOM_REPO" exit 1 fi # Install dependencies echo "Installing dependencies..." cd "$BLOOM_SKILL_DIR" if ! npm install --silent; then echo "Warning: npm install had issues, but continuing..." fi ``` The downloaded package also declares an installation lifecycle script in `package.json:12-18`: ```json "scripts": { "start": "ts-node src/index.ts", "build": "tsc", "build:pipeline": "esbuild src/recommendation-pipeline.ts --bundle --platform=node --outfile=dist/recommendation-pipeline.js --format=cjs", "build:discovery": "esbuild src/discovery-sync.ts --bundle --platform=node --outfile=dist/discovery-sync.js --format=cjs", "build:all": "npm run build:pipeline && npm run build:discovery", "prepare": "npm run build:all" } ``` ### Technical Analysis The reviewed wrapper is not self-contained. On first invocation, it clones another copy of the project from a remote Git repository into a persistent OpenClaw workspace and runs `npm install`. Although the branch argument is named `BLOOM_VERSION` and uses a release tag, a Git tag is not inher ...[truncated 2096 chars]
Remediation
## Remediation Suggestions 1. Ship the complete reviewed implementation with the installed Skill instead of cloning executable code during invocation. 2. If remote retrieval is unavoidable, pin to an immutable commit SHA rather than a mutable tag. 3. Verify the fetched commit, release signature, and expected file hashes before running any code. 4. Require explicit user approval before downloading dependencies or executing installation scripts. 5. Use a lockfile-enforced command such as `npm ci` and verify package integrity. 6. Use `npm ci --ignore-scripts` where lifecycle scripts are unnecessary, then invoke only explicitly reviewed build steps. 7. Pin production dependencies to exact versions and use a trusted package registry. 8. Run installation and build operations in a sandbox with no access to conversations, credentials, wallets, or unrelated user files. 9. Do not silently continue after a failed installation; abort to avoid executing a partially installed or inconsistent codebase. 10. Record and display the verified commit identifier used for each execution.
Vulnerability Patterns
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
Findings (278)

Known Vulnerable Dependency: basic-ftp==5.1.0 — 4 advisory(ies): CVE-2026-27699 (Basic FTP has Path Traversal Vulnerability in its downloadToDir() method); GHSA-6v7q-wjvx-w8wg (basic-ftp: Incomplete CRLF Injection Protection Allows Arbitrary FTP Command Exe); CVE-2026-41324 (basic-ftp vulnerable to denial of service via unbounded memory consumption in Cl) +1 more

Critical
Category
Supply Chain
Confidence
98% confidence
Finding
basic-ftp 5.1.0 is flagged with multiple serious advisories including path traversal and FTP command-injection issues. Even though it appears in the dev/tooling dependency chain, vulnerable archive/network helper packages can still be exercised during development, CI, packaging, or any feature that fetches remote artifacts, potentially leading to arbitrary file overwrite, unauthorized file placement, or command abuse.

Credential Access

High
Category
Privilege Escalation
Content
git clone https://github.com/bloomprotocol/bloom-discovery-skill.git
cd bloom-identity-skill
npm install
cp .env.example .env

# Run from session file
npx tsx scripts/run-from-session.ts \
Confidence
60% confidence
Finding
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding
The repeated mismatch findings consistently indicate that the declared 'privacy-first local discovery' behavior does not fully align with the broader implementation, which appears to include identity generation, dashboard/auth flows, blockchain interactions, social/network integrations, installation/setup logic, and external API usage. When a skill that analyzes sensitive user conversation and profile data misstates its actual behavior, users cannot give informed consent and may unknowingly expose local data, identities, or credentials to remote systems.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding
The repeated mismatch findings consistently indicate that the declared 'privacy-first local discovery' behavior does not fully align with the broader implementation, which appears to include identity generation, dashboard/auth flows, blockchain interactions, social/network integrations, installation/setup logic, and external API usage. When a skill that analyzes sensitive user conversation and profile data misstates its actual behavior, users cannot give informed consent and may unknowingly expose local data, identities, or credentials to remote systems.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding
The repeated mismatch findings consistently indicate that the declared 'privacy-first local discovery' behavior does not fully align with the broader implementation, which appears to include identity generation, dashboard/auth flows, blockchain interactions, social/network integrations, installation/setup logic, and external API usage. When a skill that analyzes sensitive user conversation and profile data misstates its actual behavior, users cannot give informed consent and may unknowingly expose local data, identities, or credentials to remote systems.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding
The repeated mismatch findings consistently indicate that the declared 'privacy-first local discovery' behavior does not fully align with the broader implementation, which appears to include identity generation, dashboard/auth flows, blockchain interactions, social/network integrations, installation/setup logic, and external API usage. When a skill that analyzes sensitive user conversation and profile data misstates its actual behavior, users cannot give informed consent and may unknowingly expose local data, identities, or credentials to remote systems.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding
The repeated mismatch findings consistently indicate that the declared 'privacy-first local discovery' behavior does not fully align with the broader implementation, which appears to include identity generation, dashboard/auth flows, blockchain interactions, social/network integrations, installation/setup logic, and external API usage. When a skill that analyzes sensitive user conversation and profile data misstates its actual behavior, users cannot give informed consent and may unknowingly expose local data, identities, or credentials to remote systems.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding
The repeated mismatch findings consistently indicate that the declared 'privacy-first local discovery' behavior does not fully align with the broader implementation, which appears to include identity generation, dashboard/auth flows, blockchain interactions, social/network integrations, installation/setup logic, and external API usage. When a skill that analyzes sensitive user conversation and profile data misstates its actual behavior, users cannot give informed consent and may unknowingly expose local data, identities, or credentials to remote systems.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding
The repeated mismatch findings consistently indicate that the declared 'privacy-first local discovery' behavior does not fully align with the broader implementation, which appears to include identity generation, dashboard/auth flows, blockchain interactions, social/network integrations, installation/setup logic, and external API usage. When a skill that analyzes sensitive user conversation and profile data misstates its actual behavior, users cannot give informed consent and may unknowingly expose local data, identities, or credentials to remote systems.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding
The repeated mismatch findings consistently indicate that the declared 'privacy-first local discovery' behavior does not fully align with the broader implementation, which appears to include identity generation, dashboard/auth flows, blockchain interactions, social/network integrations, installation/setup logic, and external API usage. When a skill that analyzes sensitive user conversation and profile data misstates its actual behavior, users cannot give informed consent and may unknowingly expose local data, identities, or credentials to remote systems.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding
The repeated mismatch findings consistently indicate that the declared 'privacy-first local discovery' behavior does not fully align with the broader implementation, which appears to include identity generation, dashboard/auth flows, blockchain interactions, social/network integrations, installation/setup logic, and external API usage. When a skill that analyzes sensitive user conversation and profile data misstates its actual behavior, users cannot give informed consent and may unknowingly expose local data, identities, or credentials to remote systems.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding
The repeated mismatch findings consistently indicate that the declared 'privacy-first local discovery' behavior does not fully align with the broader implementation, which appears to include identity generation, dashboard/auth flows, blockchain interactions, social/network integrations, installation/setup logic, and external API usage. When a skill that analyzes sensitive user conversation and profile data misstates its actual behavior, users cannot give informed consent and may unknowingly expose local data, identities, or credentials to remote systems.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding
The repeated mismatch findings consistently indicate that the declared 'privacy-first local discovery' behavior does not fully align with the broader implementation, which appears to include identity generation, dashboard/auth flows, blockchain interactions, social/network integrations, installation/setup logic, and external API usage. When a skill that analyzes sensitive user conversation and profile data misstates its actual behavior, users cannot give informed consent and may unknowingly expose local data, identities, or credentials to remote systems.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding
The repeated mismatch findings consistently indicate that the declared 'privacy-first local discovery' behavior does not fully align with the broader implementation, which appears to include identity generation, dashboard/auth flows, blockchain interactions, social/network integrations, installation/setup logic, and external API usage. When a skill that analyzes sensitive user conversation and profile data misstates its actual behavior, users cannot give informed consent and may unknowingly expose local data, identities, or credentials to remote systems.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding
The repeated mismatch findings consistently indicate that the declared 'privacy-first local discovery' behavior does not fully align with the broader implementation, which appears to include identity generation, dashboard/auth flows, blockchain interactions, social/network integrations, installation/setup logic, and external API usage. When a skill that analyzes sensitive user conversation and profile data misstates its actual behavior, users cannot give informed consent and may unknowingly expose local data, identities, or credentials to remote systems.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding
The repeated mismatch findings consistently indicate that the declared 'privacy-first local discovery' behavior does not fully align with the broader implementation, which appears to include identity generation, dashboard/auth flows, blockchain interactions, social/network integrations, installation/setup logic, and external API usage. When a skill that analyzes sensitive user conversation and profile data misstates its actual behavior, users cannot give informed consent and may unknowingly expose local data, identities, or credentials to remote systems.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding
The repeated mismatch findings consistently indicate that the declared 'privacy-first local discovery' behavior does not fully align with the broader implementation, which appears to include identity generation, dashboard/auth flows, blockchain interactions, social/network integrations, installation/setup logic, and external API usage. When a skill that analyzes sensitive user conversation and profile data misstates its actual behavior, users cannot give informed consent and may unknowingly expose local data, identities, or credentials to remote systems.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding
The repeated mismatch findings consistently indicate that the declared 'privacy-first local discovery' behavior does not fully align with the broader implementation, which appears to include identity generation, dashboard/auth flows, blockchain interactions, social/network integrations, installation/setup logic, and external API usage. When a skill that analyzes sensitive user conversation and profile data misstates its actual behavior, users cannot give informed consent and may unknowingly expose local data, identities, or credentials to remote systems.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding
The repeated mismatch findings consistently indicate that the declared 'privacy-first local discovery' behavior does not fully align with the broader implementation, which appears to include identity generation, dashboard/auth flows, blockchain interactions, social/network integrations, installation/setup logic, and external API usage. When a skill that analyzes sensitive user conversation and profile data misstates its actual behavior, users cannot give informed consent and may unknowingly expose local data, identities, or credentials to remote systems.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding
The repeated mismatch findings consistently indicate that the declared 'privacy-first local discovery' behavior does not fully align with the broader implementation, which appears to include identity generation, dashboard/auth flows, blockchain interactions, social/network integrations, installation/setup logic, and external API usage. When a skill that analyzes sensitive user conversation and profile data misstates its actual behavior, users cannot give informed consent and may unknowingly expose local data, identities, or credentials to remote systems.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding
The repeated mismatch findings consistently indicate that the declared 'privacy-first local discovery' behavior does not fully align with the broader implementation, which appears to include identity generation, dashboard/auth flows, blockchain interactions, social/network integrations, installation/setup logic, and external API usage. When a skill that analyzes sensitive user conversation and profile data misstates its actual behavior, users cannot give informed consent and may unknowingly expose local data, identities, or credentials to remote systems.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding
The repeated mismatch findings consistently indicate that the declared 'privacy-first local discovery' behavior does not fully align with the broader implementation, which appears to include identity generation, dashboard/auth flows, blockchain interactions, social/network integrations, installation/setup logic, and external API usage. When a skill that analyzes sensitive user conversation and profile data misstates its actual behavior, users cannot give informed consent and may unknowingly expose local data, identities, or credentials to remote systems.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding
The repeated mismatch findings consistently indicate that the declared 'privacy-first local discovery' behavior does not fully align with the broader implementation, which appears to include identity generation, dashboard/auth flows, blockchain interactions, social/network integrations, installation/setup logic, and external API usage. When a skill that analyzes sensitive user conversation and profile data misstates its actual behavior, users cannot give informed consent and may unknowingly expose local data, identities, or credentials to remote systems.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding
The repeated mismatch findings consistently indicate that the declared 'privacy-first local discovery' behavior does not fully align with the broader implementation, which appears to include identity generation, dashboard/auth flows, blockchain interactions, social/network integrations, installation/setup logic, and external API usage. When a skill that analyzes sensitive user conversation and profile data misstates its actual behavior, users cannot give informed consent and may unknowingly expose local data, identities, or credentials to remote systems.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding
The repeated mismatch findings consistently indicate that the declared 'privacy-first local discovery' behavior does not fully align with the broader implementation, which appears to include identity generation, dashboard/auth flows, blockchain interactions, social/network integrations, installation/setup logic, and external API usage. When a skill that analyzes sensitive user conversation and profile data misstates its actual behavior, users cannot give informed consent and may unknowingly expose local data, identities, or credentials to remote systems.

Static analysis

Detected: suspicious.dangerous_exec, suspicious.env_credential_access

Shell command execution detected (child_process).

Critical
Code
suspicious.dangerous_exec
Location
scripts/deploy-sbt.ts:40

Shell command execution detected (child_process).

Critical
Code
suspicious.dangerous_exec
Location
src/integrations/bird-twitter.ts:103

Environment variable access combined with network send.

Critical
Code
suspicious.env_credential_access
Location
src/bloom-identity-skill-v2.ts:77

Environment variable access combined with network send.

Critical
Code
suspicious.env_credential_access
Location
src/bloom-mission-skill.ts:14

Environment variable access combined with network send.

Critical
Code
suspicious.env_credential_access
Location
src/discovery-sync.ts:140

Environment variable access combined with network send.

Critical
Code
suspicious.env_credential_access
Location
src/metrics/reporter.ts:16

Environment variable access combined with network send.

Critical
Code
suspicious.env_credential_access
Location
src/recommendation-pipeline.ts:315

Environment variable access combined with network send.

Critical
Code
suspicious.env_credential_access
Location
src/registry/erc8004.ts:51

Environment variable access combined with network send.

Critical
Code
suspicious.env_credential_access
Location
src/usecase/claim.ts:13

Environment variable access combined with network send.

Critical
Code
suspicious.env_credential_access
Location
src/utils/disk-cache.ts:45