Back to skill

Security audit

Openclaw Memory Stack

Security checks for vulnerabilities and agentic risk

Overview

This memory skill mostly matches its stated purpose, but its installer and runtime use unsafe command execution paths and cloud fallback behavior that deserve careful review before installation.

Install only if you are comfortable with a persistent memory plugin that can read and write OpenClaw memory, change OpenClaw plugin configuration, auto-capture conversation-derived facts, run local shell tools, install third-party dependencies, and optionally send excerpts to a configured or env-key cloud LLM. Review or disable the installer/update paths and avoid setting cloud API keys unless you intend remote fact extraction.

Vulnerability Patterns
  • Remote Payload Retrieval and ExecutionFetches external code whose behavior can change after review
  • Insecure DependenciesIntroduces malicious components through unsafe dependency sources
  • 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 (6)

T03 · Remote Payload Retrieval and Execution

Error
Location
install.sh:417
Finding

Unverified Remote Scripts Are Piped Directly into Shell Interpreters

Content
View full analysis
/dev/null; then ok "bun: v$(bun --version 2>/dev/null)" return 0 fi # Bun may be installed but not in PATH (common on WSL after fresh install) if [ -x "$HOME/.bun/bin/bun" ]; then export BUN_INSTALL="$HOME/.bun" export PATH="$BUN_INSTALL/bin:$PATH" ok "bun: v$(bun --version 2>/dev/null) (added to PATH)" else info "Installing Bun..." curl -fsSL https://bun.sh/install | bash 2>/dev/null export BUN_INSTALL="$HOME/.bun" export PATH="$BUN_INSTALL/bin:$PATH" ok "bun: v$(bun --version 2>/dev/null)" fi ``` ```sh install_uv() { if command -v uv &>/dev/null; then ok "uv: $(uv --version 2>/dev/null)" return 0 fi info "Installing uv (Python manager)..." curl -LsSf https://astral.sh/uv/install.sh | sh 2>/dev/null export PATH="$HOME/.local/bin:$PATH" ok "uv: $(uv --version 2>/dev/null)" } ``` ### Technical Analysis The installer downloads mutable content from `bun.sh` and `astral.sh` and immediately passes it to `bash` or `sh`. No pinned version, cryptographic signature, independently trusted checksum, or local inspection is used before execution. HTTPS protects the transport connection but does not protect against compromise of the upstream website, CDN, DNS infrastructure, release account, or the remote script itself. The effective code executed by the audited project can therefore change after the project has been reviewed. Installing Bun and uv supports the declared backend functionality, but executing mutable remote shell scripts is not the minimum privilege or minimum-risk mechanism needed to install those dependencies. ### Attack Path 1. An attacker compromises an upstream domain, ...[truncated 989 chars]
Remediation
View remediation
/dev/null`. ]]>

T03 · Remote Payload Retrieval and Execution

Error
Location
install.sh:153
Finding

Self-Update Mechanism Executes Releases Trusted Solely by a Mutable Server

Content
View full analysis
/dev/null || echo "") if [[ -z "$EXPECTED_SHA" ]]; then fail "Could not fetch checksum from server — aborting for safety" fail " If this persists, contact support@apptah.com" rm -f "$TMP_TAR" exit 1 fi if command -v shasum &>/dev/null; then ACTUAL_SHA=$(shasum -a 256 "$TMP_TAR" | cut -d' ' -f1) elif command -v sha256sum &>/dev/null; then ACTUAL_SHA=$(sha256sum "$TMP_TAR" | cut -d' ' -f1) else fail "Neither shasum nor sha256sum found — cannot verify download integrity" rm -f "$TMP_TAR" exit 1 fi if [[ "$ACTUAL_SHA" != "$EXPECTED_SHA" ]]; then fail "Checksum mismatch — download may be corrupted or tampered" fail " Expected: $EXPECTED_SHA" fail " Actual: $ACTUAL_SHA" rm -f "$TMP_TAR" exit 1 fi ``` ```sh chmod +x "$EXTRACTED_DIR/install.sh" exec "$EXTRACTED_DIR/install.sh" --upgrade --from-self ``` ### Technical Analysis The update archive and its expected SHA-256 value are obtained from the same configurable release service. This detects accidental corruption, but it does not authenticate the publisher. An attacker controlling the service can su ...[truncated 1368 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Error
Location
plugin/dist/index.mjs:15
Finding

QMD Search Query Is Interpolated into a Shell Command

Content
View full analysis
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Error
Location
lib/self-organize.sh:40
Finding

Configuration Values Are Injected Directly into Dynamically Generated Python Source

Content
View full analysis
Remediation
View remediation

T08 · Insecure Dependencies

Error
Location
install.sh:528
Finding

Installer Automatically Executes Unpinned Third-Party Dependency Commands

Content
View full analysis
/dev/null || echo "") [[ -z "$install_hint" ]] && continue info "Installing $bname..." if bash -c "$install_hint" 2>&1 | tail -3; then ok "$bname installed" else warn "$bname: install failed (non-fatal)" warn " hint: $install_hint" fi ``` Automatically executed dependency definitions include: ```json "install_hint": "command -v openclaw &>/dev/null && openclaw plugins install @martian-engineering/lossless-claw || echo 'openclaw CLI not in PATH — install lossless-claw after PATH is set'" ``` ```json "install_hint": "command -v docker &>/dev/null && docker pull nowledge/nowledge-mem:latest || echo 'nowledge requires Docker — install manually: https://github.com/nowledge-co/nowledge-mem'" ``` ```json "install_hint": "$HOME/.openclaw/venv/bin/pip install openviking" ``` ```json "install_hint": "bun install -g @tobilu/qmd" ``` ### Technical Analysis The installer treats an `install_hint` as executable shell code and runs it through `bash -c`. Several dependencies are identified only by an unpinned package name, and the Docker image explicitly uses the mutable `latest` tag. Consequently, the code installed on a future date may differ from the code available during this audit. Package-manager lifecycle scripts and plugin installation hooks can execute code during installation. A compromised registry account, malicious replacement release, or mutable image can therefore introduce arbitrary behavior. The capability files are part of the package and are not shown to be attacker-writable during normal installation, so the primary confirmed risk is unsafe dependency resolution rather than direct runtime ...[truncated 1014 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
plugin/lib/llm.mjs:71
Finding

User-Configured Plaintext LLM Endpoints Can Receive API Keys and Conversation Content

Content
View full analysis
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
  • Tool MisuseTool Parameter Abuse, Chaining Abuse, Unsafe Defaults
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
Findings (111)

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

The skill heavily markets itself as local-only and cloud-free, but the metadata explicitly documents remote endpoints including api.openai.com and an update-check host. That mismatch can mislead users into granting trust or installing the skill under incorrect assumptions about network behavior and data exposure.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding

The skill heavily markets itself as local-only and cloud-free, but the metadata explicitly documents remote endpoints including api.openai.com and an update-check host. That mismatch can mislead users into granting trust or installing the skill under incorrect assumptions about network behavior and data exposure.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
90% confidence
Finding

The skill heavily markets itself as local-only and cloud-free, but the metadata explicitly documents remote endpoints including api.openai.com and an update-check host. That mismatch can mislead users into granting trust or installing the skill under incorrect assumptions about network behavior and data exposure.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

The skill heavily markets itself as local-only and cloud-free, but the metadata explicitly documents remote endpoints including api.openai.com and an update-check host. That mismatch can mislead users into granting trust or installing the skill under incorrect assumptions about network behavior and data exposure.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
90% confidence
Finding

The skill heavily markets itself as local-only and cloud-free, but the metadata explicitly documents remote endpoints including api.openai.com and an update-check host. That mismatch can mislead users into granting trust or installing the skill under incorrect assumptions about network behavior and data exposure.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
96% confidence
Finding

The skill heavily markets itself as local-only and cloud-free, but the metadata explicitly documents remote endpoints including api.openai.com and an update-check host. That mismatch can mislead users into granting trust or installing the skill under incorrect assumptions about network behavior and data exposure.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
91% confidence
Finding

The skill heavily markets itself as local-only and cloud-free, but the metadata explicitly documents remote endpoints including api.openai.com and an update-check host. That mismatch can mislead users into granting trust or installing the skill under incorrect assumptions about network behavior and data exposure.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
88% confidence
Finding

The skill heavily markets itself as local-only and cloud-free, but the metadata explicitly documents remote endpoints including api.openai.com and an update-check host. That mismatch can mislead users into granting trust or installing the skill under incorrect assumptions about network behavior and data exposure.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
94% confidence
Finding

The skill heavily markets itself as local-only and cloud-free, but the metadata explicitly documents remote endpoints including api.openai.com and an update-check host. That mismatch can mislead users into granting trust or installing the skill under incorrect assumptions about network behavior and data exposure.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
93% confidence
Finding

The skill heavily markets itself as local-only and cloud-free, but the metadata explicitly documents remote endpoints including api.openai.com and an update-check host. That mismatch can mislead users into granting trust or installing the skill under incorrect assumptions about network behavior and data exposure.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding

The skill heavily markets itself as local-only and cloud-free, but the metadata explicitly documents remote endpoints including api.openai.com and an update-check host. That mismatch can mislead users into granting trust or installing the skill under incorrect assumptions about network behavior and data exposure.

Content

No source excerpt is available for this finding.

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
./install.sh

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
./install.sh

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
95% 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 · install.sh (reported line 283)May include surrounding context.

sh
#   dist/index.mjs imports ./lib/llm.mjs  → $EXT_DIR/dist/lib/
  #   dist/index.mjs imports ../lib/llm.mjs → $EXT_DIR/lib/
  if [[ -d "$SCRIPT_DIR/plugin/lib" ]]; then
    rm -rf "$EXT_DIR/lib" "$EXT_DIR/dist/lib"
    cp -R "$SCRIPT_DIR/plugin/lib" "$EXT_DIR/lib"
    cp -R "$SCRIPT_DIR/plugin/lib" "$EXT_DIR/dist/lib"
  fi

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
85% 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 · install.sh (reported line 380)May include surrounding context.

sh
elif command -v yum &>/dev/null; then
    $_sudo yum install -y git --quiet 2>/dev/null && ok "git installed" && return 0
  elif command -v pacman &>/dev/null; then
    $_sudo pacman -Sy --noconfirm git 2>/dev/null && ok "git installed" && return 0
  fi
  warn "Could not auto-install git. Install manually: sudo apt-get install git"
  return 1

External Script Fetching

High
Category
Supply Chain
Confidence
99% confidence
Finding

Fetching and executing an external script from bun.sh with curl | bash exposes the installer to direct supply-chain compromise. In the context of an installer that already modifies user configuration and installs dependencies, a compromised fetch path would yield full arbitrary code execution with significant reach on the host.

Content

Scanner excerpt · install.sh (reported line 428)May include surrounding context.

sh
ok "bun: v$(bun --version 2>/dev/null) (added to PATH)"
  else
    info "Installing Bun..."
    curl -fsSL https://bun.sh/install | bash 2>/dev/null
    export BUN_INSTALL="$HOME/.bun"
    export PATH="$BUN_INSTALL/bin:$PATH"
    ok "bun: v$(bun --version 2>/dev/null)"

Context-Inappropriate Capability

High
Category
Not specified by scanner
Confidence
99% confidence
Finding

Piping curl output directly into bash executes remote code without integrity verification, pinning, or review. A compromised upstream server, TLS interception point, or supply-chain incident would give an attacker immediate code execution on the user's machine during installation.

Content

No source excerpt is available for this finding.

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
95% 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 · install.sh (reported line 494)May include surrounding context.

sh
for skill_dir in "$SCRIPT_DIR/skills/memory-"*; do
  [[ -d "$skill_dir" ]] || continue
  skill_name=$(basename "$skill_dir")
  rm -rf "$INSTALL_ROOT/skills/$skill_name"
  cp -r "$skill_dir" "$INSTALL_ROOT/skills/"
done

External Script Fetching

High
Category
Supply Chain
Confidence
90% confidence
Finding

Remote code is downloaded and executed. This bypasses code review and could introduce malicious code.

Content

Scanner excerpt · install.sh (reported line 518)May include surrounding context.

sh
BUN_READY=true
  else
    warn "bun install failed — qmd backend will be skipped"
    warn "  retry manually: curl -fsSL https://bun.sh/install | bash"
  fi
fi

Context-Inappropriate Capability

High
Category
Not specified by scanner
Confidence
99% confidence
Finding

The installer reads install_hint from each capability.json and executes it with bash -c, making the executed command fully data-driven. Any modified or malicious backend metadata can run arbitrary shell commands during installation, which is especially dangerous because this script also prepares PATH and may already have elevated privileges or user trust.

Content

No source excerpt is available for this finding.

Missing User Warnings

High
Category
Not specified by scanner
Confidence
99% confidence
Finding

The script executes backend-provided install hints as shell commands but does not disclose that arbitrary commands from bundled metadata will run. This makes the installer effectively a command runner for each backend and sharply increases the blast radius if any backend definition is malicious or tampered with.

Content

No source excerpt is available for this finding.

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
95% 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 · install.sh (reported line 628)May include surrounding context.

sh
#   ../lib/llm.mjs → $EXT_DIR/lib/llm.mjs
    # Both must exist for the bundled plugin to load.
    if [[ -d "$SCRIPT_DIR/plugin/lib" ]]; then
      rm -rf "$EXT_DIR/dist/lib" "$EXT_DIR/lib"
      cp -R "$SCRIPT_DIR/plugin/lib" "$EXT_DIR/dist/lib"
      cp -R "$SCRIPT_DIR/plugin/lib" "$EXT_DIR/lib"
    fi

Ssd 3

High
Category
Not specified by scanner
Confidence
97% confidence
Finding

The extraction prompt explicitly instructs the model to pull out preferences, decisions, architectural choices, configuration details, and bug causes for later persistence. That materially increases risk because configuration details and root-cause notes often contain high-value operational or security information, and the feature is purpose-built to preserve exactly those details beyond the original conversation.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

High
Category
Not specified by scanner
Confidence
98% confidence
Finding

The file hardcodes OpenAI as the default endpoint even though the skill description promises 'No cloud API'. That mismatch can cause users to run the plugin under false assumptions and may lead to sensitive memory or prompt data being sent to a remote third party when local-only behavior was expected.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

High
Category
Not specified by scanner
Confidence
99% confidence
Finding

The provider chain silently falls back to OpenAI whenever OPENCLAW_LLM_API_KEY or OPENAI_API_KEY is present, despite the plugin being marketed as local and cloud-free. In a memory plugin, this is especially risky because stored facts, prompts, and embeddings may contain sensitive cross-session or cross-agent data that users did not intend to leave the machine.

Content

No source excerpt is available for this finding.

Static analysis

Detected: suspicious.dangerous_exec

Shell command execution detected (child_process).

Critical
Code
suspicious.dangerous_exec
Location
plugin/dist/index.mjs:15