Back to skill

Security audit

Corall

Security checks for vulnerabilities and agentic risk

Overview

The skill is mostly coherent for a marketplace integration, but it includes unsafe setup guidance that can expose credentials and webhook tokens during high-impact account, payment, and public-agent operations.

Review this skill before installing. Use it only with dedicated Corall accounts, avoid printing credential files, avoid putting passwords or webhook tokens in visible command history, use HTTPS for any non-local webhook endpoint, rotate tokens if they were exposed, and confirm any payment, payout, order approval, or artifact upload before allowing the agent to proceed.

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

Error
Location
references/setup-provider-openclaw.md:63
Finding

Credential Files Are Printed into Agent and Terminal Output

Content
View full analysis
/dev/null || echo "No credentials found" ``` ``` `references/setup-employer.md:22-26`: ```bash Check for existing credentials: ```bash cat ~/.corall/credentials/employer.json 2>/dev/null || echo "No credentials found" ``` ``` ### Technical Analysis The setup workflows only need to determine whether the relevant profile is authenticated. Instead, they instruct the Agent to read and print the complete profile credential document. This exposes every value in the files to: - The Agent's active context. - Terminal output and scrollback. - Session transcripts and execution logs. - Screen recording and monitoring systems. - Any user or process able to observe the command output. This behavior also conflicts with the guides' later instruction to never display or log credential values. Reading and printing the complete files exceeds the minimum access necessary for setup because the purpose-built commands `corall auth me --profile provider` and `corall auth me --profile employer` can test authentication without directly exposing stored credentials. The exact contents of these JSON files are not documented in the audited project, so the presence of any particular token field cannot be asserted. Nevertheless, files explicitly designated as credentials must be handled as sensitive in their entirety. ### Attack Path 1. A user asks the Agent to configure a provider or employer profile. 2. The Agent follows the corresponding setup guide. 3. The Agent executes `cat` against the profile's credential file. 4. The complete credential document enters terminal output and potentially the Agent trans ...[truncated 903 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
references/setup-provider-openclaw.md:53
Finding

Passwords and Webhook Tokens Are Passed through Process Arguments

Content
View full analysis
``` ``` `references/setup-provider-openclaw.md:73-91`: ```bash **3a. Register (no existing account):** ```bash corall auth register https://yourdomain.com \ --email your-agent@example.com \ --password \ --name "My OpenClaw Agent" \ --profile provider ``` Use a dedicated account for agent operations — never the employer account. Password must be at least 6 characters. On failure with "Email already registered", use login instead. **3b. Login (existing account):** ```bash corall auth login https://yourdomain.com \ --email your-agent@example.com \ --password \ --profile provider ``` ``` `references/setup-employer.md:32-49`: ```bash **2a. Register (no existing account):** ```bash corall auth register https://yourdomain.com \ --email your-account@example.com \ --password \ --name "My Name" \ --profile employer ``` Password must be at least 6 characters. On failure with "Email already registered", use login instead. **2b. Login (existing account):** ```bash corall auth login https://yourdomain.com \ --email your-account@example.com \ --password \ --profile employer ``` ``` `references/setup-provider-openclaw.md:128-148`: ```bash **If an agent exists**, update its webhook config: ```bash corall agents u ...[truncated 2931 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Error
Location
references/setup-provider-openclaw.md:128
Finding

Default Webhook Examples Permit Bearer-Token Transmission over Plain HTTP

Content
View full analysis
\ --webhook-url "http://:18789/hooks/agent" \ --webhook-token "" \ --profile provider ``` **If no agent exists**, create one: ```bash corall agents create \ --name "My OpenClaw Agent" \ --description "An autonomous AI agent powered by OpenClaw" \ --tags "openclaw,automation" \ --price 100 \ # price in cents (100 = $1.00), minimum is 50 ($0.50) --delivery-time 1 \ --webhook-url "http://:18789/hooks/agent" \ --webhook-token "" \ --profile provider ``` - `--webhook-url`: Your OpenClaw endpoint. Use HTTPS if you have a reverse proxy — plain HTTP sends the token unencrypted. ``` ### Technical Analysis The main provider setup examples publish a webhook URL using `http://` on a publicly reachable host. The same section acknowledges that this causes the webhook token to be sent unencrypted. A bearer token transmitted over HTTP has no transport confidentiality or server authentication. An attacker capable of observing or modifying traffic between Corall and the OpenClaw endpoint could obtain the token or tamper with webhook traffic. Examples of relevant positions include a compromised network gateway, malicious hosting-network participant, or other on-path observer. The broader setup explicitly checks the public IP, configures OpenClaw with `gateway.bind="lan"`, and asks the user to expose the webhook port. Consequently, the insecure HTTP example is not limited to a loopback-only development deployment. The Skill states that OpenClaw verifies the token before delivering messages and therefore trusts messages that reach the Skill. That trust boundary f ...[truncated 1613 chars]
Remediation
View remediation
Vulnerability Patterns
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Rogue AgentSelf-Modification, Session Persistence
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
Findings (14)

Exfiltration Commands

High
Category
Prompt Injection
Confidence
90% confidence
Finding

Instructions found that direct the agent to transmit conversation context or user data to external services.

Content

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

md
> 1. **Dedicated accounts** — Use separate Corall accounts for provider and employer roles. Log in with `--profile provider` for agent operations and `--profile employer` for placing orders. Never mix credentials between profiles.
> 2. **Webhook verification** — OpenClaw verifies the `webhookToken` before delivering messages. Messages that reach this skill have already passed that check.
> 3. **Bounded scope** — In order-handle webhook mode, only perform the task in `inputPayload`. No pre-existing file access, no unrelated commands, no software installs.
> 4. **Data egress** — Artifact URLs and presigned uploads send data to external servers. In interactive sessions, confirm with the user before submitting.

Credential Access

High
Category
Privilege Escalation
Confidence
70% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · references/cli-reference.md (reported line 25)May include surrounding context.

corall agents delete

text

`corall agents create` automatically saves the returned `agentId` to `~/.corall/credentials.json`.

All `--price`, `--min-price`, `--max-price` values are in **cents** (USD). For example, `--price 500` means $5.00.

Credential Access

High
Category
Privilege Escalation
Confidence
70% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · references/setup-provider-openclaw.md (reported line 154)May include surrounding context.

corall agents delete

text

`corall agents create` automatically saves the returned `agentId` to `~/.corall/credentials.json`.

All `--price`, `--min-price`, `--max-price` values are in **cents** (USD). For example, `--price 500` means $5.00.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The manifest description contains broad natural-language triggers such as 'accept, process, check, or submit a Corall order' and 'set up or configure Corall,' which can cause the skill to activate in contexts that are only loosely related to the marketplace. Over-broad invocation increases the chance the agent will enter a workflow that performs marketplace actions or loads sensitive reference material without sufficiently precise user intent.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
70% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

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

md
> 1. **Dedicated accounts** — Use separate Corall accounts for provider and employer roles. Log in with `--profile provider` for agent operations and `--profile employer` for placing orders. Never mix credentials between profiles.
> 2. **Webhook verification** — OpenClaw verifies the `webhookToken` before delivering messages. Messages that reach this skill have already passed that check.
> 3. **Bounded scope** — In order-handle webhook mode, only perform the task in `inputPayload`. No pre-existing file access, no unrelated commands, no software installs.
> 4. **Data egress** — Artifact URLs and presigned uploads send data to external servers. In interactive sessions, confirm with the user before submitting.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The markdown states that corall openclaw setup merges settings into the OpenClaw config file and identifies the written configPath, but it does not explicitly warn the user that it will modify a local configuration file and change network-related settings such as gateway.bind="lan". For markdown files, operations that affect user data or system integrity should include a clear warning about the behavior and its impact.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
85% confidence
Finding

The reference notes that corall upgrade fetches a release and replaces the running binary in-place, which is a system-modifying operation. While the action is described, there is no explicit cautionary warning about overwriting the installed executable or advising users to ensure they trust the source and have appropriate permissions.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
94% confidence
Finding

This example explicitly uploads a local file to an external presigned URL, which is a real data-egress mechanism. Although the documentation includes warnings to confirm content first and to avoid uploading pre-existing host files in webhook mode, the command pattern still enables exfiltration if an agent follows it with sensitive or unintended files.

Content

Scanner excerpt · references/file-upload.md (reported line 14)May include surrounding context.

md
PUBLIC_URL=$(echo "$PRESIGN" | jq -r '.publicUrl')

# Step 2: Upload
curl -fsSL -X PUT "$UPLOAD_URL" \
  -H "Content-Type: <mime>" \
  --data-binary @/path/to/file

External Transmission

Medium
Category
Data Exfiltration
Confidence
50% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · references/cli-reference.md (reported line 48)May include surrounding context.

md
Open the short payment link printed by the CLI in your browser and complete payment with a credit card or Stripe test card (`4242 4242 4242 4242`).

The link looks like: `https://api.corall.ai/pay/<order_id>`

After successful payment, the Stripe webhook will update the order status to `paid` automatically. Confirm the payment went through:

External Transmission

Medium
Category
Data Exfiltration
Confidence
50% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · references/cli-reference.md (reported line 58)May include surrounding context.

md
Open the short payment link printed by the CLI in your browser and complete payment with a credit card or Stripe test card (`4242 4242 4242 4242`).

The link looks like: `https://api.corall.ai/pay/<order_id>`

After successful payment, the Stripe webhook will update the order status to `paid` automatically. Confirm the payment went through:

External Transmission

Medium
Category
Data Exfiltration
Confidence
50% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · references/order-create.md (reported line 34)May include surrounding context.

md
Open the short payment link printed by the CLI in your browser and complete payment with a credit card or Stripe test card (`4242 4242 4242 4242`).

The link looks like: `https://api.corall.ai/pay/<order_id>`

After successful payment, the Stripe webhook will update the order status to `paid` automatically. Confirm the payment went through:

External Transmission

Medium
Category
Data Exfiltration
Confidence
79% confidence
Finding

The guide instructs users to open an externally hosted checkout URL and complete a payment flow, including using a test card or real card. This creates a real external transmission/payment action and, in an agent context, could lead to unintended purchases or sending users to the wrong environment if the target site or checkout domain is not explicitly validated.

Content

Scanner excerpt · references/setup-provider-openclaw.md (reported line 108)May include surrounding context.

corall subscriptions checkout quarterly --profile provider

text

The CLI prints a short checkout link (e.g. `https://api.corall.ai/checkout/<subscription_id>`) — open it in the browser and complete payment with a test card (`4242 4242 4242 4242`) or a real card. After payment, the webhook activates the Developer Club membership automatically.

Verify the membership is active:

Session Persistence

Medium
Category
Rogue Agent
Confidence
60% 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.

Content

Scanner excerpt · references/setup-provider-openclaw.md (reported line 118)May include surrounding context.

md
The response should show `"hasActiveSubscription": true`. If not, wait a few seconds for the webhook callback and retry.

## 5. Create or Update Agent

Check if an agent already exists:

Vague Triggers

Low
Category
Not specified by scanner
Confidence
85% confidence
Finding

This markdown guide describes what the skill does and how to proceed, but it does not define any explicit trigger phrases, activation boundaries, or negative examples. For a markdown skill file, that can make invocation scope ambiguous and increase the chance the skill is used in unintended contexts.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.