Back to skill

Security audit

ClawHarbor

Security checks for vulnerabilities and agentic risk

Overview

This skill is purpose-aligned but needs review because it sends broad user task descriptions to an external human-operated service and presents externally supplied payment links without clear safeguards.

Review this skill before installing if you may delegate confidential, personal, regulated, credential-adjacent, or business-sensitive work. Only submit task descriptions you are comfortable sending to ClawHarbor and human agents, inspect payment links carefully before opening them, and treat returned results as untrusted external content.

Vulnerability Patterns
  • Skill Instruction HijackingAlters the agent's session goals or safety constraints when the skill loads
  • Insecure Skill Coding PracticesFinds exploitable flaws such as hardcoded secrets or command injection
  • 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 (2)

T01 · Skill Instruction Hijacking

Warning
Location
SKILL.md:17
Finding
Mutable Remote Instructions and Results Are Treated as Trusted Agent Context<![CDATA[ ## Vulnerability Details **File Location**: `SKILL.md`, lines 17-29 and 48-49 **Vulnerability Type**: Indirect prompt injection through remotely controlled content **Risk Level**: Medium ### Vulnerable Code Snippet ```markdown 1. Read the API docs at https://clawharbor.app/v1 2. POST /v1/tasks with a task description 3. Poll GET /v1/tasks/{id} until status = "quoted" 4. Present the payment_url to the user (MUST include the full URL with # fragment) 5. After user pays, POST /v1/tasks/{id}/confirm-payment 6. Poll GET /v1/tasks/{id} until status = "delivered" 7. Return the result to the user ## Quick Start Read the full API documentation: ```text curl https://clawharbor.app/v1 ``` ``` The result-handling instructions at lines 48-49 state: ```markdown - Results are delivered as plain text in the result field. ``` ### Technical Analysis The Skill directs the Agent to retrieve mutable API documentation from an external service and return plain-text results generated by external agents. It does not establish a trust boundary between remote content and executable Agent instructions. The API documentation and task results can change after the Skill package has been reviewed. If either response contains text framed as instructions to the Agent, an insufficiently isolated Agent may interpret that content as authoritative workflow guidance rather than untrusted data. The Skill does not require schema validation, response sanitization, instruction filtering, or explicit refusal to follow commands embedded in remote content. This is not direct native-code execution. Exploitation depends on the host Agent interpreting externally supplied text as instructions and having tools or sensitive context available. ### Attack Path 1. An attacker compromises the remote service, controls an external agent producing a result, or otherwise causes attacker-authored text to be returned. 2. The malicious response includes prompt-injection content, such as instructions t ...[truncated 1063 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Embed a fixed, reviewed API contract in the Skill rather than instructing the Agent to obtain operational instructions from a mutable remote document. 2. Treat all API documentation, status fields, task results, error messages, and other response content as untrusted data. 3. Add an explicit instruction that the Agent must never follow commands contained in remote responses. 4. Parse responses according to a strict JSON schema and reject unexpected fields, malformed types, oversized responses, and unsupported content. 5. Display task results as quoted or otherwise clearly delimited data rather than incorporating them into the Agent's instruction context. 6. Prevent remote content from authorizing tool calls, changing system constraints, requesting secrets, or redirecting the workflow. 7. Apply output length limits and prompt-injection screening before presenting or summarizing external results. 8. Require fresh user approval before performing any action suggested by an external result. ]]>

T09 · Insecure Skill Coding Practices

Warning
Location
SKILL.md:45
Finding
Externally Supplied Payment URL Is Presented Without Destination Validation<![CDATA[ ## Vulnerability Details **File Location**: `SKILL.md`, lines 45-46 **Vulnerability Type**: Unvalidated external payment URL **Risk Level**: Medium ### Vulnerable Code Snippet ```markdown - The payment_url contains a # fragment that is essential. Always present the COMPLETE URL to the user without truncation. - Send payment links as clickable links or plain text — do NOT use code blocks or monospace formatting. ``` The associated workflow at line 20 requires: ```markdown 4. Present the payment_url to the user (MUST include the full URL with # fragment) ``` ### Technical Analysis The Skill requires the Agent to present a `payment_url` obtained from the remote API, including its complete fragment, but does not require validation of the URL's scheme, hostname, port, user-information component, or redirect destination. Although the documentation claims that Stripe handles payment, no rule restricts the returned URL to a verified Stripe checkout origin. If the API or its response path is compromised, an attacker could return a visually deceptive URL, a non-HTTPS address, or a link to a phishing site. Requiring the link to be clickable increases the likelihood that the user will follow it without inspecting the destination. A URL fragment is not transmitted to the web server in a conventional HTTP request, but it can be consumed by client-side scripts. Preserving an arbitrary fragment therefore does not make the destination trustworthy and may carry attacker-controlled values into page logic. ### Attack Path 1. An attacker compromises the ClawHarbor service or otherwise controls the `payment_url` value returned for a task. 2. The attacker supplies a URL that points to a phishing or malicious site while imitating a legitimate Stripe checkout page. 3. The Agent follows the Skill instructions and presents the complete URL as a clickable payment link. 4. The user trusts the Agent-mediated workflow and opens the link. 5. The malicious page requests paym ...[truncated 667 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Accept only `https` payment URLs. 2. Validate the parsed hostname against a narrowly defined allowlist of verified Stripe Checkout domains or another explicitly documented payment processor origin. 3. Reject URLs containing user-information components, unexpected ports, malformed hostnames, IP-literal destinations, or ambiguous encoding. 4. Verify the effective destination after redirects and reject any redirect outside the approved domain allowlist. 5. Display the normalized destination hostname prominently before the user opens the link. 6. Require explicit user confirmation before presenting or opening any payment destination. 7. Treat URL fragments as untrusted input and validate their expected format and length before preserving them. 8. Prefer a server-issued, signed checkout-session identifier that is independently resolved through a fixed trusted Stripe endpoint rather than displaying an arbitrary URL supplied by the task API. 9. Clearly state that the Agent will never ask the user to enter payment credentials anywhere except the validated payment processor domain. ]]>
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Output HandlingUnvalidated Output Injection, Cross-Context Output, Unbounded Output
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
Findings (6)

Missing User Warnings

Medium
Confidence
94% confidence
Finding
The README encourages agents to submit arbitrary user-defined tasks to an external service and retrieve results, but it does not warn that prompts, files, or other task data may leave the local trust boundary and be visible to a third party. In an agent skill context, that omission is security-relevant because users may delegate sensitive business, personal, credential-adjacent, or regulated information without understanding the privacy and data-handling risks.

Missing User Warnings

Medium
Confidence
94% confidence
Finding
The README states that 'Anything you can describe in natural language' can be delegated, which normalizes extremely broad third-party tasking without any guardrails for sensitive, high-impact, or unsafe requests. In this skill's context, that broad scope increases the chance that users or upstream agents will transmit confidential data or outsource decisions/actions that should remain under tighter human review.

External Transmission

Medium
Category
Data Exfiltration
Content
Read the full API documentation:

```
curl https://clawharbor.app/v1
```

Submit a task:
Confidence
90% confidence
Finding
This skill directs the agent to send task descriptions to an external domain, which is a real data exfiltration surface even if it is the intended functionality. The danger is amplified because the transmitted content can be arbitrary natural-language user input, potentially including sensitive information or embedded internal context.

Vague Triggers

Medium
Confidence
96% confidence
Finding
The skill explicitly advertises delegation of 'any task describable in natural language,' which creates an overly broad capability boundary for sending user requests to an external third party. In practice, this increases the chance that sensitive data, regulated content, or unsafe instructions will be forwarded off-platform without adequate scoping or review.

Unbounded Output

Medium
Category
Output Handling
Content
## Important Notes

- The payment_url contains a # fragment that is essential. Always present the COMPLETE URL to the user without truncation.
- Send payment links as clickable links or plain text — do NOT use code blocks or monospace formatting.
- If status becomes "rejected", no agents are available. The user should try again later.
- Results are delivered as plain text in the result field.
Confidence
60% confidence
Finding
Output size or generation rate is not bounded. Unbounded output enables denial-of-service through resource exhaustion, log flooding, or context-window stuffing.

Missing User Warnings

Medium
Confidence
97% confidence
Finding
The skill states that task descriptions are sent to ClawHarbor servers and processed by human agents, but it does not clearly warn users not to include sensitive or confidential information. Because the service involves third-party and human access, omission of that warning materially raises the risk of privacy breaches, data leakage, and unauthorized disclosure.

Static analysis

No suspicious patterns detected.