Back to skill

Security audit

ollama-memory-embeddings

Security checks for vulnerabilities and agentic risk

Overview

The skill’s purpose is coherent, but it has review-worthy safety flaws that can change local state unexpectedly and persistently alter OpenClaw settings.

Review before installing. The skill is not clearly malicious, but only use it if you are comfortable with it editing OpenClaw config, pulling or creating Ollama models, and optionally installing a launchd watchdog. Avoid --dry-run as a trusted non-mutating approval step, avoid --install-watchdog until the plist interval validation is fixed, and keep a separate backup of ~/.openclaw/openclaw.json.

Vulnerability Patterns
  • 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
  • Embedded Malicious CodeShips malicious scripts inside the skill and executes them locally
Findings (3)

T09 · Insecure Skill Coding Practices

Error
Location
lib/config.js:43
Finding
Configuration Read or Parse Failures Cause Destructive Overwrite<![CDATA[ ## Vulnerability Details **File Location**: `lib/config.js:43-52`, `lib/config.js:183-191` **Vulnerability Type**: Fail-open configuration parsing and destructive overwrite **Risk Level**: High ### Vulnerable Code ```javascript function readConfig(path) { try { return JSON.parse(fs.readFileSync(path, "utf8")); } catch (_) { return {}; } } function writeConfig(path, cfg) { fs.writeFileSync(path, JSON.stringify(cfg, null, 2)); } ``` ```javascript if (cmd === "apply-enforce") { const configPath = process.argv[3]; const model = process.argv[4] || ""; const base = process.argv[5] || ""; const apiKey = process.argv[6] || ""; if (!configPath || !model || !base || !apiKey) throw new Error("missing required args"); const cfg = readConfig(configPath); const plan = planEnforce(cfg, model, base, apiKey); writeConfig(configPath, plan.cfg); process.exit(0); } ``` ### Technical Analysis `readConfig()` catches every filesystem and JSON parsing error and returns an empty object. This makes materially different conditions indistinguishable: - The configuration file does not exist. - The configuration contains malformed JSON. - The process lacks permission to read it. - A transient filesystem error occurred. - The file changed during the read. - The path points to an unexpected filesystem object. When `apply-enforce` receives the empty object, it generates a new configuration and writes it directly over the selected path. Existing unrelated OpenClaw settings can consequently be removed. The write is also performed directly with `fs.writeFileSync()` rather than an atomic same-directory temporary file followed by `rename()`. A crash, interruption, or storage failure during the write can leave the configuration truncated or partially written. Although the shell enforcer normally creates a backup before applying changes, that backup does not make the live overwrite safe and may preserve only the already malformed state. ### Atta ...[truncated 1259 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Fail closed on read and parsing failures: - Treat `ENOENT` separately if creating a new configuration is intended. - Reject malformed JSON, permission failures, and other I/O errors. - Display an actionable error and leave the existing file untouched. 2. Validate the parsed root value: - Require a non-null plain object. - Reject arrays, scalar JSON values, and structurally invalid configuration. 3. Implement atomic writes: - Create a temporary file in the same directory. - Set restrictive permissions. - Write and flush the complete JSON document. - Atomically rename the temporary file over the destination. - Clean up the temporary file on failure. 4. Re-read or verify file identity after acquiring the lock to reduce time-of-check/time-of-use races. 5. Preserve permissions and ownership when replacing an existing configuration. 6. Validate the completed temporary configuration before replacing the live file. Example approach: ```javascript function readConfigStrict(configPath) { const raw = fs.readFileSync(configPath, "utf8"); const cfg = JSON.parse(raw); if (!cfg || typeof cfg !== "object" || Array.isArray(cfg)) { throw new Error("configuration root must be a JSON object"); } return cfg; } ``` ]]>

T09 · Insecure Skill Coding Practices

Warning
Location
install.sh:320
Finding
Dry-Run Mode Performs Persistent Ollama Model Operations<![CDATA[ ## Vulnerability Details **File Location**: `install.sh:320-371` **Vulnerability Type**: Broken dry-run safety boundary and unexpected state mutation **Risk Level**: Medium ### Vulnerable Code ```bash if [ "$WILL_IMPORT" = "yes" ]; then echo "Importing local GGUF into Ollama as: ${IMPORT_MODEL_NAME}" if import_gguf_to_ollama "$LOCAL_GGUF" "$IMPORT_MODEL_NAME"; then MODEL_TO_USE="$IMPORT_MODEL_NAME" echo "Import succeeded." else echo "WARNING: import failed. Falling back to pulling '${MODEL}'." fi fi # ── Ensure model is available in Ollama ────────────────────────────────────── if ! model_exists_in_ollama "$MODEL_TO_USE"; then echo "Pulling Ollama model: ${MODEL_TO_USE}" ollama pull "$MODEL_TO_USE" fi # Normalize for config and API calls MODEL_TO_USE_CANON="$(normalize_model "$MODEL_TO_USE")" echo "Using model: ${MODEL_TO_USE_CANON}" # ── Dry run plan ───────────────────────────────────────────────────────────── if [ "$DRY_RUN" -eq 1 ]; then echo "" echo "DRY RUN: no files or services will be changed." echo "Would modify:" echo " - ${SKILLS_DIR}/ (skill files)" echo " - ${CONFIG_PATH} (OpenClaw config)" echo "Would set memorySearch keys:" echo " - provider: openai" echo " - model: ${MODEL_TO_USE_CANON}" echo " - remote.baseUrl: http://127.0.0.1:11434/v1/" echo " - remote.apiKey: (set)" echo "Would run:" echo " - ${SKILLS_DIR}/enforce.sh --model ${MODEL_TO_USE_CANON} --openclaw-config ${CONFIG_PATH} --base-url http://127.0.0.1:11434/v1/" if [ "$RESTART_GATEWAY" = "yes" ]; then echo " - gateway restart" else echo " - gateway restart skipped (default)" fi if [ "$INSTALL_WATCHDOG" -eq 1 ]; then echo " - watchdog install via launchd (${WATCHDOG_INTERVAL}s)" else echo " - watchdog install skipped (default)" fi if [ "$IMPORT_LOCAL_GGUF" = "no" ]; then echo " - local GGUF scan/import skipped (default)" else echo " - local GGUF import mode: ${IMPORT_LOCA ...[truncated 1966 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Move the dry-run decision ahead of every state-changing operation, including: - `ollama create` - `ollama pull` - File creation and copying - Configuration backup and enforcement - Watchdog installation - Gateway restart - Memory reindexing 2. Separate planning from execution: - Determine whether a model exists. - Determine whether import or pull would be required. - Print the complete plan. - Exit before invoking any mutating command when `DRY_RUN=1`. 3. Do not require state-changing preparation to produce a plan. For example: ```bash if ! model_exists_in_ollama "$MODEL_TO_USE"; then if [ "$DRY_RUN" -eq 1 ]; then echo "Would pull Ollama model: ${MODEL_TO_USE}" else ollama pull "$MODEL_TO_USE" fi fi ``` 4. Apply the same guard to GGUF import: ```bash if [ "$WILL_IMPORT" = "yes" ]; then if [ "$DRY_RUN" -eq 1 ]; then echo "Would import ${LOCAL_GGUF} as ${IMPORT_MODEL_NAME}" else import_gguf_to_ollama "$LOCAL_GGUF" "$IMPORT_MODEL_NAME" fi fi ``` 5. Add automated tests that snapshot Ollama state and filesystem state before and after every documented dry-run combination. ]]>

T09 · Insecure Skill Coding Practices

Error
Location
watchdog.sh:63
Finding
Unvalidated Watchdog Interval Permits LaunchAgent Plist Injection<![CDATA[ ## Vulnerability Details **File Location**: `watchdog.sh:63-70`, `watchdog.sh:154-200` **Vulnerability Type**: XML/plist injection into a persistent launchd job **Risk Level**: High ### Vulnerable Code ```bash while [ $# -gt 0 ]; do case "$1" in --model) MODEL="$2"; shift 2 ;; --base-url) BASE_URL="$2"; shift 2 ;; --openclaw-config) CONFIG_PATH="$2"; shift 2 ;; --interval-sec) INTERVAL_SEC="$2"; shift 2 ;; --once) ONCE=1; shift ;; --restart-on-heal) RESTART_ON_HEAL=1; shift ;; --install-launchd) INSTALL_LAUNCHD=1; shift ;; --uninstall-launchd) UNINSTALL_LAUNCHD=1; shift ;; --quiet) QUIET=1; shift ;; --help|-h) usage; exit 0 ;; *) echo "Unknown option: $1"; usage; exit 1 ;; esac done ``` ```bash reject_newlines "MODEL" "${MODEL}" reject_newlines "BASE_URL" "${BASE_URL}" reject_newlines "CONFIG_PATH" "${CONFIG_PATH}" reject_newlines "STDOUT_LOG" "${STDOUT_LOG}" reject_newlines "STDERR_LOG" "${STDERR_LOG}" reject_newlines "PLIST_NAME" "${PLIST_NAME}" reject_newlines "SKILL_DIR" "${SKILL_DIR}" reject_newlines "shell_bin" "${shell_bin}" local esc_plist_name esc_shell_bin esc_skill_dir esc_model esc_base_url esc_config_path esc_stdout_log esc_stderr_log esc_plist_name="$(xml_escape "${PLIST_NAME}")" esc_shell_bin="$(xml_escape "${shell_bin}")" esc_skill_dir="$(xml_escape "${SKILL_DIR}")" esc_model="$(xml_escape "${MODEL}")" esc_base_url="$(xml_escape "${BASE_URL}")" esc_config_path="$(xml_escape "${CONFIG_PATH}")" esc_stdout_log="$(xml_escape "${STDOUT_LOG}")" esc_stderr_log="$(xml_escape "${STDERR_LOG}")" local restart_flag_xml="" if [ "$RESTART_ON_HEAL" -eq 1 ]; then restart_flag_xml=" <string>--restart-on-heal</string>" fi cat > "$PLIST_PATH" <<EOF <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>Label</key> <string>${esc_plist_name}</string> <key>ProgramArguments</ke ...[truncated 2846 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Validate the interval as a decimal integer before any plist generation: ```bash validate_interval() { if ! [[ "$INTERVAL_SEC" =~ ^[0-9]+$ ]]; then log_err "--interval-sec must be a positive decimal integer." exit 1 fi if [ "$INTERVAL_SEC" -lt 1 ] || [ "$INTERVAL_SEC" -gt 86400 ]; then log_err "--interval-sec must be between 1 and 86400." exit 1 fi } ``` 2. Invoke validation immediately after argument parsing and before both continuous execution and launchd installation. 3. Avoid constructing plist XML through raw string interpolation: - Generate the plist through a structured property-list API where possible. - Alternatively, create a fixed template and use a plist-aware tool to set typed values. 4. After generation, inspect the parsed plist and enforce an allowlist: - Exactly one expected `Label`. - Exactly one expected `ProgramArguments` array. - A numeric `StartInterval`. - No unexpected keys such as alternative programs, shell commands, or environment manipulation. 5. Write the plist atomically with restrictive user-only permissions before loading it. 6. Add adversarial tests for XML metacharacters, closing tags, quotes, newlines, negative values, zero, oversized integers, and non-numeric values. ]]>
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Rogue AgentSelf-Modification, Session Persistence
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
Findings (47)

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding
Continuous watchdog monitoring, automatic drift remediation, and installation of a macOS `launchd` job introduce persistence and autonomous system modification beyond a simple one-time configuration change. In a skill ecosystem, undeclared persistence mechanisms are security-relevant because they can continue changing user configuration, create logs, and restart services without ongoing user awareness.

Tp4

High
Category
MCP Tool Poisoning
Confidence
84% confidence
Finding
Continuous watchdog monitoring, automatic drift remediation, and installation of a macOS `launchd` job introduce persistence and autonomous system modification beyond a simple one-time configuration change. In a skill ecosystem, undeclared persistence mechanisms are security-relevant because they can continue changing user configuration, create logs, and restart services without ongoing user awareness.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding
Continuous watchdog monitoring, automatic drift remediation, and installation of a macOS `launchd` job introduce persistence and autonomous system modification beyond a simple one-time configuration change. In a skill ecosystem, undeclared persistence mechanisms are security-relevant because they can continue changing user configuration, create logs, and restart services without ongoing user awareness.

Tp4

High
Category
MCP Tool Poisoning
Confidence
92% confidence
Finding
Continuous watchdog monitoring, automatic drift remediation, and installation of a macOS `launchd` job introduce persistence and autonomous system modification beyond a simple one-time configuration change. In a skill ecosystem, undeclared persistence mechanisms are security-relevant because they can continue changing user configuration, create logs, and restart services without ongoing user awareness.

Ae1

High
Category
analysis-evasion
Content
- Adds an idempotent drift-enforcement command (`enforce.sh`)
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

External Script Fetching

High
Category
Supply Chain
Content
TMP_BODY="$(mktemp)"
TMP_ERR="$(mktemp)"
set +e
HTTP_CODE="$(curl -sS -o "$TMP_BODY" -w "%{http_code}" \
  -H "Content-Type: application/json" \
  -d "$PAYLOAD" \
  "$EMBED_URL" 2>"$TMP_ERR")"
Confidence
90% confidence
Finding
Remote code is downloaded and executed. This bypasses code review and could introduce malicious code.

External Transmission

Medium
Category
Data Exfiltration
Content
```
3. **Direct endpoint check:**
   ```bash
   curl -s -X POST http://127.0.0.1:11434/v1/embeddings \
     -H "Content-Type: application/json" \
     -d '{"model":"nomic-embed-text:latest","input":"test"}' | head -c 200
   ```
Confidence
60% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Session Persistence

Medium
Category
Rogue Agent
Content
- `install.sh` - install and configure memory embeddings provider
- `verify.sh` - endpoint and model verification only
- `enforce.sh` - idempotent config enforcement with lock protection
- `watchdog.sh` - optional drift healing and optional launchd install
- `audit.sh` - read-only report (no mutation)
- `uninstall.sh` - best-effort revert using latest config backup
Confidence
80% confidence
Finding
Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.

Session Persistence

Medium
Category
Rogue Agent
Content
- `install.sh` - install and configure memory embeddings provider
- `verify.sh` - endpoint and model verification only
- `enforce.sh` - idempotent config enforcement with lock protection
- `watchdog.sh` - optional drift healing and optional launchd install
- `audit.sh` - read-only report (no mutation)
- `uninstall.sh` - best-effort revert using latest config backup
Confidence
80% confidence
Finding
Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.

Lp3

Medium
Category
MCP Least Privilege
Confidence
70% confidence
Finding
Without declared permissions the skill's intent is opaque and cannot be validated.

Session Persistence

Medium
Category
Rogue Agent
Content
- `model = <selected model>:latest`
  - `remote.baseUrl = "http://127.0.0.1:11434/v1/"`
  - `remote.apiKey = "ollama"` (required by client, ignored by Ollama)
- Performs a post-write config sanity check (reads back and validates JSON)
- Optionally restarts the OpenClaw gateway (with detection of available
  restart methods: `openclaw gateway restart`, systemd, launchd)
- Optional memory reindex during install (`openclaw memory index --force --verbose`)
Confidence
84% confidence
Finding
The skill writes persistent configuration, may restart the OpenClaw gateway, and can install drift-enforcement/watchdog components, which together create durable changes across sessions. Even though the stated purpose is configuration management, persistence plus optional automated healing increases risk because it can override later user changes or maintain an unintended state over time.

Session Persistence

Medium
Category
Rogue Agent
Content
--model <id>                embeddinggemma | nomic-embed-text | all-minilm | mxbai-embed-large
  --import-local-gguf <mode>  auto | yes | no   (default: no)
                              Use yes to explicitly scan/import a local GGUF.
  --import-model-name <name>  model name to create in Ollama (default: embeddinggemma-local)
  --openclaw-config <path>    OpenClaw config path (default: ~/.openclaw/openclaw.json)
  --non-interactive           do not prompt; use supplied/default values
  --restart-gateway <mode>    yes | no (default: no)
Confidence
60% confidence
Finding
Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.

External Transmission

Medium
Category
Data Exfiltration
Content
}

ollama_running() {
  curl -fsS "http://127.0.0.1:11434/api/tags" >/dev/null 2>&1
}

# Search for any embedding GGUF (embeddinggemma, nomic-embed, all-minilm, mxbai-embed).
Confidence
70% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Session Persistence

Medium
Category
Rogue Agent
Content
uid="$(id -u)"
    echo "  macOS (launchd):  launchctl kickstart -k gui/${uid}/bot.molt.gateway"
  fi
  # Linux systemd
  if command -v systemctl >/dev/null 2>&1 && systemctl --user is-enabled openclaw-gateway 2>/dev/null; then
    echo "  Linux (systemd):  systemctl --user restart openclaw-gateway"
  fi
Confidence
80% confidence
Finding
Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.

Missing User Warnings

Medium
Confidence
93% confidence
Finding
The apply-enforce command modifies and writes the provided configuration file via writeConfig, but this path has no confirmation prompt, log message, comment, or other user disclosure indicating that the file will be changed. Because this is a file write that can alter user configuration and credentials, it matches the missing-warning criterion for code files.

External Transmission

Medium
Category
Data Exfiltration
Content
TMP_BODY="$(mktemp)"
TMP_ERR="$(mktemp)"
set +e
HTTP_CODE="$(curl -sS -o "$TMP_BODY" -w "%{http_code}" \
  -H "Content-Type: application/json" \
  -d "$PAYLOAD" \
  "$EMBED_URL" 2>"$TMP_ERR")"
Confidence
70% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Session Persistence

Medium
Category
Rogue Agent
Content
UNINSTALL_LAUNCHD=0
QUIET=0

PLIST_NAME="bot.molt.openclaw.embedding-guard"
PLIST_PATH="${HOME}/Library/LaunchAgents/${PLIST_NAME}.plist"
LOG_DIR="${HOME}/.openclaw/logs"
STDOUT_LOG="${LOG_DIR}/embedding-guard.out.log"
Confidence
75% confidence
Finding
Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.

Session Persistence

Medium
Category
Rogue Agent
Content
UNINSTALL_LAUNCHD=0
QUIET=0

PLIST_NAME="bot.molt.openclaw.embedding-guard"
PLIST_PATH="${HOME}/Library/LaunchAgents/${PLIST_NAME}.plist"
LOG_DIR="${HOME}/.openclaw/logs"
STDOUT_LOG="${LOG_DIR}/embedding-guard.out.log"
Confidence
75% confidence
Finding
Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.

Session Persistence

Medium
Category
Rogue Agent
Content
UNINSTALL_LAUNCHD=0
QUIET=0

PLIST_NAME="bot.molt.openclaw.embedding-guard"
PLIST_PATH="${HOME}/Library/LaunchAgents/${PLIST_NAME}.plist"
LOG_DIR="${HOME}/.openclaw/logs"
STDOUT_LOG="${LOG_DIR}/embedding-guard.out.log"
Confidence
75% confidence
Finding
Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.

Session Persistence

Medium
Category
Rogue Agent
Content
UNINSTALL_LAUNCHD=0
QUIET=0

PLIST_NAME="bot.molt.openclaw.embedding-guard"
PLIST_PATH="${HOME}/Library/LaunchAgents/${PLIST_NAME}.plist"
LOG_DIR="${HOME}/.openclaw/logs"
STDOUT_LOG="${LOG_DIR}/embedding-guard.out.log"
Confidence
75% confidence
Finding
Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.

Session Persistence

Medium
Category
Rogue Agent
Content
UNINSTALL_LAUNCHD=0
QUIET=0

PLIST_NAME="bot.molt.openclaw.embedding-guard"
PLIST_PATH="${HOME}/Library/LaunchAgents/${PLIST_NAME}.plist"
LOG_DIR="${HOME}/.openclaw/logs"
STDOUT_LOG="${LOG_DIR}/embedding-guard.out.log"
Confidence
75% confidence
Finding
Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.

Session Persistence

Medium
Category
Rogue Agent
Content
UNINSTALL_LAUNCHD=0
QUIET=0

PLIST_NAME="bot.molt.openclaw.embedding-guard"
PLIST_PATH="${HOME}/Library/LaunchAgents/${PLIST_NAME}.plist"
LOG_DIR="${HOME}/.openclaw/logs"
STDOUT_LOG="${LOG_DIR}/embedding-guard.out.log"
Confidence
75% confidence
Finding
Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.

Session Persistence

Medium
Category
Rogue Agent
Content
UNINSTALL_LAUNCHD=0
QUIET=0

PLIST_NAME="bot.molt.openclaw.embedding-guard"
PLIST_PATH="${HOME}/Library/LaunchAgents/${PLIST_NAME}.plist"
LOG_DIR="${HOME}/.openclaw/logs"
STDOUT_LOG="${LOG_DIR}/embedding-guard.out.log"
Confidence
75% confidence
Finding
Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.

Session Persistence

Medium
Category
Rogue Agent
Content
UNINSTALL_LAUNCHD=0
QUIET=0

PLIST_NAME="bot.molt.openclaw.embedding-guard"
PLIST_PATH="${HOME}/Library/LaunchAgents/${PLIST_NAME}.plist"
LOG_DIR="${HOME}/.openclaw/logs"
STDOUT_LOG="${LOG_DIR}/embedding-guard.out.log"
Confidence
75% confidence
Finding
Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.

Session Persistence

Medium
Category
Rogue Agent
Content
UNINSTALL_LAUNCHD=0
QUIET=0

PLIST_NAME="bot.molt.openclaw.embedding-guard"
PLIST_PATH="${HOME}/Library/LaunchAgents/${PLIST_NAME}.plist"
LOG_DIR="${HOME}/.openclaw/logs"
STDOUT_LOG="${LOG_DIR}/embedding-guard.out.log"
Confidence
75% confidence
Finding
Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.

Static analysis

No suspicious patterns detected.