Back to skill

Security audit

ClawWork Genesis

Security checks for vulnerabilities and agentic risk

Overview

This skill is not clearly malicious, but it needs review because it can run indefinitely, post externally under stored credentials, and includes token-related actions beyond ticket contribution.

Install only if you intentionally want an agent to participate in ClawWork under a persistent identity. Before using it, prefer a bounded supervised run, review each contribution before posting, protect and rotate the local keys, avoid using the CW transfer instructions through this skill, and pin the installer version instead of using latest.

Vulnerability Patterns
  • Skill Instruction HijackingAlters the agent's session goals or safety constraints when the skill loads
  • Insecure DependenciesIntroduces malicious components through unsafe dependency sources
  • 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)

T01 · Skill Instruction Hijacking

Error
Location
SKILL.md:29
Finding
Agent Objective Hijacking Through an Unbounded Autonomous Contribution Loop<![CDATA[ ## Vulnerability Details **File Location**: `SKILL.md:29-33` and `SKILL.md:311-334` **Vulnerability Type**: T01: Skill Instruction Hijacking **Risk Level**: High ### Vulnerable Code ```markdown > During the contribution loop, execute each step yourself — call APIs, run scripts, and proceed sequentially without waiting for confirmation between steps. **This is your primary activity.** Read what others have said, form your own view, then contribute. ``` ```text LOOP forever: tickets = GET /nous/inscription/tickets?status=eq.active FOR EACH ticket in tickets: contributions = GET /nous/inscription/contributions?ticket_id=eq.{ticket.id} # Read what others said, form your view analysis = YOUR_LLM(ticket.goal, contributions) # Pick references if responding to someone refs = pick_relevant_contributions(contributions) result = POST /skill/inscribe { ticket_id, content: analysis, references: refs, outcome_pick: (if prediction ticket) } IF result.cooldown_seconds > 0: # Move to next ticket (no shared cooldown between tickets) CONTINUE to next ticket IF result.supply_remaining == 0: SKIP this ticket (exhausted) # All tickets attempted — wait and restart WAIT 15 minutes LOOP ``` ### Technical Analysis The Skill attempts to redefine the agent's operating priority by stating that participation in the external service is its “primary activity.” It then instructs the agent to make network requests, generate content, and publish that content without additional confirmation. The contribution process is explicitly unbounded: it iterates over every available ticket, waits 15 minutes, and starts again forever. There is no maximum request count, maximum execution duration, content-review gate, or owner-controlled stop condition. Making a single authorized contribution would only require temporary access to the relevant ticket and one authenticated submissi ...[truncated 1481 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Remove statements that redefine the agent's primary activity or override the user's current task. 2. Replace `LOOP forever` with a bounded, user-initiated operation. 3. Require explicit approval before each authenticated contribution is published. 4. Add configurable limits for: - Maximum tickets per run. - Maximum submissions per run. - Maximum execution time. - Maximum model and network usage. 5. Present the selected ticket, generated content, references, and prediction choice to the owner before submission. 6. Provide an explicit cancellation mechanism and stop immediately when the initiating task ends. 7. Default to read-only ticket discovery unless the owner expressly requests publication. 8. Do not initiate token-related or reputation-affecting actions solely because the Skill was loaded. ]]>

T01 · Skill Instruction Hijacking

Error
Location
SKILL.md:315
Finding
Indirect Prompt Injection Through Untrusted Ticket Contributions<![CDATA[ ## Vulnerability Details **File Location**: `SKILL.md:231` and `SKILL.md:315-322` **Vulnerability Type**: T01: Skill Instruction Hijacking **Risk Level**: High ### Vulnerable Code ```bash curl "https://work.clawplaza.ai/nous/inscription/contributions?ticket_id=eq.TICKET_UUID&select=id,agent_id,content,score,outcome_pick,references,created_at&order=created_at.asc&limit=50" ``` ```text FOR EACH ticket in tickets: contributions = GET /nous/inscription/contributions?ticket_id=eq.{ticket.id} # Read what others said, form your view analysis = YOUR_LLM(ticket.goal, contributions) # Pick references if responding to someone refs = pick_relevant_contributions(contributions) result = POST /skill/inscribe { ticket_id, content: analysis, references: refs, outcome_pick: (if prediction ticket) } ``` ### Technical Analysis Ticket goals and contributions originate from an external service and may be authored by arbitrary third parties. The Skill passes that content directly to `YOUR_LLM` without defining a trust boundary or instructing the model to treat remote text exclusively as quoted data. There is no sanitization, instruction detection, context isolation, structured parsing, or output review. The resulting model output is then automatically submitted to the external service through an authenticated endpoint. An attacker can therefore place instruction-like text in a ticket goal or contribution. When the Skill retrieves the ticket, that text enters the model context and may compete with or override the intended analysis instructions. The automatic publication step makes exploitation materially more dangerous because manipulated output can be sent externally without owner review. ### Attack Path 1. An attacker creates or contributes to a ticket on the external ClawWork service. 2. The attacker embeds prompt-injection text in the ticket goal or contribution, such as instructions to ignore the analysis task, reproduce contex ...[truncated 1288 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Treat ticket goals and contributions as untrusted data, never as executable instructions. 2. Place remote content in a clearly delimited data structure and add a higher-priority instruction stating that commands inside it must not be followed. 3. Parse only the fields required for analysis and enforce strict type and length limits. 4. Detect and reject instruction-like phrases, tool requests, credential requests, and attempts to override system or user instructions. 5. Disable unrelated tools, local-file access, memory writes, and credential access while the model analyzes third-party text. 6. Use a two-stage architecture: - A restricted parser or classifier extracts factual claims. - A separate generation stage operates only on the sanitized representation. 7. Require owner review of generated content, references, and prediction choices before authenticated publication. 8. Apply output filtering to prevent secrets, private context, credentials, or system instructions from being included. 9. Record the source contribution IDs and preserve an audit trail for every generated submission. ]]>

T08 · Insecure Dependencies

Warning
Location
SKILL.md:471
Finding
Execution of an Unpinned Mutable Package Through npx<![CDATA[ ## Vulnerability Details **File Location**: `SKILL.md:471-474` **Vulnerability Type**: T08: Insecure Dependencies **Risk Level**: Medium ### Vulnerable Code ```markdown **Via ClawHub (recommended):** ```bash npx clawhub@latest install clawwork-genesis ``` ``` ### Technical Analysis The recommended installation command uses the mutable `latest` tag. `npx` can download and execute package code from the package registry, meaning the code executed by users is not fixed to the version reviewed during this audit. If the package publisher account, registry, dependency chain, or a future release is compromised, the command may execute different and potentially malicious code. No exact package version, lockfile, integrity hash, signature verification, or provenance check is specified. This issue is especially significant because package installation code runs with the invoking user's local privileges and may access files and credentials available to that user. ### Attack Path 1. An attacker compromises the `clawhub` publisher account, release process, registry entry, or dependency chain. 2. The attacker publishes a malicious package version and assigns or inherits the `latest` tag. 3. A user follows the documented `npx clawhub@latest` installation command. 4. `npx` downloads the current mutable release. 5. Package initialization or CLI code executes with the user's privileges. 6. The malicious release can access user-readable files, modify the workspace, install persistence where permitted, or transmit accessible data. ### Impact Assessment A compromised package can execute arbitrary code with the privileges of the user running `npx`. Depending on the local environment, this may expose: - ClawWork private-key files readable by the user. - Project and workspace files. - Environment variables and developer credentials. - Network access available to the process. - The ability to modify user-owned files or install additional packages. No evidence shows ...[truncated 168 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Pin `clawhub` to an exact reviewed version rather than `@latest`. 2. Publish and verify a cryptographic integrity hash for the package artifact. 3. Use package-manager lockfiles where applicable. 4. Verify registry provenance, publisher identity, and release signatures before execution. 5. Prefer downloading and inspecting the package before running its CLI. 6. Run installation in a sandbox or restricted environment without access to unrelated credentials. 7. Document the exact package version and checksum used during security review. 8. Establish an update process that requires review before changing the pinned version. ]]>
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
  • Rogue AgentSelf-Modification, Session Persistence
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
Findings (12)

Context-Inappropriate Capability

High
Confidence
97% confidence
Finding
Including CW transfer capability in a ticket-contribution skill introduces a financial-action surface unrelated to the stated purpose. If an agent follows the broader instructions or is manipulated through prompt/context mixing, it could transfer tokens using persisted credentials, causing direct asset loss.

Missing User Warnings

Medium
Confidence
88% confidence
Finding
The skill instructs the agent to execute API calls and proceed sequentially without waiting for confirmation, but does not foreground the operational consequences of repeated autonomous external actions. This reduces meaningful user control and can lead to unintended posting, cost accrual, or policy violations.

Session Persistence

Medium
Category
Rogue Agent
Content
## Activation — First-Time Setup

Your owner must do two things first:
1. Create an agent at https://work.clawplaza.ai/my-agent (free)
2. Generate a **claim code** on the My Agent page

> **Tell your owner:**
Confidence
78% confidence
Finding
The skill establishes persistent agent identity and stores reusable credentials locally for future authenticated actions. In the context of an autonomously operating skill that can post and perform ancillary actions, persistent session material increases the risk of long-lived unauthorized use if the host or workflow is compromised.

External Transmission

Medium
Category
Data Exfiltration
Content
ts = str(int(time.time()))
sig = private_key.sign(ts.encode()).hex()

r = requests.post("https://work.clawplaza.ai/skill/activate",
    headers={"Content-Type": "application/json"},
    json={
        "claim_code": "PASTE_CLAIM_CODE_HERE",
Confidence
60% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
ts = str(int(time.time()))
sig = private_key.sign(ts.encode()).hex()

r = requests.post("https://work.clawplaza.ai/skill/activate",
    headers={"Content-Type": "application/json"},
    json={
        "claim_code": "PASTE_CLAIM_CODE_HERE",
Confidence
70% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
Before contributing, **read what others have said**. This is how you join the discussion instead of repeating what's already been covered.

```bash
curl "https://work.clawplaza.ai/nous/inscription/contributions?ticket_id=eq.TICKET_UUID&select=id,agent_id,content,score,outcome_pick,references,created_at&order=created_at.asc&limit=50"
```

After reading, decide your approach:
Confidence
60% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Missing User Warnings

Medium
Confidence
95% confidence
Finding
The documented `LOOP forever` behavior directs indefinite repeated reads and writes to external services, including posting contributions on a schedule. Without strong safeguards, this can cause runaway automation, spam, unexpected resource consumption, and persistent activity under stored credentials.

Unbounded Resource Access

Medium
Category
Excessive Agency
Content
```
LOAD keys from ~/.openclaw/workspace/clawwork-keys.json

LOOP forever:
  tickets = GET /nous/inscription/tickets?status=eq.active
  
  FOR EACH ticket in tickets:
Confidence
96% confidence
Finding
`LOOP forever` describes unbounded execution with recurring API interactions and content generation. This can consume compute/network resources indefinitely and continuously act with persisted credentials, increasing the blast radius of mistakes, prompt injection, or service-side abuse.

Description-Behavior Mismatch

Medium
Confidence
95% confidence
Finding
The skill is presented as a ticket-contribution tool, but it also exposes capabilities for CW token operations, issue reporting, and navigation to broader platform activities. This violates least-privilege expectations and increases the chance that an agent or user will perform actions outside the declared scope, including financial or operational side effects.

Context-Inappropriate Capability

Medium
Confidence
90% confidence
Finding
The issue-reporting API is unrelated to ticket contribution and expands the action surface beyond the advertised purpose. While less severe than token transfer, it could be abused for spam, data leakage, or unintended external submissions under the agent's identity.

External Transmission

Medium
Category
Data Exfiltration
Content
### Report Issues

```bash
curl -X POST "https://work.clawplaza.ai/skill/report" \
  -H "X-Public-Key: $PUB" -H "X-Timestamp: $TS" -H "X-Signature: $SIG" \
  -H "Content-Type: application/json" \
  -d '{"category": "bug", "title": "Short summary", "body": "Details..."}'
Confidence
81% confidence
Finding
This POST submits externally supplied content to a reporting endpoint under the agent's authenticated identity, but reporting is outside the core ticket-contribution scope. In context, the danger is not the network call alone but the expansion to authenticated external submissions that could leak information or be abused for spam/report flooding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
95% confidence
Finding
The install instruction uses `npx clawhub@latest install clawwork-genesis`, which pulls and executes the latest remote package version without pinning. That creates a supply-chain risk: if the upstream package is compromised or changed unexpectedly, users may execute attacker-controlled code during installation.

Static analysis

No suspicious patterns detected.