T06 · System Persistence
- Location
scripts/install.sh:168- Finding
Installer Creates a Persistent Autonomous Scheduled Task Without Explicit Opt-In
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The skill has a coherent background-research purpose, but it installs recurring autonomous execution with broad local/network access and an unsafe code runner without enough user control.
Install only if you intentionally want a recurring background agent with access to your OpenClaw workspace, graph memory, local model endpoint, Perplexity API, and host-level Python execution. Review or remove the cron registration, disable or replace sandbox_run, pin dependencies/model artifacts, and avoid using this in workspaces containing secrets or sensitive notes until those controls are improved.
scripts/install.sh:168Installer Creates a Persistent Autonomous Scheduled Task Without Explicit Opt-In
scripts/tools.py:220Model-Generated Python Runs Without an Effective Security Sandbox
scripts/tools.py:319Untrusted Retrieved Content Can Be Written Into Persistent Agent Memory
scripts/tools.py:103Workspace Content Can Be Forwarded to an External Search Provider
scripts/install.sh:72Installer Downloads and Executes an Unverified Remote Python Bootstrap Script
scripts/install.sh:78Python Dependencies and the Tool-Controlling LLM Artifact Are Not Cryptographically Pinned
A description-behavior mismatch around graph isolation is security-relevant because the skill claims exploration will stay in a separate 'wander' graph, but the detected behavior indicates it may use the primary 'workspace' graph instead. That can contaminate the main memory/context with exploratory or dead-end material, undermine trust boundaries, and cause unintended persistence of low-confidence or sensitive research artifacts.
The collector is explicitly designed to store full conversation transcripts, system prompts, tool outputs, ON_YOUR_MIND snapshots, and graph context to disk as training records. In this skill's context, that is especially dangerous because background reasoning may ingest sensitive internal context, secrets, proprietary research notes, or system instructions, creating a durable local trove of high-value data that could later be exposed, reused unsafely for training, or accessed by other components/users.
The installer registers a recurring 30-minute cron job that triggers future agent executions, but does not obtain explicit informed consent at the time it does so. This creates durable autonomous behavior after install, increasing the risk of unexpected resource use, data access, and follow-on actions in the workspace.
The scheduled payload instructs the agent to write a helper script to /tmp and then execute it, framing this as routine background work. This is a classic indirect execution chain: instead of performing a bounded action directly, it prompts an agent to generate code and run it, which expands the attack surface and weakens auditability.
The documented sandbox guarantees are materially false: the implementation launches arbitrary Python in a normal interpreter process and only blocks a small set of string literals. In an autonomous research agent that can generate its own code, this greatly increases the chance of sandbox escape, workspace tampering, secret access, or local system abuse.
The skill advertises broad capabilities including file read/write, network access, shell execution, and environment access, but does not declare any explicit tool scope or permission boundaries. For an autonomous scheduled agent, this is dangerous because it can perform persistent writes, external data exfiltration, or arbitrary local actions without a clear least-privilege contract or user-facing restriction.
The description emphasizes autonomous research benefits but does not prominently warn that the skill performs scheduled web searches and writes persistent files that may later enter the main memory pipeline. Missing disclosure reduces informed consent and increases the risk of users unintentionally enabling continuous external access and durable state changes.
The trigger list contains broad phrases like 'background reasoning', 'dead ends', and 'explore while I sleep' that could match normal conversation and activate an autonomous agent unexpectedly. In this context, accidental activation is more dangerous because the skill can schedule research, run tools, perform web searches, and write persistent outputs without an explicit per-run confirmation.
This markdown file states that the installer initializes a database graph, creates a 30-minute cron job, and creates a local file, all of which modify the user's system or data. The section does not include a warning or caution about these side effects, so users may not realize installation changes system scheduling and filesystem state.
The manual cron registration example performs an authenticated API call that schedules recurring execution of agent-supplied code, including writing and running a Python script from a message payload. In the context of an autonomous research skill, this materially increases danger because it establishes persistence and indirect code execution through the gateway without strong warnings, scope restrictions, or guidance on least-privilege credentials.
The llm_call function sends the system prompt and message history to WANDER_OLLAMA over HTTP, which can include user or system-derived context. Although the module docstring mentions driving the model, there is no explicit user-facing warning, confirmation, or privacy notice in this file about transmitting that data to an external or configured endpoint.
This code logs session metadata at startup and later saves the full system prompt, user message context, assistant messages, and tool outputs via save_session, but the file provides no user-facing warning, confirmation, or inline disclosure that conversation content will be recorded. Because this is a code file performing persistent writes of potentially sensitive model and tool data, it meets the missing-warning criteria.
The agent persistently stores full system prompts, user context snapshots, model outputs, and raw tool results, which may include secrets, sensitive local data, or results from sandbox/web-search tools. In a background autonomous research skill, this is more dangerous because it runs unattended and accumulates long-lived transcripts, increasing the blast radius of any later file, log, or database compromise.
This code persists system_prompt, full messages, and additional context snapshots to a JSON file, which can include sensitive user or system data. Although the module docstring describes the output format, there is no user-facing disclosure, confirmation, or visible warning in the code around this capture-and-write behavior.
The installer copies scripts into the workspace without a clear up-front warning or confirmation. While file installation is common, silently writing executable content into a user workspace can create trust and provenance issues, especially in an agent ecosystem where newly placed scripts may later be invoked automatically.
Creating ON_YOUR_MIND.md establishes persistent state in the workspace that will be consumed by later autonomous runs. Persistent state is not inherently malicious, but in this skill it directly feeds future background reasoning sessions, so unannounced creation increases the chance of unexpected long-lived behavior.
log " ✅ Wander graph initialised"
fi
# Step 5: Create ON_YOUR_MIND.md template
ON_YOUR_MIND="$WORKSPACE/ON_YOUR_MIND.md"
if [[ ! -f "$ON_YOUR_MIND" ]]; then
log "Creating ON_YOUR_MIND.md template..."
The installer reads a local gateway auth token from the user's OpenClaw config and uses it to create a recurring cron job that later drives agent execution. This is dangerous because it silently converts a one-time install into ongoing privileged automation, using local credentials to schedule future behavior the user may not understand or expect.
The scheduled prompt tells the agent to print captured stdout and stderr back in its reply. That can expose workspace paths, runtime details, model output, or other sensitive execution context in natural-language responses, which may be logged, surfaced to users, or stored in system history.
Code issues a request to a loopback, link-local, or private-range host. This can reach internal services not meant to be exposed and is a common SSRF pivot.
"delivery": {"mode": "none"},
"sessionTarget": "isolated"
}
resp = httpx.post(f"http://localhost:{port}/api/cron/jobs",
headers={"Authorization": f"Bearer {token}"}, json=job)
if resp.status_code in (200, 201):
print(f" ✅ Cron registered (id: {resp.json().get('id','')})")
The tool silently retrieves a local API key from ~/.openclaw/openclaw.json and transmits user/model-supplied queries to a third-party service. In an autonomous agent, this creates privacy and data-governance risk because workspace-derived or sensitive prompts may be exfiltrated without explicit runtime consent or visibility.
This code sends query content to api.perplexity.ai, creating an external data transmission path. In the context of a background reasoning skill that may process local notes and unresolved questions, this can leak sensitive workspace information or personal data to a third party.
try:
import httpx
resp = httpx.post(
"https://api.perplexity.ai/chat/completions",
headers={"Authorization": f"Bearer {api_key}", "Content-Type": "application/json"},
json={
The hardcoded external endpoint confirms third-party transmission of prompt content outside the local environment. This is particularly sensitive for an autonomous skill because users may not realize that internal research topics and notes are being sent off-device.
try:
import httpx
resp = httpx.post(
"https://api.perplexity.ai/chat/completions",
headers={"Authorization": f"Bearer {api_key}", "Content-Type": "application/json"},
json={
"model": "sonar",
read_file claims to read only workspace Markdown files, but it actually reads any file under the workspace path. In a background agent, this broadens access to secrets, config files, SSH material, datasets, or other sensitive local artifacts that the model was not intended to inspect.
The tool executes arbitrary Python generated by the agent without clear user-facing disclosure at the moment of execution. Because this is an autonomous background-reasoning skill, hidden code execution materially raises the risk of local compromise, destructive actions, and unexpected system interaction.
The tool executes model-supplied Python via subprocess.run(["python3", "-c", safe_code]) while relying only on naive substring blocking for safety. This is not a real sandbox: an attacker can likely bypass the denylist, access files, consume resources, or invoke dangerous functionality despite documentation claiming isolation and no file writes.
try:
# Run in subprocess with timeout and no network
result = subprocess.run(
["python3", "-c", safe_code],
capture_output=True, text=True,
timeout=SANDBOX_TIMEOUT,