Back to skill

Security audit

Outclaw

Security checks for vulnerabilities and agentic risk

Overview

This outreach skill has legitimate outreach guardrails, but it also changes persistent agent instructions and local configuration while handling sensitive lead data in unsafe temp files.

Review before installing. This skill may be useful for managed B2B outreach, but it should only be installed if you trust the publisher and have reviewed the missing sibling skills/shared scripts, because it can run shell commands, alter OpenClaw config and AGENTS.md, read persistent user/org context, and store complete lead batches locally.

Vulnerability Patterns
  • Agent Memory PoisoningWrites attacker-controlled rules into memory that affect later sessions
  • Unauthorized Access and Privilege EscalationObtains permissions beyond the task's legitimate needs
  • 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
Findings (4)

T02 · Agent Memory Poisoning

Error
Location
SKILL.md:390
Finding

Persistent Agent Instruction Injection Through AGENTS.md

Content
View full analysis
/AGENTS.md` into context at session start. That's the right place for the orchestrator's hardrails to live so they fire even on free-form user prompts that don't cleanly match any SKILL.md trigger. On every orchestrator run, ensure the routing block is present AND that no stale-version blocks co-exist with the current one. **Always run the stripper unconditionally** — never trust a "current-version-is- present" grep to short-circuit, because an older block from a prior version can still be there alongside it and the agent may read the older (weaker) rules first. ```bash SHARED="${HOME}/.openclaw/skills/outclaw/shared" TENANT=$(bash "$SHARED/scripts/tenant.sh") WS_AGENTS="${HOME}/.openclaw/workspace/${TENANT}/AGENTS.md" mkdir -p "$(dirname "$WS_AGENTS")" touch "$WS_AGENTS" # Unconditional strip-then-append: removes EVERY versioned outclaw-routing # block (v*), then appends the current snippet. Idempotent: a second run # with the same snippet produces the same file content. python3 - "$WS_AGENTS" "$SHARED/references/AGENTS_SNIPPET.md" <<'PY' import re, sys ws, snip_path = sys.argv[1], sys.argv[2] try: t = open(ws).read() except FileNotFoundError: t = "" # Strip ALL versions of the routing block, not just older ones. Current # version gets re-added from the snippet below. t = re.sub( r'[\s\S]*?\n?', '', t, flags=re.DOTALL, ) # Collapse resulting blank-line runs to at most one t = re.sub(r'\n{3,}', '\n\n', t) snip = open(snip_path).read() open(ws, "w").write(t.rstrip() + "\n\n" + snip) # Assert exactly one version marker remains remaining = re.finda ...[truncated 2384 chars]
Remediation
View remediation

T08 · Insecure Dependencies

Error
Location
SKILL.md:178
Finding

Mandatory Execution of Unaudited External Skill Components

Content
View full analysis
/dev/null || true # 1. Load TENANT memory (per-tenant; isolated from other tenants) bash "$SHARED/scripts/memory_search.sh" --limit 30 bash "$SHARED/scripts/memory_search.sh" --type tool_inventory --limit 1 ``` ```text ## Auto-update `outclaw_upgrade.sh --check` runs silently in the preamble (TTL 24h). When a new version is available on the `github.com/leadbay/outclaw` remote, it logs an `observation` memory entry; the orchestrator surfaces the hint in its next reply. User can run `outclaw upgrade` conversationally to install. ``` ### Technical Analysis The sole audited artifact is `SKILL.md`; none of the mandatory scripts, references, or sibling components are present. Nevertheless, the skill directs the agent to execute these components automatically or use them as authoritative instructions. The self-healing script is specifically expected to change plugin and agent configuration. The preamble also silently runs an update checker associated with a GitHub remote and suppresses its error output. Because the scrip ...[truncated 1554 chars]
Remediation
View remediation
/dev/null || true` from security-sensitive update operations; report failures without exposing secrets. 7. Execute configuration-repair scripts only after showing the proposed changes and receiving approval. 8. Apply least-privilege sandboxing to shared scripts, including restricted filesystem and network access. 9. Reject scripts or references whose owner, permissions, version, or integrity do not match the trusted installation manifest. ]]>

T09 · Insecure Skill Coding Practices

Error
Location
SKILL.md:57
Finding

Complete Lead Records Stored in a Predictable Shared Temporary File

Content
View full analysis
/tmp/leadbay-pull.json import json, sys # Paste the COMPLETE dict returned by leadbay_pull_leads below. # Every lead. Every key. The pagination envelope too. Not a sample. j = {...entire Leadbay response verbatim...} json.dump(j, sys.stdout) PYEOF ``` **Mandatory sanity gate** — `outclaw_daily_batch.sh` in step 3 will refuse to run if the write is truncated. Pre-check yourself: ```bash python3 -c ' import json d = json.load(open("/tmp/leadbay-pull.json")) leads, pag = d.get("leads") or [], d.get("pagination") or {} print(f"leads={len(leads)} pagination={pag}") assert "pagination" in d, "MISSING pagination — you wrote a reshaped response, not the MCP envelope" assert len(leads) >= min(20, pag.get("total", 20)), f"TRUNCATED: only {len(leads)} of {pag.get(\"total\")}" print("OK") ' ``` ``` ### Technical Analysis The workflow requires the entire Leadbay response—including every lead, key, and nested object—to be written to the fixed path `/tmp/leadbay-pull.json`. No secure creation primitive, restrictive file mode, ownership validation, symlink protection, data minimization, or cleanup procedure is specified. On systems where `/tmp` is shared, a predictable pathname creates several risks: - Another ...[truncated 1718 chars]
Remediation
View remediation

T05 · Unauthorized Access and Privilege Escalation

Warning
Location
SKILL.md:448
Finding

Unconditional Collection of Broad Persistent User Context

Content
View full analysis
/dev/null || true # 1. Load TENANT memory (per-tenant; isolated from other tenants) bash "$SHARED/scripts/memory_search.sh" --limit 30 bash "$SHARED/scripts/memory_search.sh" --type tool_inventory --limit 1 # 2. Load SHARED KB pages for the user (kb/me/ — tenant-authored but shared location) [ -f ~/.openclaw/outclaw/kb/me/self.md ] && cat ~/.openclaw/outclaw/kb/me/self.md [ -f ~/.openclaw/outclaw/kb/me/org.md ] && cat ~/.openclaw/outclaw/kb/me/org.md # 3. Confirm tenant setup state SETUP_STATE="$HOME/.openclaw/outclaw/setup_state/$TENANT.json" [ -f "$SETUP_STATE" ] && cat "$SETUP_STATE" # 4. Capabilities (fresh ≤24h; else rebuild in the next step) CAP_FILE="$HOME/.openclaw/outclaw/capabilities/$TENANT.json" [ -f "$CAP_FILE" ] && cat "$CAP_FILE" | head -40 ``` ``` ### Technical Analysis The preamble is mandatory for every OutClaw session and reads multiple categories of persistent data before the request is routed to a specialist: - Up to 30 memory-search results. - Tool-inventory memory. - User identity information. - Organization information. - Tenant setup state. - Capability information. Some outreach operations may legitimately require part of this context, but unconditional collection violates data-minimization and least-privilege principles. Simple requests such as installation help, status clarification, or unrelated ambiguous prompts do not necessarily require identity and organization records. Loading broad persistent context into the agent also increases exposur ...[truncated 1533 chars]
Remediation
View remediation
Vulnerability Patterns
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Tool MisuseTool Parameter Abuse, Chaining Abuse, Unsafe Defaults
  • Rogue AgentSelf-Modification, Session Persistence
Findings (20)

Vague Triggers

High
Category
Not specified by scanner
Confidence
98% confidence
Finding

The trigger scope is extremely broad and includes common language like contacting, emailing, messaging, research, and even adversarial/refusal phrases. Overbroad matching increases unintended invocation risk, which is especially dangerous here because the skill can run scripts, alter config, persist data, and route into operational subskills based on ordinary conversational wording.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

High
Category
Not specified by scanner
Confidence
97% confidence
Finding

The self-heal flow authorizes the skill to inspect and modify host OpenClaw configuration to repair plugin bindings. This exceeds ordinary outreach orchestration and gives a conversational skill host-level configuration mutation powers that could alter tool availability, agent allowlists, or runtime behavior without strong separation of duties.

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 212)May include surrounding context.

md
3. Invoke that sibling's `SKILL.md` and hand off.

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
3. Invoke that sibling's `SKILL.md` and hand off.

Context-Inappropriate Capability

High
Category
Not specified by scanner
Confidence
98% confidence
Finding

The skill modifies tenant AGENTS.md on every invocation, effectively changing host/session behavior persistently and automatically. This creates a self-propagating control surface where a skill can rewrite governing instructions outside the immediate interaction, increasing persistence and making rollback, auditability, and trust boundaries harder to manage.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

High
Category
Not specified by scanner
Confidence
98% confidence
Finding

The install/uninstall section allows the skill to perform package management and recursive deletion of skill directories on the host. Even if intended for maintenance, this is beyond the advertised role and creates a destructive pathway that could remove software or disrupt the environment if triggered improperly or repurposed by adversarial prompts.

Content

No source excerpt is available for this finding.

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
99% confidence
Finding

The skill includes a raw rm -rf "$src/$s" deletion loop over host skill directories. Even with fixed names, destructive shell deletion in conversational logic is hazardous because path assumptions, variable manipulation, or accidental triggering can result in loss of installed components or broader filesystem damage.

Content

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

bash
  for src in "$HOME/.openclaw/skills" "$HOME/.openclaw/managed/skills"; do
    for s in outclaw outclaw-setup outclaw-style outclaw-research outclaw-plan; do
      rm -rf "$src/$s" 2>/dev/null || true
    done
  done
  openclaw skills list | grep outclaw || echo GONE

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
88% confidence
Finding

The manifest claims prohibited bulk-send and opt-out scenarios are enforced at the orchestrator layer before routing, but the trigger table also routes those same phrases to a sibling skill. That inconsistency creates ambiguity about which control is authoritative and can lead to prohibited actions being processed deeper in the stack instead of being stopped immediately.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The skill is presented as an orchestrator/router, but these instructions make it directly execute a multi-step workflow, run validators, write files, and construct the final reply from local artifacts. That mismatch expands the skill's effective privilege and behavior beyond what a caller would reasonably expect from the manifest, increasing the chance of unsafe execution paths and policy bypass through hidden side effects.

Content

No source excerpt is available for this finding.

Session Persistence

Medium
Category
Rogue Agent
Confidence
91% confidence
Finding

Persisting the entire MCP response into a session-local temp file introduces unnecessary session persistence of lead and metadata outside the immediate model context. This increases the attack surface for data leakage through local file access, later tool invocations, or residual artifacts after the session.

Content

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

md
1. `leadbay_pull_leads` with `count=50` (Leadbay's default is 20 which
   truncates; pass the max so the batch reflects today's real inbox
   size — 50 is the API cap).
2. **Write the ENTIRE MCP response JSON to `/tmp/leadbay-pull.json`
   verbatim — this is the single most common bug.** The MCP returns
   an envelope like `{"lens":{...}, "leads":[...50 objects...],
   "pagination":{"page":0,"pages":4,"total":62}, ...}`. You MUST persist

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The skill instructs the agent to write files, execute shell and Python commands, and perform in-place processing of local artifacts, but the user-facing description does not clearly disclose these behaviors. This transparency gap undermines informed consent and increases the chance that a broadly triggered skill performs sensitive local actions unexpectedly.

Content

No source excerpt is available for this finding.

Ssd 3

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The skill mandates verbatim persistence of the complete lead-pull JSON, including all leads and nested metadata, into /tmp. That creates unnecessary local retention of potentially sensitive prospect data and broadens exposure through temporary files, downstream scripts, and accidental reuse or leakage from shared environments.

Content

No source excerpt is available for this finding.

Ssd 3

Medium
Category
Not specified by scanner
Confidence
88% confidence
Finding

Requiring the full generated plan to be returned verbatim can expose harvested target details, provenance, and internal research artifacts wholesale instead of applying least disclosure. If the plan contains sensitive lead intelligence, personal data, or internal notes, this instruction encourages overexposure by design.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

The 'Job' section says the orchestrator should not do outreach work directly, yet other sections direct it to perform discovery, planning, validation, and content assembly itself. This contradiction weakens operator expectations and can cause reviewers or calling systems to grant trust based on a narrower role than the skill actually exercises.

Content

No source excerpt is available for this finding.

Autonomous Decision Making

Medium
Category
Excessive Agency
Confidence
75% confidence
Finding

Skill enables autonomous high-impact decisions without human-in-the-loop verification. Critical operations (destructive commands, financial transactions, data deletion) should require explicit user confirmation.

Content

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

md
## Core principles (apply to every descendant skill)

1. **Never send without approval.** Every outbound message requires explicit
   user consent per-touchpoint.
2. **Leadbay-first intelligence.** When LeadClaw is connected (see inventory),
   query it before falling back to web search.

Ssd 3

Medium
Category
Not specified by scanner
Confidence
87% confidence
Finding

The directive to 'Log everything' is an overbroad retention rule for outreach events, KB updates, and memory entries. Broad natural-language retention requirements encourage unnecessary collection and long-lived storage of user, lead, and communication data beyond what is needed for the task.

Content

No source excerpt is available for this finding.

Skill Enumeration

Medium
Category
Agent Snooping
Confidence
80% confidence
Finding

Skill enumerates or reads other installed skills. Access to other skills' SKILL.md files or the skills directory reveals prompt instructions, capabilities, and secrets that should be invisible to peer skills.

Content

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

md
│
├─ "set up outreach" / "connect <channel>" / "set up leadbay" /
│  "reconfigure tools" / "add more plugins"   OR setup_state missing
│     → Read skills/outclaw-setup/SKILL.md and follow it.
│
├─ "learn my style" / "retrain style for <channel>" / "style report"
│     → Read skills/outclaw-style/SKILL.md and follow it.

Skill Enumeration

Medium
Category
Agent Snooping
Confidence
80% confidence
Finding

Skill enumerates or reads other installed skills. Access to other skills' SKILL.md files or the skills directory reveals prompt instructions, capabilities, and secrets that should be invisible to peer skills.

Content

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

md
│     → Read skills/outclaw-setup/SKILL.md and follow it.
│
├─ "learn my style" / "retrain style for <channel>" / "style report"
│     → Read skills/outclaw-style/SKILL.md and follow it.
│
├─ "research <person>" / "look up <person>" / "who is <person>" /
│  "find <person>'s email|linkedin" / "tell me about <company>" /

Skill Enumeration

Medium
Category
Agent Snooping
Confidence
80% confidence
Finding

Skill enumerates or reads other installed skills. Access to other skills' SKILL.md files or the skills directory reveals prompt instructions, capabilities, and secrets that should be invisible to peer skills.

Content

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

md
├─ "research <person>" / "look up <person>" / "who is <person>" /
│  "find <person>'s email|linkedin" / "tell me about <company>" /
│  "enrich <person>" / "pull a promising lead"
│     → Read skills/outclaw-research/SKILL.md and follow it.
│
├─ "reach out to <person>" / "contact <person>" / "plan outreach" /
│  "draft cold email" / "send <channel>" / "send it all" / "send them all" /

Skill Enumeration

Medium
Category
Agent Snooping
Confidence
80% confidence
Finding

Skill enumerates or reads other installed skills. Access to other skills' SKILL.md files or the skills directory reveals prompt instructions, capabilities, and secrets that should be invisible to peer skills.

Content

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

md
│  "did anyone reply" / "is anyone gonna reply" / "who replied" /
│  "ignore feedback and send" / "override tone feedback" /
│  a lead's reply containing "stop contacting me" / "unsubscribe" / "take me off"
│     → Read skills/outclaw-plan/SKILL.md and follow it.
│       (The plan skill enforces daily cap, per-touchpoint approval,
│       feedback-memory, opt-out hardrails BEFORE drafting.)
│

Static analysis

No suspicious patterns detected.