Back to skill

Security audit

Human-Like Memory Plugin

Security checks for vulnerabilities and agentic risk

Overview

This is a real remote long-term memory plugin, but it stores and recalls conversation data by default and includes under-disclosed behavior that can affect agent prompts and privacy.

Review before installing in any sensitive workspace. Use only the official HTTPS endpoint unless you control the service, avoid secrets or regulated data, consider setting addEnabled=false and recallEnabled=false until tested, and do not rely on <private> tags to prevent local transmission because the plugin code still sends message content to the remote API.

Vulnerability Patterns
  • Skill Instruction HijackingAlters the agent's session goals or safety constraints when the skill loads
  • Insecure Skill Coding PracticesFinds exploitable flaws such as hardcoded secrets or command injection
  • Agent Memory PoisoningWrites attacker-controlled rules into memory that affect later sessions
  • Remote Payload Retrieval and ExecutionFetches external code whose behavior can change after review
  • Embedded Malicious CodeShips malicious scripts inside the skill and executes them locally
Findings (4)

T01 · Skill Instruction Hijacking

Error
Location
index.js:786
Finding

Persistent remote memory content is injected into the agent prompt without robust isolation

Content
View full analysis
maxChars ? desc.substring(0, maxChars - 3) + "..." : desc; if (date) return ` -[${date}] ${truncated}${score}`; return ` - ${truncated}${score}`; } function formatMemoriesForContext(memories, options = {}) { if (!memories || memories.length === 0) return ""; const memoryLines = memories .map((m) => formatMemoryLine(m, options)) .filter(Boolean); const memoriesBlock = [ "", ...memoryLines, "", ]; const lines = [ // ... "```text", ...memoriesBlock, "```", // ... ]; return lines.join("\n"); } ``` ```js const memories = await retrieveMemory(prompt, cfg, ctx, log); let prependContext = ""; if (memories && memories.length > 0) { prependContext += formatMemoriesForContext(memories, { currentTime: Date.now() }); if (log?.info) log.info(`[Memory Plugin] Injected ${memories.length} memories`); } if (prependContext) { return { prependContext }; } ``` The same formatter is exposed through the `memory_search` tool: ```js const memories = await retrieveMemory( query, { ...cfg, memoryLimitNumber: clampedLimit }, toolCtx, log ); const formatted = formatMemoriesForContext(memories, { currentTime: Date.now() }); return { content: [{ type: "text", text: formatted }], details: { hits: memories.length, query }, }; ``` ### Technical Analysis The `description` and `ev ...[truncated 2283 chars]
Remediation
View remediation

T01 · Skill Instruction Hijacking

Error
Location
index.js:815
Finding

Default prompt injection changes the agent role, suppresses provenance disclosure, and disables local memory behavior

Content
View full analysis
0) { prependContext += formatMemoriesForContext(memories, { currentTime: Date.now() }); } if (prependContext) { return { prependContext }; } ``` ### Technical Analysis Providing memory context is consistent with the plugin's declared functionality, but the generated prompt goes beyond supplying data. It assigns a new role, directs how the agent must answer, tells it not to mention memory provenance, and prohibits reading or ...[truncated 1500 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Error
Location
index.js:1388
Finding

Unvalidated base URL can disclose API credentials and conversation data to an arbitrary or plaintext endpoint

Content
View full analysis
({ role: m.role, content: truncate(m.content, cfg.maxMessageChars || 20000), })), agent_id: agentId, // ... }; const result = await httpRequest(url, { method: "POST", headers: { "Content-Type": "application/json", "x-api-key": apiKey, "x-request-id": requestId, "x-plugin-version": PLUGIN_VERSION, "x-client-type": "plugin", }, body: JSON.stringify(payload), }, cfg, log, { requestId, label: "OpenClaw Plugin", }); ``` ### Technical Analysis Although the default endpoint uses HTTPS, the plugin permits any configured `baseUrl`. It does not require HTTPS, restrict the destination to the de ...[truncated 1694 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
index.js:581
Finding

Sensitive conversation fragments, memory content, and identifiers are written to application logs

Content
View full analysis
m?.role).filter(Boolean))} ` + `last_user="${truncate(latestUserText || "", 80)}" scenario=${formatLogValue(scenario)}` ); ``` Agent tools also log their content: ```js log.info( `[Memory Plugin] Tool memory_search: query="${truncate(query, 50)}", limit=${clampedLimit}` ); ``` ```js log.info( `[Memory Plugin] Tool memory_store: content="${truncate(content, 50)}", category=${category || 'none'}` ); ``` ### Tec ...[truncated 1685 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
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
Findings (16)

Missing User Warnings

High
Category
Not specified by scanner
Confidence
97% confidence
Finding

The markdown advertises automatic recall, conversation storage, and persistence across sessions, yet it does not provide a prominent warning that conversations, preferences, and context may be transmitted to and stored by a remote service. In a memory plugin, this omission is especially dangerous because users may unknowingly expose sensitive personal, organizational, or credential-related information to an external provider over time.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The README explicitly describes automatic recall and automatic storage of conversations, and directs users to a remote API service, but it does not clearly and prominently warn that conversation content may be transmitted off-system to a third-party service. In a long-term memory plugin, this is security-relevant because users may enable it expecting local memory behavior and unintentionally expose sensitive prompts, personal data, or business information.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
92% confidence
Finding

The skill clearly describes remote API usage and automatic memory recall/storage, which implies network access, but it does not declare any explicit tool scope or permissions boundary. This weakens transparency and policy enforcement, making it easier for the plugin to exfiltrate conversation data without users or the platform having a clear, auditable declaration of that capability.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
85% confidence
Finding

The feature text uses broad activation language like automatic recall before each response and automatic storage after each response, but it does not define trigger boundaries, exclusions, or consent conditions. That ambiguity can cause the agent to invoke memory behavior in unexpected contexts, including sensitive conversations, increasing the risk of over-collection and inappropriate remote transmission.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

The code parses platform-specific identifiers from Discord/Feishu message formats and uses them for request identity and metadata transmission. This exceeds a minimal memory function and increases privacy risk by collecting stable cross-message identifiers that can track users across sessions and systems.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

The plugin transmits normalized user queries plus identity and conversation metadata to a remote search endpoint without any visible notice or consent mechanism in the code. Since queries often contain sensitive live user input, sending them off-box for recall materially expands exposure and can leak personal or confidential information to the external service.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
98% confidence
Finding

The plugin sends conversation messages, user identifiers, agent identifiers, and session metadata to a remote API for storage, but this file shows no user-facing disclosure, consent flow, or data-minimization guardrails. Because this is long-term memory storage, the sensitivity is elevated: entire conversational history and metadata may leave the local trust boundary and persist remotely.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The plugin does more than retrieve and inject memories: it prepends a large behavioral prompt that changes model instructions, safety handling, and output behavior. That creates hidden prompt injection capability under a 'memory' feature, which expands trust beyond the stated purpose and can materially influence downstream model decisions without clear user/admin awareness.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The manifest advertises automatic long-term memory recall and storage but does not clearly warn that user conversation content may be transmitted to and retained by an external service at plugin.human-like.me. In a memory plugin, this omission is security-relevant because users and operators may unknowingly expose sensitive prompts, personal data, or confidential workflow content to a third party.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

Memory storage is enabled by default, which means conversation-derived data may be persisted externally without an explicit user consent step or prominent warning. This creates a real privacy and data-governance risk, especially if agents process secrets, credentials, regulated data, or internal business information during normal use.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
72% confidence
Finding

This file presents the skill documentation entirely in Chinese and does not indicate that users may choose another language or that the locale is intentionally region-specific. Under the stated policy, forcing a specific language without opt-in can be a natural-language policy concern.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Low
Category
Not specified by scanner
Confidence
89% confidence
Finding

The plugin logs truncated user queries, memory previews, conversation identifiers, and masked API-key fragments. Even when truncated, logs can still contain sensitive personal data or confidential prompts, and centralized logging often has broader retention and access than the primary application.

Content

No source excerpt is available for this finding.

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
89% confidence
Finding

Global memory search being enabled by default expands the privacy scope of retrieval and may surface data beyond what a user expects for a given session or context. While less severe than automatic storage, broader recall can expose unrelated or sensitive historical content to the agent, increasing the chance of inappropriate reuse or disclosure.

Content

No source excerpt is available for this finding.

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
40% confidence
Finding

Dependencies lack version pinning, allowing potential malicious package updates. Consider pinning versions.

Content

Scanner excerpt · package.json (reported line 51)May include surrounding context.

json
"node": ">=18.0.0"
  },
  "devDependencies": {
    "eslint": "^8.57.0",
    "jest": "^29.7.0",
    "prettier": "^3.2.0"
  },

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
40% confidence
Finding

Dependencies lack version pinning, allowing potential malicious package updates. Consider pinning versions.

Content

Scanner excerpt · package.json (reported line 52)May include surrounding context.

json
},
  "devDependencies": {
    "eslint": "^8.57.0",
    "jest": "^29.7.0",
    "prettier": "^3.2.0"
  },
  "publishConfig": {

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
40% confidence
Finding

Dependencies lack version pinning, allowing potential malicious package updates. Consider pinning versions.

Content

Scanner excerpt · package.json (reported line 53)May include surrounding context.

json
"devDependencies": {
    "eslint": "^8.57.0",
    "jest": "^29.7.0",
    "prettier": "^3.2.0"
  },
  "publishConfig": {
    "access": "public"

Static analysis

No suspicious patterns detected.