Back to skill

Security audit

auto-rollback

Security checks for vulnerabilities and agentic risk

Overview

This rollback skill has a coherent safety purpose, but it needs Review because its launchd rollback implementation has unsafe script generation and can falsely report protection when scheduling fails.

Review this carefully before installing. The skill is not trying to hide its launchd rollback behavior, but it should validate state, fail closed when scheduling fails, and avoid generating executable shell source from environment-controlled values before being used as a safety mechanism for OpenClaw configuration changes.

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

Warning
Location
auto-rollback.sh:128
Finding
Environment-Controlled Paths Are Embedded into an Executable Rollback Script Without Shell Escaping<![CDATA[ ## Vulnerability Details **File Location**: `auto-rollback.sh`, lines 3-7 and 128-190 **Vulnerability Type**: Shell command injection through generated source code **Risk Level**: Medium ### Vulnerable Code ```bash OPENCLAW_HOME_DIR="${OPENCLAW_HOME_DIR:-$HOME/.openclaw}" STATE_FILE="${STATE_FILE:-$OPENCLAW_HOME_DIR/state/rollback-pending.json}" CONFIG_FILE="${CONFIG_FILE:-$OPENCLAW_HOME_DIR/openclaw.json}" BACKUP_DIR="${BACKUP_DIR:-$OPENCLAW_HOME_DIR}" LOG_FILE="${LOG_FILE:-$OPENCLAW_HOME_DIR/logs/rollback.log}" ``` These environment-controlled values are subsequently inserted into a generated executable script: ```bash write_rollback_script() { local rollback_script="$1" local backup_file="$2" cat > "$rollback_script" <<EOF #!/bin/bash OPENCLAW_HOME_DIR="$OPENCLAW_HOME_DIR" STATE_FILE="$STATE_FILE" LOG_FILE="$LOG_FILE" GATEWAY_PORT="$GATEWAY_PORT" LAUNCHD_LABEL="$LAUNCHD_LABEL" OPENCLAW_CMD="$OPENCLAW_CMD" BACKUP_FILE="$backup_file" log() { local msg="[\$(date -Iseconds)] \$1" echo "\$msg" >> "\$LOG_FILE" echo "\$1" } check_gateway_health() { if ! pgrep -f "openclaw.*gateway" >/dev/null 2>&1; then return 1 fi if curl -s -o /dev/null -w "%{http_code}" "http://127.0.0.1:\$GATEWAY_PORT/health" 2>/dev/null | grep -q "200"; then return 0 fi return 1 } log "🚨 rollback task started" if check_gateway_health; then log "✅ Gateway is already healthy, cancelling rollback" rm -f "\$STATE_FILE" "\$OPENCLAW_HOME_DIR/\$LAUNCHD_LABEL.plist" "\$OPENCLAW_HOME_DIR/.rollback_execute.sh" exit 0 fi log "❌ Gateway still unhealthy, restoring backup: \$BACKUP_FILE" cp "\$BACKUP_FILE" "$CONFIG_FILE" || { log "❌ Failed to restore backup" exit 1 } log "🔄 Restarting Gateway" "\$OPENCLAW_CMD" gateway restart || log "❌ Gateway restart command failed" sleep 5 if check_gateway_health; then log "🎉 Rollback completed and Gateway is healthy" else log "⚠️ Rollback completed but Gat ...[truncated 2364 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Do not generate executable shell source containing dynamic path values. Use a static rollback script and pass values as positional arguments: ```bash /bin/bash rollback-static.sh "$STATE_FILE" "$CONFIG_FILE" "$backup_file" ``` 2. Prefer storing rollback metadata in a permission-restricted JSON file and reading it with `jq` from the static script. 3. If source generation cannot be removed, serialize every inserted value using a shell-safe mechanism such as: ```bash printf 'CONFIG_FILE=%q\n' "$CONFIG_FILE" ``` 4. Validate all environment-overridable paths before use. Reject control characters, newlines, null-equivalent input, and values outside approved directories. 5. Consider removing environment overrides for security-critical paths unless custom locations are an explicit requirement. 6. Create generated files with restrictive permissions and safe creation semantics, such as a restrictive `umask` and atomic file replacement. 7. Verify that the generated script and its parent directory are owned by the expected user and are not writable by other users before registering the launchd job. ]]>

T09 · Insecure Skill Coding Practices

Note
Location
auto-rollback.sh:300
Finding
Mutable Rollback State Can Cause Path Traversal During Plist Deletion<![CDATA[ ## Vulnerability Details **File Location**: `auto-rollback.sh`, lines 300-305; `BOOT.md`, lines 9-10 and 29-32 **Vulnerability Type**: Path traversal through an unvalidated state-file property **Risk Level**: Low ### Vulnerable Code The cancellation command reads the launchd label from mutable JSON state and incorporates it into a filesystem path: ```bash local launchd_label local plist_file launchd_label="$(jq -r '.launchd_label' "$STATE_FILE")" plist_file="$OPENCLAW_HOME_DIR/$launchd_label.plist" launchctl unload "$plist_file" 2>/dev/null && log "✅ launchd job unloaded" || log "⚠️ launchd unload failed or job already ran" rm -f "$plist_file" "$OPENCLAW_HOME_DIR/.rollback_execute.sh" "$STATE_FILE" ``` The same pattern is present in the BOOT integration: ```bash LABEL=$(jq -r '.launchd_label // empty' "$STATE") PLIST="$HOME/.openclaw/${LABEL}.plist" ``` ```bash if [ -n "$LABEL" ] && [ -f "$PLIST" ]; then launchctl unload "$PLIST" 2>/dev/null || true rm -f "$PLIST" rm -f "$HOME/.openclaw/.rollback_execute.sh" echo "[$(date -Iseconds)] BOOT: rollback cancelled (label=$LABEL)" >> "$LOG" fi ``` ### Technical Analysis The expected label is a constant, `ai.openclaw.rollback`, but cancellation trusts the `launchd_label` property stored in `rollback-pending.json`. No validation requires that the stored value match this constant or prohibits path separators and `..` components. A malicious label such as `../../Library/LaunchAgents/target` produces a path outside the intended `~/.openclaw` directory after filesystem path resolution: ```text ~/.openclaw/../../Library/LaunchAgents/target.plist ``` If that file exists and is writable by the current user, the cancellation logic can pass it to `launchctl unload` and delete it with `rm -f`. Exploitation requires the attacker to modify or replace the rollback state file. This generally implies some existing access to the user's OpenClaw state directory, which limits severity, but the flaw expand ...[truncated 1156 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Do not derive the plist path from mutable state. Use the existing constant directly: ```bash plist_file="$OPENCLAW_HOME_DIR/$LAUNCHD_LABEL.plist" ``` 2. If the state property must be retained, require an exact match before using it: ```bash launchd_label="$(jq -er '.launchd_label' "$STATE_FILE")" || exit 1 [ "$launchd_label" = "$LAUNCHD_LABEL" ] || { log "Invalid launchd label in state file" exit 1 } ``` 3. Apply the same exact-match validation in `BOOT.md`. 4. Reject labels containing `/`, `\`, `..`, control characters, or unexpected whitespace. 5. Canonicalize the final path and verify that it remains directly inside `OPENCLAW_HOME_DIR` before unloading or deleting it. 6. Verify that the target is a regular file or symbolic-link-safe expected artifact owned by the current user. 7. Create the state directory and state file with restrictive permissions to reduce unauthorized modification. ]]>

T09 · Insecure Skill Coding Practices

Warning
Location
auto-rollback.sh:282
Finding
Rollback Protection Is Reported as Pending Even When launchd Registration Fails<![CDATA[ ## Vulnerability Details **File Location**: `auto-rollback.sh`, lines 282-288 and 151-190 **Vulnerability Type**: Fail-open scheduled-task registration and incomplete launchd lifecycle cleanup **Risk Level**: Medium ### Vulnerable Code Failure to register the launchd task is reduced to a warning, after which the script still writes state indicating that rollback is pending: ```bash launchctl load "$plist_file" 2>/dev/null && log "✅ launchd job loaded" || log "⚠️ launchd load failed or job already exists" write_state_file "$backup_file" "$rollback_time" "$reason" || { log "❌ Failed to write state file" rm -f "$plist_file" "$rollback_script" exit 1 } log "✅ State file written: $STATE_FILE" log "📋 Next step: $OPENCLAW_CMD gateway restart" log "⚠️ If Gateway stays unhealthy, rollback will run in ${ROLLBACK_DELAY_MINUTES} minutes" ``` The generated scheduled script removes its plist and itself but does not explicitly unload the launchd job: ```bash if check_gateway_health; then log "✅ Gateway is already healthy, cancelling rollback" rm -f "\$STATE_FILE" "\$OPENCLAW_HOME_DIR/\$LAUNCHD_LABEL.plist" "\$OPENCLAW_HOME_DIR/.rollback_execute.sh" exit 0 fi ``` ```bash rm -f "\$STATE_FILE" "\$OPENCLAW_HOME_DIR/\$LAUNCHD_LABEL.plist" "\$0" ``` ### Technical Analysis The Skill’s central security property is that a rollback task will execute after ten minutes if Gateway remains unhealthy. That property depends on successful launchd registration. However, any failure from `launchctl load` is ignored. The script proceeds to create the state file and tells the user that rollback will run. Registration can fail because of a malformed environment, an existing label, launchd state, permissions, or other operational errors. The scheduled script also deletes the plist without explicitly unloading or removing the registered launchd service. launchd maintains loaded job state independently of the plist file, so deleting the source plist is ...[truncated 2265 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Treat launchd registration failure as fatal. Do not write pending state or claim protection unless registration succeeds. 2. On failure, remove the generated rollback script and plist, then exit with a nonzero status: ```bash if ! launchctl load "$plist_file"; then log "Failed to register rollback job" rm -f "$plist_file" "$rollback_script" exit 1 fi ``` 3. After registration, verify that the expected label is loaded and that its program arguments refer to the newly generated rollback script. 4. Write the state file only after successful registration and verification. 5. If state-file creation fails after registration, explicitly unload the job before deleting its files. 6. Explicitly unload or remove the launchd job after scheduled execution rather than only deleting its plist. 7. Prefer modern user-domain launchd operations such as `launchctl bootstrap`, `bootout`, and `kickstart`, with the correct GUI user domain. 8. Add a unique transaction identifier or unique launchd label for each rollback operation to prevent stale-label collisions. 9. Make `status` distinguish between a state file that exists and a verified active job whose executable and schedule match the current transaction. 10. Preserve and report launchctl error output instead of redirecting it entirely to `/dev/null`, so registration failures can be diagnosed. ]]>
Vulnerability Patterns
  • Tool MisuseTool Parameter Abuse, Chaining Abuse, Unsafe Defaults
  • Rogue AgentSelf-Modification, Session Persistence
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
Findings (30)

Tool Parameter Abuse

High
Category
Tool Misuse
Content
if [ -n "$LABEL" ] && [ -f "$PLIST" ]; then
      launchctl unload "$PLIST" 2>/dev/null || true
      rm -f "$PLIST"
      rm -f "$HOME/.openclaw/.rollback_execute.sh"
      echo "[$(date -Iseconds)] BOOT: rollback cancelled (label=$LABEL)" >> "$LOG"
    else
      echo "[$(date -Iseconds)] BOOT: rollback state present but plist missing (label=$LABEL)" >> "$LOG"
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).

Missing User Warnings

Medium
Confidence
84% confidence
Finding
This markdown file documents a startup checklist fragment that unloads a launchd plist and deletes multiple local files to cancel a pending rollback. While the snippet logs to a file, the surrounding markdown does not warn the user that running it will perform destructive state changes affecting rollback behavior and local system files.

Session Persistence

Medium
Category
Rogue Agent
Content
if [ -f "$STATE" ]; then
  LABEL=$(jq -r '.launchd_label // empty' "$STATE")
  PLIST="$HOME/.openclaw/${LABEL}.plist"

  echo "[$(date -Iseconds)] BOOT: detected rollback state file: $STATE" >> "$LOG"
  echo "[$(date -Iseconds)] BOOT: waiting for Gateway health check" >> "$LOG"
Confidence
87% confidence
Finding
This duplicate finding points to the same issue: a persistence-related plist filename is constructed from untrusted JSON state and later acted upon. In the context of a rollback skill that manages launchd jobs, path control over the plist can affect what persistence artifact is modified or removed.

Session Persistence

Medium
Category
Rogue Agent
Content
if [ -f "$STATE" ]; then
  LABEL=$(jq -r '.launchd_label // empty' "$STATE")
  PLIST="$HOME/.openclaw/${LABEL}.plist"

  echo "[$(date -Iseconds)] BOOT: detected rollback state file: $STATE" >> "$LOG"
  echo "[$(date -Iseconds)] BOOT: waiting for Gateway health check" >> "$LOG"
Confidence
87% confidence
Finding
This duplicate finding points to the same issue: a persistence-related plist filename is constructed from untrusted JSON state and later acted upon. In the context of a rollback skill that manages launchd jobs, path control over the plist can affect what persistence artifact is modified or removed.

Session Persistence

Medium
Category
Rogue Agent
Content
done

  if [ "$HEALTHY" = true ]; then
    if [ -n "$LABEL" ] && [ -f "$PLIST" ]; then
      launchctl unload "$PLIST" 2>/dev/null || true
      rm -f "$PLIST"
      rm -f "$HOME/.openclaw/.rollback_execute.sh"
Confidence
90% confidence
Finding
At this point the script uses the previously constructed PLIST path in a file-existence check before unloading the corresponding launchd job. Because PLIST originates from unvalidated state-file data, the script can be tricked into operating on unintended files or jobs if the state file is attacker-controlled.

Session Persistence

Medium
Category
Rogue Agent
Content
if [ "$HEALTHY" = true ]; then
    if [ -n "$LABEL" ] && [ -f "$PLIST" ]; then
      launchctl unload "$PLIST" 2>/dev/null || true
      rm -f "$PLIST"
      rm -f "$HOME/.openclaw/.rollback_execute.sh"
      echo "[$(date -Iseconds)] BOOT: rollback cancelled (label=$LABEL)" >> "$LOG"
Confidence
91% confidence
Finding
The script calls launchctl unload on a plist path derived from untrusted state content. If an attacker can alter the rollback state file, they may cause unloading of an unintended launch agent, disrupting services or altering persistence behavior within the user context.

Session Persistence

Medium
Category
Rogue Agent
Content
if [ "$HEALTHY" = true ]; then
    if [ -n "$LABEL" ] && [ -f "$PLIST" ]; then
      launchctl unload "$PLIST" 2>/dev/null || true
      rm -f "$PLIST"
      rm -f "$HOME/.openclaw/.rollback_execute.sh"
      echo "[$(date -Iseconds)] BOOT: rollback cancelled (label=$LABEL)" >> "$LOG"
    else
Confidence
92% confidence
Finding
The script removes the plist file at a path influenced by untrusted state data. That can lead to deletion of unintended files within the user's permissions if the label contains traversal or otherwise manipulates the constructed path.

Session Persistence

Medium
Category
Rogue Agent
Content
rm -f "$HOME/.openclaw/.rollback_execute.sh"
      echo "[$(date -Iseconds)] BOOT: rollback cancelled (label=$LABEL)" >> "$LOG"
    else
      echo "[$(date -Iseconds)] BOOT: rollback state present but plist missing (label=$LABEL)" >> "$LOG"
    fi

    rm -f "$STATE"
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
rm -f "$HOME/.openclaw/.rollback_execute.sh"
      echo "[$(date -Iseconds)] BOOT: rollback cancelled (label=$LABEL)" >> "$LOG"
    else
      echo "[$(date -Iseconds)] BOOT: rollback state present but plist missing (label=$LABEL)" >> "$LOG"
    fi

    rm -f "$STATE"
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
rm -f "$HOME/.openclaw/.rollback_execute.sh"
      echo "[$(date -Iseconds)] BOOT: rollback cancelled (label=$LABEL)" >> "$LOG"
    else
      echo "[$(date -Iseconds)] BOOT: rollback state present but plist missing (label=$LABEL)" >> "$LOG"
    fi

    rm -f "$STATE"
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
rm -f "$HOME/.openclaw/.rollback_execute.sh"
      echo "[$(date -Iseconds)] BOOT: rollback cancelled (label=$LABEL)" >> "$LOG"
    else
      echo "[$(date -Iseconds)] BOOT: rollback state present but plist missing (label=$LABEL)" >> "$LOG"
    fi

    rm -f "$STATE"
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
rm -f "$HOME/.openclaw/.rollback_execute.sh"
      echo "[$(date -Iseconds)] BOOT: rollback cancelled (label=$LABEL)" >> "$LOG"
    else
      echo "[$(date -Iseconds)] BOOT: rollback state present but plist missing (label=$LABEL)" >> "$LOG"
    fi

    rm -f "$STATE"
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
rm -f "$HOME/.openclaw/.rollback_execute.sh"
      echo "[$(date -Iseconds)] BOOT: rollback cancelled (label=$LABEL)" >> "$LOG"
    else
      echo "[$(date -Iseconds)] BOOT: rollback state present but plist missing (label=$LABEL)" >> "$LOG"
    fi

    rm -f "$STATE"
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
rm -f "$HOME/.openclaw/.rollback_execute.sh"
      echo "[$(date -Iseconds)] BOOT: rollback cancelled (label=$LABEL)" >> "$LOG"
    else
      echo "[$(date -Iseconds)] BOOT: rollback state present but plist missing (label=$LABEL)" >> "$LOG"
    fi

    rm -f "$STATE"
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
rm -f "$HOME/.openclaw/.rollback_execute.sh"
      echo "[$(date -Iseconds)] BOOT: rollback cancelled (label=$LABEL)" >> "$LOG"
    else
      echo "[$(date -Iseconds)] BOOT: rollback state present but plist missing (label=$LABEL)" >> "$LOG"
    fi

    rm -f "$STATE"
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
rm -f "$HOME/.openclaw/.rollback_execute.sh"
      echo "[$(date -Iseconds)] BOOT: rollback cancelled (label=$LABEL)" >> "$LOG"
    else
      echo "[$(date -Iseconds)] BOOT: rollback state present but plist missing (label=$LABEL)" >> "$LOG"
    fi

    rm -f "$STATE"
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
rm -f "$HOME/.openclaw/.rollback_execute.sh"
      echo "[$(date -Iseconds)] BOOT: rollback cancelled (label=$LABEL)" >> "$LOG"
    else
      echo "[$(date -Iseconds)] BOOT: rollback state present but plist missing (label=$LABEL)" >> "$LOG"
    fi

    rm -f "$STATE"
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
rm -f "$HOME/.openclaw/.rollback_execute.sh"
      echo "[$(date -Iseconds)] BOOT: rollback cancelled (label=$LABEL)" >> "$LOG"
    else
      echo "[$(date -Iseconds)] BOOT: rollback state present but plist missing (label=$LABEL)" >> "$LOG"
    fi

    rm -f "$STATE"
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
rm -f "$HOME/.openclaw/.rollback_execute.sh"
      echo "[$(date -Iseconds)] BOOT: rollback cancelled (label=$LABEL)" >> "$LOG"
    else
      echo "[$(date -Iseconds)] BOOT: rollback state present but plist missing (label=$LABEL)" >> "$LOG"
    fi

    rm -f "$STATE"
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
rm -f "$HOME/.openclaw/.rollback_execute.sh"
      echo "[$(date -Iseconds)] BOOT: rollback cancelled (label=$LABEL)" >> "$LOG"
    else
      echo "[$(date -Iseconds)] BOOT: rollback state present but plist missing (label=$LABEL)" >> "$LOG"
    fi

    rm -f "$STATE"
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
rm -f "$HOME/.openclaw/.rollback_execute.sh"
      echo "[$(date -Iseconds)] BOOT: rollback cancelled (label=$LABEL)" >> "$LOG"
    else
      echo "[$(date -Iseconds)] BOOT: rollback state present but plist missing (label=$LABEL)" >> "$LOG"
    fi

    rm -f "$STATE"
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
rm -f "$HOME/.openclaw/.rollback_execute.sh"
      echo "[$(date -Iseconds)] BOOT: rollback cancelled (label=$LABEL)" >> "$LOG"
    else
      echo "[$(date -Iseconds)] BOOT: rollback state present but plist missing (label=$LABEL)" >> "$LOG"
    fi

    rm -f "$STATE"
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
rm -f "$HOME/.openclaw/.rollback_execute.sh"
      echo "[$(date -Iseconds)] BOOT: rollback cancelled (label=$LABEL)" >> "$LOG"
    else
      echo "[$(date -Iseconds)] BOOT: rollback state present but plist missing (label=$LABEL)" >> "$LOG"
    fi

    rm -f "$STATE"
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
rm -f "$HOME/.openclaw/.rollback_execute.sh"
      echo "[$(date -Iseconds)] BOOT: rollback cancelled (label=$LABEL)" >> "$LOG"
    else
      echo "[$(date -Iseconds)] BOOT: rollback state present but plist missing (label=$LABEL)" >> "$LOG"
    fi

    rm -f "$STATE"
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
rm -f "$HOME/.openclaw/.rollback_execute.sh"
      echo "[$(date -Iseconds)] BOOT: rollback cancelled (label=$LABEL)" >> "$LOG"
    else
      echo "[$(date -Iseconds)] BOOT: rollback state present but plist missing (label=$LABEL)" >> "$LOG"
    fi

    rm -f "$STATE"
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.