Back to skill

Security audit

Hub1

Security checks for vulnerabilities and agentic risk

Overview

The skill has a coherent memory-service purpose, but the packaged app has serious authentication, secret-management, and reputation-data integrity risks that need review before installation.

Install only after reviewing the deployment code and controls. Set a strong JWT_SECRET, rotate the committed ACP key, remove shell-injection-prone sync scripts or make them safe, require verified wallet authentication on reputation mutations, disclose OpenAI/Qdrant processing, and avoid storing secrets, wallet seeds, tokens, regulated personal data, or confidential material in memories or shared pools.

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

T09 · Insecure Skill Coding Practices

Error
Location
src/lib/auth.ts:5
Finding

Predictable JWT Fallback Secret Enables Session Forgery

Content
View full analysis
`. 6. `jwtVerify` accepts the token, and the application loads the victim's agent record. 7. The attacker invokes memory APIs under the vict ...[truncated 488 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Error
Location
scripts/sync-acp-agents.ts:67
Finding

Shell Command Injection Through ACP Search Arguments

Content
View full analysis
0 ? args : DEFAULT_QUERIES syncAgents(queries) ``` ### Technical Analysis `execSync` executes its string through a shell. User-supplied command-line values are inserted into that shell command inside double quotes, but double quotes do not disable command substitution or every shell metacharacter. For example, a value containing `$(...)` can execute a nested command before the ACP CLI receives the argument. The script is expected to run in an environment containing database access and an authenticated ACP CLI session. Command injection therefore executes with materially greater privileges than are required merely to search ACP agents. ### Attack Path 1. An attacker influences an argument supplied to `scripts/sync-acp-agents.ts`, such as through an automation job, copied command, or untrusted wrapper. 2. The attacker supplies a query containing shell substitution syntax. 3. `browseAgents` embeds the query in `browse ""`. 4. `runAcpCommand` concatenates that value into an `execSync` shell command. 5. The shell evaluates the injected sy ...[truncated 620 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Error
Location
scripts/sync-all-acp-agents.ts:14
Finding

ACP API Credential Committed in Source Code

Content
View full analysis
{ try { const response = await fetch( `${ACP_API}/acp/agents?query=${encodeURIComponent(query)}`, { headers: { 'x-api-key': API_KEY, 'Content-Type': 'application/json', }, } ) if (!response.ok) { return [] } ``` ### Technical Analysis An API key is stored directly in a tracked first-party script. Anyone with repository access can extract and reuse it independently of the application. Sending a credential to the intended ACP host is necessary for authenticated synchronization, but embedding the credential in source exceeds the minimum safe privilege model. Source repositories, package artifacts, backups, forks, and logs are not appropriate secret stores. The static pre-scan warning for this script is therefore confirmed. By contrast, ordinary registry URLs in `package-lock.json` do not establish sensitive-data exfiltration. ### Attack Path 1. An attacker obtains the repository or a distributed copy of the script. 2. The attacker extracts the hardcoded `x-api-key` value. 3. The attacker sends requests directly to the ACP API using the stolen key. 4. Requests are attributed to the project until the credential is revoked or expires. ### Impact Assessment Potential impact includes unauthorized use of ACP API privileges, consumption of quotas, service disruption, and impersonation of the credential owner. The exact reachable operations depend on the server-side scope assigned to the key. Even if the key has already expired, its presence demonstrates unsafe credent ...[truncated 110 chars]
Remediation
View remediation

T05 · Unauthorized Access and Privilege Escalation

Error
Location
src/app/api/reputation/transaction/route.ts:11
Finding

Unauthenticated Reputation Transactions and Reports Permit Arbitrary Trust Manipulation

Content
View full analysis
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
src/lib/auth.ts:83
Finding

Replayable Wallet Authentication Accepts Arbitrarily Future Timestamps

Content
View full analysis
MAX_TIMESTAMP_AGE) { return { success: false, error: 'Timestamp expired' } } // Verify signature const message = `${AUTH_MESSAGE_PREFIX}${timestamp}` try { const isValid = await verifyMessage({ address: address as `0x${string}`, message, signature: signature as `0x${string}`, }) ``` The session route repeats the same one-sided test: ```ts const ts = parseInt(timestamp, 10) const now = Date.now() if (isNaN(ts) || now - ts > 5 * 60 * 1000) { return NextResponse.json( { success: false, error: 'Timestamp expired. Please try again.' }, { status: 401 } ) } ``` ### Technical Analysis The freshness check only rejects timestamps that are too old. If `ts` is far in the future, `now - ts` is negative and therefore does not exceed the maximum age. Authentication messages also contain no server-generated nonce, one-time-use identifier, domain, URI, chain identifier, or explicit expiration. A captured valid signature can be replayed within the ordinary window, while a signature over a future timestamp can remain acceptable until more than five minutes after that future time. The session endpoint converts each accepted signature into a new 24-hour JWT, increasing the practical value of replay. ### Attack Path 1. A valid signed authentication tuple is captured from a compromised client, log, browser context, or intermediary. 2. The attacker resubmits the same address, signature, and timestamp. 3. Because there is no consumed nonce, the application accepts the repeated message while its timestamp passes va ...[truncated 634 chars]
Remediation
View remediation

other

Warning
Location
src/lib/embeddings.ts:14
Finding

Plaintext Memories and Recall Queries Are Disclosed to External Data Processors

Content
View full analysis
{ const response = await getOpenAI().embeddings.create({ model: 'text-embedding-3-small', input: text, }) return response.data[0].embedding } export async function createEmbeddings(texts: string[]): Promise { const response = await getOpenAI().embeddings.create({ model: 'text-embedding-3-small', input: texts, }) return response.data.map((item) => item.embedding) } ``` Memory storage passes full content into that operation and duplicates plaintext into Qdrant: ```ts // Create embedding const embedding = await createEmbedding(body.content) // Generate vector ID const vectorId = uuidv4() // Store in Qdrant await upsertVector(vectorId, embedding, { agentId: auth.agent.id, content: body.content, type: body.type || 'fact', tags: body.tags || [], }) ``` Recall queries are sent through the same external embedding operation: ```ts // Create embedding for query const queryEmbedding = await createEmbedding(body.query) // Search Qdrant const results = await searchVectors( queryEmbedding, auth.agent.id, limit, body.type ? { type: body.type } : undefined ) ``` ### Technical Analysis Full plaintext memory content and semantic-search queries are submitted to the OpenAI API. Memory plaintext is also stored in both PostgreSQL and the Qdrant payload, creating multiple copies across service boundaries. External embedding is functionally related to semantic recall, so the network access itself is not covert. However, `SKILL.md` describes wallet-isolate ...[truncated 1269 chars]
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Memory PoisoningPersistent Context Injection, Context Window Stuffing, Memory Manipulation
  • Tool MisuseTool Parameter Abuse, Chaining Abuse, Unsafe Defaults
Findings (105)

Memory Manipulation

High
Category
Memory Poisoning
Confidence
86% confidence
Finding

Memory deletion is a legitimate feature, but exposing it in an agent skill increases the risk of prompt-induced or accidental manipulation of long-term memory. An attacker or misleading instruction could cause selective deletion of important records, undermining integrity and continuity.

Content

Scanner excerpt · OPENCLAWDY.md (reported line 167)May include surrounding context.

md
// List memories
GET /api/memory/list?type=preference&limit=20

// Delete memory
DELETE /api/memory/{id}

// Export all memories

Tool Parameter Abuse

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

md
GET /api/memory/list?type=preference&limit=20

// Delete memory
DELETE /api/memory/{id}

// Export all memories
GET /api/memory/export

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
84% confidence
Finding

A vault-wide DELETE operation is a highly destructive capability, and the documentation presents it without meaningful safety constraints or human-in-the-loop confirmation. In an agent environment, a single induced tool call could wipe all long-term memory, causing irreversible denial of service against the agent's knowledge base.

Content

Scanner excerpt · OPENCLAWDY.md (reported line 174)May include surrounding context.

GET /api/memory/export

// Clear vault DELETE /api/memory/vault

text

---

Memory Manipulation

High
Category
Memory Poisoning
Confidence
87% confidence
Finding

The API reference includes deletion and vault-clearing endpoints that can alter or erase long-term memory, making integrity attacks feasible if the agent can be induced to call them. In this context, persistent memory is central to agent behavior, so destructive manipulation has outsized operational impact.

Content

Scanner excerpt · OPENCLAWDY.md (reported line 401)May include surrounding context.

md
| POST | `/memory/recall` | Semantic search memories |
| GET | `/memory/list` | List memories |
| GET | `/memory/{id}` | Get specific memory |
| DELETE | `/memory/{id}` | Delete memory |
| GET | `/memory/export` | Export all memories |
| DELETE | `/memory/vault` | Clear entire vault |
| GET | `/agent/stats` | Usage statistics |

Memory Manipulation

High
Category
Memory Poisoning
Confidence
93% confidence
Finding

The skill exposes direct memory deletion, which can be abused through prompt injection, mistaken automation, or malicious instructions to remove safety-relevant or user-important memories. Because agent memory influences future behavior, deletion can tamper with decision context, erase auditability, and undermine integrity.

Content

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

Example:

text
Delete memory mem_abc123

Memory Manipulation

High
Category
Memory Poisoning
Confidence
94% confidence
Finding

The documented DELETE endpoints for individual memories and the entire vault expose destructive memory manipulation primitives at the API level. If invoked by an untrusted workflow, compromised agent, or weakly authorized integration, these endpoints could erase critical memory state at scale and disrupt agent behavior or evidence preservation.

Content

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

md
| POST | `/memory/recall` | Semantic search |
| GET | `/memory/list` | List memories |
| GET | `/memory/{id}` | Get specific memory |
| DELETE | `/memory/{id}` | Delete memory |
| GET | `/memory/vault` | Export all |
| DELETE | `/memory/vault` | Clear vault |
| GET | `/agent/stats` | Usage stats |

Known Vulnerable Dependency: ws==8.18.0 — 2 advisory(ies): CVE-2026-45736 (ws: Uninitialized memory disclosure); CVE-2026-48779 (ws: Memory exhaustion DoS from tiny fragments and data chunks)

High
Category
Supply Chain
Confidence
95% confidence
Finding

ws 8.18.0 is a real vulnerable dependency with advisories for memory disclosure and memory-exhaustion denial of service, and this package is common in wallet, RPC, and realtime communication stacks present in this project. Because the skill includes multiple WebSocket-capable blockchain and wallet libraries, any exposed WebSocket client/server processing attacker-influenced frames could be abused to crash the process or leak memory contents.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: ws==8.19.0 — 2 advisory(ies): CVE-2026-45736 (ws: Uninitialized memory disclosure); CVE-2026-48779 (ws: Memory exhaustion DoS from tiny fragments and data chunks)

High
Category
Supply Chain
Confidence
95% confidence
Finding

ws 8.19.0 is likewise affected by the cited memory disclosure and fragmentation-based DoS issues, and here it appears in the Solana websocket subscription stack. If this skill uses blockchain subscription features or other ws-backed channels reachable by untrusted networks, attackers may be able to trigger resource exhaustion or potentially disclose uninitialized memory through malformed frames.

Content

No source excerpt is available for this finding.

Memory Manipulation

High
Category
Memory Poisoning
Confidence
80% confidence
Finding

Skill manipulates agent memory, state, or stored context. Memory corruption can alter personality, override safety rules, or cause unpredictable behavior.

Content

Scanner excerpt · src/app/api/memory/[id]/route.ts (reported line 59)May include surrounding context.

ts
}
}

// DELETE memory
export async function DELETE(
  request: NextRequest,
  { params }: { params: Promise<{ id: string }> }

Memory Manipulation

High
Category
Memory Poisoning
Confidence
80% confidence
Finding

Skill manipulates agent memory, state, or stored context. Memory corruption can alter personality, override safety rules, or cause unpredictable behavior.

Content

Scanner excerpt · public/SKILL.md (reported line 129)May include surrounding context.

md
},
    })
  } catch (error) {
    console.error('Delete memory error:', error instanceof Error ? error.message : 'Unknown error')
    return NextResponse.json(
      { success: false, error: 'Internal server error' },
      { status: 500 }

Memory Manipulation

High
Category
Memory Poisoning
Confidence
80% confidence
Finding

Skill manipulates agent memory, state, or stored context. Memory corruption can alter personality, override safety rules, or cause unpredictable behavior.

Content

Scanner excerpt · public/SKILL.md (reported line 483)May include surrounding context.

md
},
    })
  } catch (error) {
    console.error('Delete memory error:', error instanceof Error ? error.message : 'Unknown error')
    return NextResponse.json(
      { success: false, error: 'Internal server error' },
      { status: 500 }

Memory Manipulation

High
Category
Memory Poisoning
Confidence
80% confidence
Finding

Skill manipulates agent memory, state, or stored context. Memory corruption can alter personality, override safety rules, or cause unpredictable behavior.

Content

Scanner excerpt · src/app/api/memory/[id]/route.ts (reported line 124)May include surrounding context.

ts
},
    })
  } catch (error) {
    console.error('Delete memory error:', error instanceof Error ? error.message : 'Unknown error')
    return NextResponse.json(
      { success: false, error: 'Internal server error' },
      { status: 500 }

Memory Manipulation

High
Category
Memory Poisoning
Confidence
80% confidence
Finding

Skill manipulates agent memory, state, or stored context. Memory corruption can alter personality, override safety rules, or cause unpredictable behavior.

Content

Scanner excerpt · src/app/dashboard/page.tsx (reported line 317)May include surrounding context.

tsx
},
    })
  } catch (error) {
    console.error('Delete memory error:', error instanceof Error ? error.message : 'Unknown error')
    return NextResponse.json(
      { success: false, error: 'Internal server error' },
      { status: 500 }

Memory Manipulation

High
Category
Memory Poisoning
Confidence
80% confidence
Finding

Skill manipulates agent memory, state, or stored context. Memory corruption can alter personality, override safety rules, or cause unpredictable behavior.

Content

Scanner excerpt · src/app/dashboard/page.tsx (reported line 361)May include surrounding context.

tsx
// Rollback on error
        setMemories((prev) => [memoryToDelete, ...prev])
        if (stats) setStats({ ...stats, memoriesStored: stats.memoriesStored })
        setError('Failed to delete memory')
      }
    } catch {
      // Rollback on network error

Memory Manipulation

High
Category
Memory Poisoning
Confidence
80% confidence
Finding

Skill manipulates agent memory, state, or stored context. Memory corruption can alter personality, override safety rules, or cause unpredictable behavior.

Content

Scanner excerpt · src/app/dashboard/page.tsx (reported line 367)May include surrounding context.

tsx
// Rollback on error
        setMemories((prev) => [memoryToDelete, ...prev])
        if (stats) setStats({ ...stats, memoriesStored: stats.memoriesStored })
        setError('Failed to delete memory')
      }
    } catch {
      // Rollback on network error

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The skill markets persistent memory for agents and gives examples of storing user preferences, but it does not clearly warn that this information is sent to an external service and retained across sessions. That creates a meaningful privacy and consent risk because agents may transmit sensitive user data off-platform without explicit user awareness or minimization guidance.

Content

No source excerpt is available for this finding.

Ssd 3

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The skill explicitly encourages long-term retention of conversational preferences, project context, and prior interactions, but it provides no data minimization, sensitivity classification, or retention boundaries. This creates a natural path for agents to persist personal, confidential, or regulated data far beyond user expectations.

Content

No source excerpt is available for this finding.

Autonomous Decision Making

Medium
Category
Excessive Agency
Confidence
76% confidence
Finding

The phrase 'applies context without asking again' indicates autonomous reuse of prior memory without renewed user confirmation. In a memory system this can cause privacy surprises, stale-context misuse, or actions taken based on retained assumptions the user did not intend to persist.

Content

Scanner excerpt · OPENCLAWDY.md (reported line 78)May include surrounding context.

  1. Later, new session starts
  2. Agent queries: "What are user's preferences?"
  3. OpenClawdy returns: "User prefers dark mode" (0.95 relevance)
  4. Agent applies context without asking again
text

---

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The documentation exposes deletion and vault-clearing operations without prominently warning that these actions can permanently erase stored memory. In an agent setting, destructive actions may be triggered by misunderstanding, prompt injection, or operator error, causing irreversible loss of context and history.

Content

No source excerpt is available for this finding.

Ssd 3

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The embedded SKILL instructions tell agents to store arbitrary information for later retrieval, including user preferences, with no privacy guardrails or approval checks. This makes unsafe retention behavior part of the intended workflow and increases the chance that agents will memorize sensitive user content automatically.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The skill markets persistent memory, export, and semantic recall capabilities without prominently warning users not to store secrets, personal data, or regulated information. This can lead agents to persist sensitive data and later expose it through recall or export features, increasing privacy and data leakage risk across sessions.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The cross-agent memory pool feature encourages sharing knowledge between agents but does not warn that pooled memories may contain sensitive, proprietary, or user-specific information. In practice, this can cause unintended disclosure of confidential context to other agents or operators with pool access.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

Although overwrite mode is mentioned, the snapshot restore feature does not strongly warn that restoring in overwrite mode can replace current memory state and effectively rewrite the agent's retained knowledge. This creates integrity and safety risks, especially if an agent can be prompted into destructive state changes or loss of important context.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The documented history and reporting flows expose transaction metadata, counterparty identities, ratings, and feedback to an external service without any privacy notice, retention disclosure, or minimization guidance. In a reputation system, this data can be sensitive and linkable over time, creating deanonymization, profiling, and reputational harm risks if users submit it without understanding how it will be stored or shared.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The register and transaction endpoints collect identifying and transactional information and appear designed to persist it for future trust scoring, yet the documentation omits any warning that submissions may create a lasting public or semi-public reputation record. This can mislead integrators into sending data that affects identity, traceability, and trust outcomes without informed consent or operational safeguards.

Content

No source excerpt is available for this finding.