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<![CDATA[ ## Vulnerability Details **File Locations**: - `references/setup-provider-openclaw.md:63-67` - `references/setup-employer.md:22-26` **Vulnerability Type**: Sensitive credential disclosure **Risk Level**: High ### Vulnerable Code `references/setup-provider-openclaw.md:63-67`: ```bash Check for existing credentials: ```bash cat ~/.corall/credentials/provider.json 2>/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
<![CDATA[ ## Remediation Suggestions 1. Remove both `cat ~/.corall/credentials/...` instructions. 2. Use the CLI's scoped authentication checks instead: ```bash corall auth me --profile provider corall auth me --profile employer ``` 3. If setup must distinguish a missing file from an invalid login, test only for existence without reading its contents: ```bash if test -f "$HOME/.corall/credentials/provider.json"; then echo "Provider credential file exists" else echo "No provider credential file found" fi ``` 4. Do not print, parse, summarize, or return credential-file contents to the Agent. 5. Have the CLI enforce restrictive credential-file permissions, such as owner-only read/write access. 6. Add regression tests that fail if setup documentation instructs an Agent to print files under credential or secret directories. ]]>

T09 · Insecure Skill Coding Practices

Warning
Location
references/setup-provider-openclaw.md:53
Finding
Passwords and Webhook Tokens Are Passed through Process Arguments<![CDATA[ ## Vulnerability Details **File Locations**: - `references/setup-provider-openclaw.md:53-56` - `references/setup-provider-openclaw.md:73-91` - `references/setup-provider-openclaw.md:128-148` - `references/setup-employer.md:32-49` - `references/cli-reference.md:6-9` - `references/cli-reference.md:19-20` - `references/cli-reference.md:96` **Vulnerability Type**: Exposure of authentication secrets through command-line arguments **Risk Level**: Medium ### Vulnerable Code `references/setup-provider-openclaw.md:53-56`: ```bash To force a specific token (e.g. rotating or re-registering an existing agent): ```bash corall openclaw setup --webhook-token <your-token> ``` ``` `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 <strong-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 <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 <strong-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 <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
<![CDATA[ ## Remediation Suggestions 1. Add secure secret-input support to the CLI, such as: ```bash corall auth login https://yourdomain.com \ --email your-agent@example.com \ --password-stdin \ --profile provider ``` 2. Read passwords through a no-echo interactive prompt when a TTY is available. 3. Provide equivalent protected input for webhook tokens, such as `--webhook-token-stdin` or a restricted file descriptor. 4. Do not accept secrets through environment variables as the primary alternative because environments may also be exposed through diagnostics and process inspection. 5. Ensure Agent tool-call logging redacts secret-bearing fields and values. 6. Avoid returning generated tokens through ordinary stdout if stdout is captured. Use a protected secret handoff mechanism. 7. Support token rotation and revoke any token suspected of appearing in process logs or transcripts. 8. Warn users not to paste complete secret-bearing commands into shared terminals, issue trackers, or chat systems. ]]>

T09 · Insecure Skill Coding Practices

Error
Location
references/setup-provider-openclaw.md:128
Finding
Default Webhook Examples Permit Bearer-Token Transmission over Plain HTTP<![CDATA[ ## Vulnerability Details **File Location**: `references/setup-provider-openclaw.md:128-151` **Vulnerability Type**: Plaintext transmission of sensitive authentication data **Risk Level**: High ### Vulnerable Code ```bash **If an agent exists**, update its webhook config: ```bash corall agents update <agent_id> \ --webhook-url "http://<your-ip>:18789/hooks/agent" \ --webhook-token "<webhookToken from Step 2>" \ --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://<your-ip>:18789/hooks/agent" \ --webhook-token "<webhookToken from Step 2>" \ --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
<![CDATA[ ## Remediation Suggestions 1. Replace all public webhook examples with HTTPS URLs: ```bash --webhook-url "https://agent.example.com/hooks/agent" ``` 2. Make HTTPS mandatory for every non-loopback webhook endpoint. 3. Have the CLI reject public `http://` webhook URLs rather than merely warning about them. 4. Permit plaintext HTTP only for explicit local development addresses such as loopback interfaces, with a prominent warning. 5. Provide documented reverse-proxy configuration using a valid TLS certificate and modern TLS settings. 6. Consider a mutually authenticated tunnel or mTLS where direct public TLS termination is not practical. 7. Rotate the webhook token after migrating an existing HTTP deployment to HTTPS because the old token may already have been exposed. 8. Add replay resistance, such as timestamp validation, unique request identifiers, and signed request bodies, so possession or capture of one request does not allow indefinite replay. 9. Rate-limit and audit failed webhook authentication attempts. ]]>
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
Content
> 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.
Confidence
90% confidence
Finding
Instructions found that direct the agent to transmit conversation context or user data to external services.

Credential Access

High
Category
Privilege Escalation
Content
corall agents delete <id>
```

`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.
Confidence
70% confidence
Finding
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Credential Access

High
Category
Privilege Escalation
Content
corall agents delete <id>
```

`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.
Confidence
70% confidence
Finding
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Vague Triggers

Medium
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.

External Transmission

Medium
Category
Data Exfiltration
Content
> 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.
Confidence
70% 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
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.

Missing User Warnings

Medium
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.

External Transmission

Medium
Category
Data Exfiltration
Content
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
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.

External Transmission

Medium
Category
Data Exfiltration
Content
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:
Confidence
50% 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
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:
Confidence
50% 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
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:
Confidence
50% 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
corall subscriptions checkout quarterly --profile provider
```

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:
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.

Session Persistence

Medium
Category
Rogue Agent
Content
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:
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.

Vague Triggers

Low
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.

Static analysis

No suspicious patterns detected.