Back to skill

Security audit

TotalReclaw

Security checks for vulnerabilities and agentic risk

Overview

TotalReclaw is a real memory plugin, but it uses broad background access to conversations, credentials, host config, persistent instructions, and remotely downloaded executable code in ways users should review carefully before installing.

Install only if you are comfortable giving this plugin broad access to local OpenClaw conversations and model-provider credentials under the same OS account. Use a dedicated machine or OS user, a dedicated recovery phrase, and a narrowly scoped LLM provider key; avoid shared multi-agent or multi-user gateways until the plugin limits polling and credential access to the active agent and removes remote executable loading or verifies it with a stronger trust root.

Vulnerability Patterns
  • 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
  • Unauthorized Access and Privilege EscalationObtains permissions beyond the task's legitimate needs
  • Skill Instruction HijackingAlters the agent's session goals or safety constraints when the skill loads
  • Embedded Malicious CodeShips malicious scripts inside the skill and executes them locally
Findings (5)

T03 · Remote Payload Retrieval and Execution

Error
Location
embedding/embedder-loader.ts:124
Finding

Unauthenticated Remote Embedder Bundle Is Downloaded and Dynamically Executed

Content
View full analysis
api.logger.info(msg) }) .then((result) => { api.logger.info( `TotalReclaw: embedder prefetch ${ result === 'fetched' ? 'completed (downloaded bundle)' : 'cache hit' }`, ); }) .catch((err: unknown) => { const msg = err instanceof Error ? err.message : String(err); api.logger.warn( `TotalReclaw: embedder prefetch failed ` + `(non-fatal — will retry on first generateEmbedding): ${msg}`, ); }); } ``` ```ts // embedding/embedder-network.ts export const DEFAULT_BUNDLE_URL_TEMPLATE = 'https://github.com/p-diogo/totalreclaw/releases/download/v{rcTag}/embedder-{bundleVersion}.tar.gz'; export const DEFAULT_MANIFEST_URL_TEMPLATE = 'https://github.com/p-diogo/totalreclaw/releases/download/v{rcTag}/embedder-{bundleVersion}.manifest.json'; ``` ```ts // embedding/embedder-loader.ts const rawManifest = await fetchManifestJson(manifestUrl, { fetchImpl: opts.fetchImpl, log, timeoutMs: opts.manifestTimeoutMs ?? 60_000, }); if (!isValidManifestShape(rawManifest)) { throw new Error(`embedder manifest at ${manifestUrl} failed shape validation`); } const manifest = rawManifest as BundleManifest; await downloadAndExtractTarGz( bundleUrl, layout.versionRoot, manifest.tarball_sha256, { fetchImpl: opts.fetchImpl, log, timeoutMs: opts.bundleTimeoutMs ?? 600_000, }, ); ``` ```ts // embedding/embedder-loader.ts const fileUrl = pathToFileURL(esmEntry).href; const mod = await import(fileUrl); return normalizeImportNamespace(mod, specifi ...[truncated 2528 chars]
Remediation
View remediation

T05 · Unauthorized Access and Privilege Escalation

Error
Location
subgraph/trajectory-poller.ts:432
Finding

Host Conversation-Access Controls Are Bypassed by Polling Every Agent’s Trajectory Files

Content
View full analysis
/sessions/.trajectory.jsonl * * for new prompt.submitted (user) and model.completed * (data.assistantTexts) events since the last poll... */ ``` ```ts export function findTrajectoryFiles(rootHome?: string): string[] { const home = rootHome ?? os.homedir(); const agentsDir = path.join(home, '.openclaw', 'agents'); if (!fs.existsSync(agentsDir)) return []; const out: string[] = []; try { for (const agent of fs.readdirSync(agentsDir)) { const sessionsDir = path.join(agentsDir, agent, 'sessions'); if (!fs.existsSync(sessionsDir)) continue; for (const f of fs.readdirSync(sessionsDir)) { if (f.endsWith('.trajectory.jsonl')) { out.push(path.join(sessionsDir, f)); } } } } catch { // Best-effort; skip silently on read errors. } return out; } ``` ```ts export function parseNewMessages( file: string, lastOffset: number, ): { messages: Array<{ role: 'user' | 'assistant'; content: string }>; newOffset: number; } { const stat = fs.statSync(file); if (stat.size <= lastOffset) { return { messages: [], newOffset: stat.size }; } const fd = fs.openSync(file, 'r'); let text: string; try { const buf = Buffer.alloc(stat.size - lastOffset); fs.readSync(fd, buf, 0, buf.length, lastOffset); text = buf.toString('utf-8'); } finally { fs.closeSync(fd); } // ... if (evt.type === 'prompt.submitted' && typeof evt.data?.prompt === 'string') { messages.push({ role: 'user', content: evt.data.prom ...[truncated 3665 chars]
Remediation
View remediation

T05 · Unauthorized Access and Privilege Escalation

Error
Location
llm/llm-profile-reader.ts:118
Finding

Provider API Credentials Are Harvested Across All OpenClaw Agents

Content
View full analysis
= []; try { const root = defaultAuthProfilesRoot(CONFIG.home); if (root) { const all = readAllProfileKeys({ root }); ...[truncated 2733 chars]
Remediation
View remediation

T02 · Agent Memory Poisoning

Error
Location
index.ts:432
Finding

Persistent Behavioral Instructions Are Injected into the Agent’s MEMORY.md

Content
View full analysis
**TotalReclaw is active.** Your encrypted memories are loaded automatically > at the start of each conversation — no need to search this file for them. > Recall is automatic via the memory_search tool; to explicitly store a fact, > run \`tr remember ""\` in a shell. Do NOT write user facts, > preferences, or decisions to this file. This file is for workspace-level > notes only (non-sensitive). `; function ensureMemoryHeader( logger: OpenClawPluginApi['logger'], ): void { const outcome = ensureMemoryHeaderFile( CONFIG.openclawWorkspace, MEMORY_HEADER, ); if (outcome === 'updated') { logger.info('Added TotalReclaw header to MEMORY.md'); } else if (outcome === 'created') { logger.info('Created MEMORY.md with TotalReclaw header'); } } ``` ```ts export function ensureMemoryHeaderFile( workspace: string, header: string, markerSubstring: string = 'TotalReclaw is active', ): EnsureMemoryHeaderResult { try { const memoryMd = path.join(workspace, 'MEMORY.md'); if (fs.existsSync(memoryMd)) { const content = fs.readFileSync(memoryMd, 'utf-8'); if (content.includes(markerSubstring)) return 'unchanged'; fs.writeFileSync(memoryMd, header + content); return 'updated'; } const dir = path.dirname(memoryMd); if (!fs.existsSync(dir)) { fs.mkdirSync(dir, { recursive: true }); } fs.writeFileSync(memoryMd, header); return 'created'; } catch { return 'error'; } } ``` ### Technical Analysis The plugin creates or prepends a durable instruction block to the workspace’s `MEMORY.md`. This is an Agent-consumed long-term memory surface, so the inserted text can influence future sessions after the current invocation has ended. The i ...[truncated 1851 chars]
Remediation
View remediation

T05 · Unauthorized Access and Privilege Escalation

Warning
Location
fs-helpers.ts:1021
Finding

Plugin Self-Grants Conversation Access, Changes Host-Wide Telegram Settings, and Restarts the Gateway

Content
View full analysis
; if (typeof cfg.plugins !== 'object' || cfg.plugins === null) { cfg.plugins = {}; } let mutated = false; if ( typeof cfg.plugins.entries !== 'object' || cfg.plugins.entries === null ) { cfg.plugins.entries = {}; } if ( typeof cfg.plugins.entries.totalreclaw !== 'object' || cfg.plugins.entries.totalreclaw === null ) { cfg.plugins.entries.totalreclaw = {}; } if ( typeof cfg.plugins.entries.totalreclaw.hooks !== 'object' || cfg.plugins.entries.totalreclaw.hooks === null ) { cfg.plugins.entries.totalreclaw.hooks = {}; } if ( cfg.plugins.entries.totalreclaw.hooks.allowConversationAccess !== true ) { cfg.plugins.entries.totalreclaw.hooks.allowConversationAccess = true; mutated = true; } if ( typeof cfg.channels === 'object' && cfg.channels !== null ) { const tg = cfg.channels.telegram; if ( typeof tg === 'object' && tg !== null && tg.enabled === true ) { if ( typeof tg.streaming !== 'object' || tg.streaming === null ) { tg.streaming = { mode: 'off' }; mutated = true; } else if (tg.streaming.mode === undefined) { tg.streaming.mode = 'off'; mutated = true; ...[truncated 3260 chars]
Remediation
View remediation
Vulnerability Patterns
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Tool MisuseTool Parameter Abuse, Chaining Abuse, Unsafe Defaults
  • 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 (886)

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
90% confidence
Finding

The changelog documents an install recovery step that uses a wildcarded rm -rf ~/.openclaw/npm/projects/*totalreclaw-totalreclaw*. Destructive shell deletion guidance in agent-facing install flows is dangerous because an LLM may execute it in broader-than-intended contexts, with path expansion surprises or user-environment differences, causing irreversible data loss.

Content

Scanner excerpt · CHANGELOG.md (reported line 48)May include surrounding context.

md
### Changed

- **npm stable-promote unblocked.** Plugin npm publishing is consolidated onto `npm-publish.yml` behind a single registered Trusted Publisher (#509), with the `sync-version` tr-cli path + npm@11 fixes (#497). The stable promote now publishes to npm; 3.3.12 had reached ClawHub only.
- **Reinstall-robust install flow** documented — the install always runs `openclaw plugins enable totalreclaw` (idempotent slot-bind) and recovers a reinstall over leftover config via uninstall + orphan-package cleanup (`rm -rf ~/.openclaw/npm/projects/*totalreclaw-totalreclaw*`); `--force` is explicitly never the fix. (#507)

## [3.3.12] — 2026-07-06

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
85% confidence
Finding

The changelog documents an install recovery step that uses a wildcarded rm -rf ~/.openclaw/npm/projects/*totalreclaw-totalreclaw*. Destructive shell deletion guidance in agent-facing install flows is dangerous because an LLM may execute it in broader-than-intended contexts, with path expansion surprises or user-environment differences, causing irreversible data loss.

Content

Scanner excerpt · CHANGELOG.md (reported line 48)May include surrounding context.

md
### Changed

- **npm stable-promote unblocked.** Plugin npm publishing is consolidated onto `npm-publish.yml` behind a single registered Trusted Publisher (#509), with the `sync-version` tr-cli path + npm@11 fixes (#497). The stable promote now publishes to npm; 3.3.12 had reached ClawHub only.
- **Reinstall-robust install flow** documented — the install always runs `openclaw plugins enable totalreclaw` (idempotent slot-bind) and recovers a reinstall over leftover config via uninstall + orphan-package cleanup (`rm -rf ~/.openclaw/npm/projects/*totalreclaw-totalreclaw*`); `--force` is explicitly never the fix. (#507)

## [3.3.12] — 2026-07-06

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
90% confidence
Finding

The changelog documents an install recovery step that uses a wildcarded rm -rf ~/.openclaw/npm/projects/*totalreclaw-totalreclaw*. Destructive shell deletion guidance in agent-facing install flows is dangerous because an LLM may execute it in broader-than-intended contexts, with path expansion surprises or user-environment differences, causing irreversible data loss.

Content

Scanner excerpt · CHANGELOG.md (reported line 48)May include surrounding context.

md
### Changed

- **npm stable-promote unblocked.** Plugin npm publishing is consolidated onto `npm-publish.yml` behind a single registered Trusted Publisher (#509), with the `sync-version` tr-cli path + npm@11 fixes (#497). The stable promote now publishes to npm; 3.3.12 had reached ClawHub only.
- **Reinstall-robust install flow** documented — the install always runs `openclaw plugins enable totalreclaw` (idempotent slot-bind) and recovers a reinstall over leftover config via uninstall + orphan-package cleanup (`rm -rf ~/.openclaw/npm/projects/*totalreclaw-totalreclaw*`); `--force` is explicitly never the fix. (#507)

## [3.3.12] — 2026-07-06

Credential Access

High
Category
Privilege Escalation
Confidence
90% confidence
Finding

This entry documents that the pair flow writes full credential material including mnemonic-derived identity metadata to credentials.json, and that registration may proceed automatically against /v1/register. In a memory skill centered on recovery phrases and persistent identity, storing sensitive bootstrap material on disk is high impact if local compromise, overbroad file access, or agent misuse occurs; the changelog also shows the system has historically moved sensitive identity state around during setup.

Content

Scanner excerpt · CHANGELOG.md (reported line 187)May include surrounding context.

md
### Fixed

- **credentials.json now persists `userId` + `salt` at pair time.** Previously, `pair-cli-relay.ts::completePairing` wrote only `{mnemonic}` and deferred `/v1/register` + the `{userId, salt}` fields to the plugin's next `register()` load. When that load failed (Pedro's pop-os SIGUSR1 plugin-skip + various other transients), credentials stayed mnemonic-only and every subsequent operation re-attempted registration but never actually wrote the result. Fix: pair-cli-relay's completePairing now derives `keys = deriveKeys(mnemonic)`, computes `authKeyHash + saltHex`, calls `apiClient.register()` against the relay's `/v1/register` (converting `wss://…` → `https://…`), and writes the full `{mnemonic, salt(base64), userId, scope_address}` object to credentials.json before resolving the WS pair flow. USER_EXISTS in subgraph mode falls back to a deterministic userId derived from the auth-key hash. Pair flow is now self-contained: a successful pair leaves the user fully registered with complete credentials, regardless of subsequent plugin-load behavior.

- **Subgraph "Invalid character 'q' at position 0" eliminated.** Plugin's Smart Account derivation has a fallback: when `deriveSmartAccountAddress(mnemonic)` throws, it set `subgraphOwner = userId`. But the subgraph's `owner` field is typed `Bytes!` (0x-prefixed hex), and userIds (UUIDs from `/v1/register`) often start with non-hex chars like `q`/`r`/`y`, so every subsequent subgraph query returned `Failed to decode Bytes value: Invalid character 'q' at position 0`. Fix: never fall back to `userId` for the Bytes! field. Instead leave `subgraphOwner = null` and emit a clear error explaining that subgraph reads/writes will be skipped this session until SA derivation succeeds. This surfaces the underlying mnemonic issue (or whatever the SA-derivation failure was) rather than masking it as a downstream subgraph decoding error.

Credential Access

High
Category
Privilege Escalation
Confidence
88% confidence
Finding

The documented restart authorization logic allows privileged action based partly on whether credentials.json exists and was paired via the same channel, plus a lone-user heuristic. Tying authorization to local credential presence and weak channel heuristics risks unauthorized restart/control by an attacker who can message the gateway from the expected channel or exploit misbinding, which is especially dangerous in an agent service handling memory and onboarding state.

Content

Scanner excerpt · CHANGELOG.md (reported line 461)May include surrounding context.

md
1. `commands.ownerAllowFrom` explicitly lists invoker → allow
2. `channels.<provider>.allowFrom` explicitly lists invoker → allow
3. Invoker is the same identity this channel session is bound to (paired channel + lone inbound user) → allow
4. `credentials.json` exists AND was paired via this same channel → allow
5. BOTH allow-from configs unset (default) AND only one user has ever messaged this gateway → allow (lone-user heuristic for first-run installs)

Rejection ONLY when explicit config exists and excludes the invoker. Allow → fire `process.kill(process.pid, 'SIGUSR1')` (gateway accepts iff `commands.restart=true`, the default).

Credential Access

High
Category
Privilege Escalation
Confidence
92% confidence
Finding

The changelog documents a --emit-phrase flag that includes the plaintext recovery phrase in JSON output and tells the agent to direct the user to read credentials.json. Any mechanism that can emit the phrase into command output is extremely dangerous in an agent ecosystem because stdout can enter logs, transcripts, or model context, directly compromising the user's encrypted memory vault.

Content

Scanner excerpt · CHANGELOG.md (reported line 1273)May include surrounding context.

md
- `--emit-phrase` — historic opt-in flag (do not invoke via agent shell:
      forbidden by the phrase-safety rule); included plaintext phrase in the
      JSON payload. Default omits the phrase; the agent should direct the
      user to read `~/.totalreclaw/credentials.json` in their terminal.

- **`openclaw totalreclaw pair [mode]` non-interactive flags**:
    - `--json` — emits `{v, sid, url, pin, mode, expires_at_ms, qr_ascii}` to

Credential Access

High
Category
Privilege Escalation
Confidence
87% confidence
Finding

This entry confirms the gateway decrypts the recovery phrase and writes it to credentials.json. Even if intended, centralizing decrypted recovery material on the gateway host creates a high-value target: host compromise, insecure backups, over-permissive file access, or agent-side file exposure would fully compromise the user's memory identity and stored data.

Content

Scanner excerpt · CHANGELOG.md (reported line 1869)May include surrounding context.

md
4. Derives a ChaCha20-Poly1305 AEAD key via HKDF-SHA256 (sid-salted,
   domain-separated with the fixed `totalreclaw-pair-v1` info tag)
5. Encrypts the phrase and POSTs the ciphertext to the gateway
6. Gateway decrypts, writes `credentials.json` (0600 mode), flips
   onboarding state to `active`

The phrase NEVER touches the LLM, the session transcript, the relay

Credential Access

High
Category
Privilege Escalation
Confidence
90% confidence
Finding

This explicitly acknowledges that a compromised gateway host exposes the mnemonic once stored in credentials.json. In the context of a memory provider whose security promise depends on that phrase, storing the recovery phrase on the gateway creates a single-point compromise with full account takeover and loss of memory confidentiality.

Content

Scanner excerpt · CHANGELOG.md (reported line 1945)May include surrounding context.

md
This release does NOT:
- Defend against a rooted / compromised gateway host. If the gateway
  OS is untrustworthy, the mnemonic is exposed the moment it lands in
  `credentials.json`. The design-doc-ratified position (2026-04-20):
  real defense requires a 4.x re-architecture with a memory-less
  server or HSM-backed key management; documented-and-accepted for
  3.3.0.

Credential Access

High
Category
Privilege Escalation
Confidence
86% confidence
Finding

The CLI generate flow writes a fresh recovery phrase to ~/.totalreclaw/credentials.json. Even with terminal-only presentation, persisting the phrase in plaintext on disk remains a high-value secret-storage risk, particularly on shared hosts, synced home directories, backups, or environments where the agent may later gain read access to user files.

Content

Scanner excerpt · CHANGELOG.md (reported line 2207)May include surrounding context.

md
security warning ("this is the only key — write it down", "do NOT
    reuse a blockchain wallet phrase"), then runs a 3-word retype-ack
    challenge to force the user to demonstrate they saved it. On
    success, writes `~/.totalreclaw/credentials.json` (mode `0600`) +
    `~/.totalreclaw/state.json` (mode `0600`).
  * **Import path** prints a "do NOT reuse a wallet phrase" warning,
    accepts the 12-word phrase via hidden stdin (raw-mode TTY echo

Credential Access

High
Category
Privilege Escalation
Confidence
86% confidence
Finding

The import path similarly writes the supplied recovery phrase to credentials.json. This creates the same compromise surface as generated phrases: any host-level read, backup leak, or file-access bug compromises the entire encrypted memory vault.

Content

Scanner excerpt · CHANGELOG.md (reported line 2213)May include surrounding context.

md
accepts the 12-word phrase via hidden stdin (raw-mode TTY echo
    suppression, `*`-masked), normalises whitespace / case /
    zero-width chars, validates the BIP-39 checksum via
    `validateMnemonic`, and writes `credentials.json` + `state.json`
    on success. Invalid phrases are rejected with no on-disk side
    effects.
  * **Skip path** exits without writing anything. Memory tools stay

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

The declared description is about a user-facing memory provider that stores and recalls personal facts with automatic triggers and encrypted decentralized memory behavior. The supplied code does not implement memory capture, recall, encryption, decentralized storage, trigger handling, or recovery phrase restoration. Instead, it is an automated test suite for billing cache behavior and related config synchronization. Its primary purpose, resources accessed, and functionality are materially different from the declared purpose, so this is a clear mismatch.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

The declared description is about a memory provider for storing and recalling user facts. The supplied code chunk instead manages billing metadata persistence in a local filesystem cache and synchronizes runtime configuration values (chain_id and data_edge_address) from that cache. This is a materially different purpose. The code does not implement any memory retrieval, memory saving, encryption, decentralized storage, recovery-phrase handling, or trigger logic described in the declaration. It also accesses local disk for billing cache files, which is unrelated to the stated memory-provider behavior in this chunk.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

The declared description is about a memory provider skill for OpenClaw that stores and recalls user facts, including encrypted/decentralized behavior and specific user-facing triggers. The supplied code chunk is instead a test file for networking-related gateway URL detection functions. It checks detection of Tailscale CGNAT addresses, LAN interfaces, Docker-internal IPs, and composition logic, and explicitly avoids subprocess/network I/O. This is a materially different primary purpose with unrelated functionality and no evidence of the declared memory features.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

The declared description is about a memory subsystem that captures and retrieves user facts automatically. The supplied code does something materially different: it reads local network interface information to determine a suitable host/IP for gateway pairing URLs. It does not implement memory persistence, search, retrieval, background fact capture, recovery phrase restoration, or any stated triggers. While the code is relatively benign and local-only, its primary purpose is unrelated to the declared memory-provider functionality, so this is a clear description/behavior mismatch.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

The declared description is for a privacy-focused memory system integrated with OpenClaw. The supplied code does something entirely different: it is a test suite for a billing/inbound-user tracker that records unique sender IDs by channel and checks persistence and filesystem permissions. While it does write data to disk, that is only for tracker persistence and is not evidence of encrypted decentralized memory. The primary purpose, behavior, and implied triggers are all materially inconsistent with the declared description.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

The declared description is for a conversational memory subsystem with automatic recall and explicit remember/save behavior, plus security properties like end-to-end encryption and decentralization. The supplied code does none of that. It simply reads and writes a local JSON file containing channel -> senderId -> timestamp mappings, and exposes functions to record inbound users and count distinct users per channel. Its documented purpose is to support auth fallback heuristics for /totalreclaw-restart, which is materially different from the declared memory feature. This is a clear description/behavior mismatch.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

The declared description is for a memory provider with user-facing recall and remember behavior, plus encrypted/decentralized storage semantics. The supplied code does none of that. It is a TypeScript test file focused on configuration/env-var parsing and HTTP relay header construction, specifically propagating TOTALRECLAW_SESSION_ID into X-TotalReclaw-Session. This is a materially different primary purpose and introduces an unrelated capability area (QA/session tagging for relay calls) not represented in the description.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

The declared description is for a full memory provider handling storage and recall of user facts, including automatic triggers and encrypted/decentralized behavior. The supplied code does none of that. It is a pure helper function for constructing outbound request headers for relay calls, including a client identifier and optional session tag derived from configuration. This is a materially different primary purpose and reflects unrelated observability/network-tagging behavior rather than memory functionality. Therefore the description does not accurately represent this code chunk.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

The declared description is about a memory provider with automatic fact capture and recall triggers. The supplied code does not implement or invoke any memory functionality. Instead, it is a contract test for a relay/network module, validating that relay.ts owns fetch, avoids process.env reads, and that rpcWithRetry handles JSON-RPC responses correctly. This is a materially different primary purpose and capability set from the declared memory system, so it is a clear mismatch.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

The declared description is for a memory provider that stores and recalls user facts, including recovery phrase restoration and automatic recall/capture behavior. The supplied code does not implement memory features, trigger handling, encryption, decentralized storage, or recall APIs. Instead, it provides generic network transport helpers: a single fetch wrapper plus JSON-RPC request functions with exponential backoff on 429/rate-limit errors. This is a materially different primary purpose and introduces undeclared outbound networking behavior, so the description does not accurately represent the code chunk.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

The declared description is about a memory provider skill with user-facing memory triggers and encrypted decentralized storage/recall behavior. The supplied code chunk does none of that. It is purely a test harness for a CLI registration bug, focused on whether a plugin's registerCli callback throws due to an undeclared variable and whether expected subcommands exist. Its primary purpose is materially different from the declared purpose, so this is a clear mismatch.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding

The description presents a full native memory provider for OpenClaw with automatic recall/capture behavior, setup/recovery triggers, and remember/recall request handling. The supplied code does not implement those behaviors or triggers. Instead, it is a narrow helper for tr export that fetches paginated fact records from a remote subgraph endpoint, decrypts them, and returns a flat export list. While this is related to the same memory system domain, its primary purpose is materially different: bulk export/retrieval for a CLI command, not background memory capture or automatic recall provider logic. The code also performs undeclared outbound authenticated API access for export. Therefore the declared description does not accurately represent this code chunk.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding

The declared description says this skill is an operational memory provider for OpenClaw with automatic recall and background fact capture. The supplied code chunk does not implement those behaviors. It is a test script that reads a CLI source file and runs regex/string assertions about command handling, JSON output, on-chain submission paths, and safety properties. While the comments reference memory_search/memory_get and related memory concepts, the file itself only validates that another file contains certain code patterns. Therefore the actual behavior is materially different from the declared purpose, so this is a clear mismatch.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

The description presents a memory provider plugin with encryption, decentralized storage, automatic recall, and memory-capture triggers. The actual code chunk does none of that. It is purely a regression/config-schema test for openclaw.plugin.json, checking that configSchema includes specific properties and enforces additionalProperties constraints. Its primary purpose is manifest schema validation, not memory management. This is a clear description-behavior mismatch.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

The declared description is for a user-facing memory skill/provider, but the supplied code is only a configuration test suite. Its primary behavior is asserting environment-variable cleanup, warning text, chain ID override logic, and tuning resolution. While names like TotalReclaw and session/config appear related to the broader project, this specific code chunk does not perform the advertised memory functions, does not implement any triggers, and does not access or manage encrypted/decentralized memory. This is a clear description-behavior mismatch.

Content

No source excerpt is available for this finding.

Static analysis

Detected: suspicious.dangerous_exec, suspicious.destructive_delete_command, suspicious.env_credential_access (+2 more)

Shell command execution detected (child_process).

Critical
Code
suspicious.dangerous_exec
Location
dist-esm-smoke.test.ts:94

Shell command execution detected (child_process).

Critical
Code
suspicious.dangerous_exec
Location
postinstall-validate.test.ts:138

Documentation contains a destructive delete command without an explicit confirmation gate.

Warn
Code
suspicious.destructive_delete_command
Location
CHANGELOG.md:48

Documentation contains a destructive delete command without an explicit confirmation gate.

Warn
Code
suspicious.destructive_delete_command
Location
SKILL.md:58

Environment variable access combined with network send.

Critical
Code
suspicious.env_credential_access
Location
llm/llm-client-retry.test.ts:1

File appears to expose a hardcoded API secret or token.

Critical
Code
suspicious.exposed_secret_literal
Location
import-upgrade-cli.test.ts:178

File appears to expose a hardcoded API secret or token.

Critical
Code
suspicious.exposed_secret_literal
Location
llm/llm-client.test.ts:255

File appears to expose a hardcoded API secret or token.

Critical
Code
suspicious.exposed_secret_literal
Location
llm/llm-profile-reader.test.ts:276

File appears to expose a hardcoded API secret or token.

Critical
Code
suspicious.exposed_secret_literal
Location
setup/qa-bug-report.test.ts:78

Sensitive-looking file read is paired with a network send.

Warn
Code
suspicious.potential_exfiltration
Location
pairing/pair-e2e-leak-audit.test.ts:196