Back to skill

Security audit

Danube

Security checks for vulnerabilities and agentic risk

Overview

This skill is a disclosed Danube integration that gives agents broad tool access through a user-provided key, with meaningful consent guardrails for sensitive actions.

Install this only if you trust Danube with the tools and services connected to your account. Prefer OAuth or narrowly scoped API keys, enable confirmation for destructive or paid actions, avoid pasting keys into shell history or shared config, and treat any unmasked credential returned by a tool as a live secret.

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 (1)

T09 · Insecure Skill Coding Practices

Warning
Location
SKILL.md:59
Finding
Plaintext API Key Exposure Through Shell Commands and Persistent Configuration## Vulnerability Details **File Location**: `SKILL.md:59-74` and `references/troubleshooting.md:13-17` **Vulnerability Type**: Plaintext sensitive credential handling **Risk Level**: Medium ### Vulnerable Code `SKILL.md:59-74`: ```markdown ### 2. Make the key available to OpenClaw Set `DANUBE_API_KEY` in the environment, or in `openclaw.json`: ```json5 { skills: { entries: { danube: { apiKey: "YOUR_DANUBE_API_KEY" } } } } ``` ### 3a. Connect natively over MCP (recommended) OpenClaw has a built-in MCP client. Register Danube's server once and its tools become ordinary OpenClaw tools (`search_tools`, `execute_tool`, …): ```bash openclaw mcp set danube '{"url":"https://mcp.danubeai.com/mcp","transport":"streamable-http","headers":{"danube-api-key":"YOUR_DANUBE_API_KEY"}}' openclaw mcp doctor danube --probe ``` Use the real key value in `headers` (not `${DANUBE_API_KEY}`). The server also speaks MCP OAuth: use `"auth":"oauth"` instead of `headers`, then `openclaw mcp login danube`. ``` `references/troubleshooting.md:13-17`: ```markdown If the key lives only in `openclaw.json`, make sure it's under the skill's entry, which is what `primaryEnv` binds to: ```json5 { skills: { entries: { danube: { enabled: true, apiKey: "YOUR_DANUBE_API_KEY" } } } } ``` ``` ### Technical Analysis The instructions explicitly direct users to substitute a live Danube API key into an `openclaw mcp set` command and permit storing the key directly in `openclaw.json`. Although authentication to Danube is necessary for the Skill's declared functionality, placing the secret directly in a command or plaintext configuration expands its exposure beyond the minimum necessary scope. A key embedded in a command can be retained in shell history and may be visible temporarily through process inspection or terminal/session logging. A key persisted in configuration can be exposed through permissive file permissions, backups, synchr ...[truncated 2350 chars]
Remediation
## Remediation Suggestions 1. Make the documented MCP OAuth flow the default setup method: ```bash openclaw mcp set danube '{"url":"https://mcp.danubeai.com/mcp","transport":"streamable-http","auth":"oauth"}' openclaw mcp login danube ``` This avoids placing a reusable API key directly in command history. 2. If an API key must be used, integrate with a supported secret manager or protected credential facility rather than embedding the value in a command or general configuration file. 3. Avoid command-line arguments containing live credentials. If OpenClaw cannot securely resolve environment variables in MCP headers, document that limitation and recommend OAuth rather than instructing users to paste the key into the command. 4. If plaintext configuration remains supported, require restrictive file permissions and document them explicitly. For example, ensure that only the owning user can read the configuration. 5. Recommend narrowly scoped Danube keys restricted to only the required services and tools. Enable destructive-operation confirmation and conservative spending limits by default. 6. Ensure configuration files containing credentials are excluded from source control, support bundles, shared archives, and cloud synchronization unless encrypted. 7. Warn users to disable shell history temporarily or remove the relevant history entry if they previously pasted a key into a command. 8. Rotate any key that may already have appeared in shell history, logs, shared configuration, or backups, and review its Danube audit trail for unexpected activity.
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
Findings (17)

External Transmission

Medium
Category
Data Exfiltration
Content
env:
        - DANUBE_API_KEY
      bins:
        - curl
    primaryEnv: DANUBE_API_KEY
    envVars:
      - name: DANUBE_API_KEY
Confidence
60% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Autonomous Decision Making

Medium
Category
Excessive Agency
Content
## Guardrails (read these first)

- **Read freely, act with consent.** Discovery — listing services, searching tools, reading schemas, checking ratings, balances, or limits — needs no confirmation. Before any action that **writes, sends, posts, deletes, purchases, spends wallet funds, stores a credential, changes spending limits, or creates/updates/deletes a skill or workflow** — and before **any batch execution** — show the user the exact tool and parameters and get an explicit "yes".
- **Honour the confirmation handshake.** If `execute_tool` comes back with `_meta.confirmation_required: true`, the account's key requires consent for destructive calls: show the user the tool and the exact `parameters` from the response, get an explicit yes, then call again with the same parameters and the `confirm_token` (valid 5 minutes). Never call again with the token without asking.
- **Never invent credentials.** Only store an API key the user has explicitly handed you in this conversation, and confirm before storing. Otherwise send them to https://danubeai.com/dashboard to connect the service themselves.
- **Least data.** Pass only the parameters the task needs; don't forward unrelated personal data to third-party services.
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.

Autonomous Decision Making

Medium
Category
Excessive Agency
Content
## Guardrails (read these first)

- **Read freely, act with consent.** Discovery — listing services, searching tools, reading schemas, checking ratings, balances, or limits — needs no confirmation. Before any action that **writes, sends, posts, deletes, purchases, spends wallet funds, stores a credential, changes spending limits, or creates/updates/deletes a skill or workflow** — and before **any batch execution** — show the user the exact tool and parameters and get an explicit "yes".
- **Honour the confirmation handshake.** If `execute_tool` comes back with `_meta.confirmation_required: true`, the account's key requires consent for destructive calls: show the user the tool and the exact `parameters` from the response, get an explicit yes, then call again with the same parameters and the `confirm_token` (valid 5 minutes). Never call again with the token without asking.
- **Never invent credentials.** Only store an API key the user has explicitly handed you in this conversation, and confirm before storing. Otherwise send them to https://danubeai.com/dashboard to connect the service themselves.
- **Least data.** Pass only the parameters the task needs; don't forward unrelated personal data to third-party services.
- **Respect limits.** Don't raise spending limits or fund wallets unless the user asks for exactly that.
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.

Autonomous Decision Making

Medium
Category
Excessive Agency
Content
## Guardrails (read these first)

- **Read freely, act with consent.** Discovery — listing services, searching tools, reading schemas, checking ratings, balances, or limits — needs no confirmation. Before any action that **writes, sends, posts, deletes, purchases, spends wallet funds, stores a credential, changes spending limits, or creates/updates/deletes a skill or workflow** — and before **any batch execution** — show the user the exact tool and parameters and get an explicit "yes".
- **Honour the confirmation handshake.** If `execute_tool` comes back with `_meta.confirmation_required: true`, the account's key requires consent for destructive calls: show the user the tool and the exact `parameters` from the response, get an explicit yes, then call again with the same parameters and the `confirm_token` (valid 5 minutes). Never call again with the token without asking.
- **Never invent credentials.** Only store an API key the user has explicitly handed you in this conversation, and confirm before storing. Otherwise send them to https://danubeai.com/dashboard to connect the service themselves.
- **Least data.** Pass only the parameters the task needs; don't forward unrelated personal data to third-party services.
- **Respect limits.** Don't raise spending limits or fund wallets unless the user asks for exactly that.
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.

Autonomous Decision Making

Medium
Category
Excessive Agency
Content
## Guardrails (read these first)

- **Read freely, act with consent.** Discovery — listing services, searching tools, reading schemas, checking ratings, balances, or limits — needs no confirmation. Before any action that **writes, sends, posts, deletes, purchases, spends wallet funds, stores a credential, changes spending limits, or creates/updates/deletes a skill or workflow** — and before **any batch execution** — show the user the exact tool and parameters and get an explicit "yes".
- **Honour the confirmation handshake.** If `execute_tool` comes back with `_meta.confirmation_required: true`, the account's key requires consent for destructive calls: show the user the tool and the exact `parameters` from the response, get an explicit yes, then call again with the same parameters and the `confirm_token` (valid 5 minutes). Never call again with the token without asking.
- **Never invent credentials.** Only store an API key the user has explicitly handed you in this conversation, and confirm before storing. Otherwise send them to https://danubeai.com/dashboard to connect the service themselves.
- **Least data.** Pass only the parameters the task needs; don't forward unrelated personal data to third-party services.
- **Respect limits.** Don't raise spending limits or fund wallets unless the user asks for exactly that.
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.

External Transmission

Medium
Category
Data Exfiltration
Content
### 3b. Or use plain `curl` — no MCP needed

Every capability below is also a REST call against `https://api.danubeai.com/v1` with the header `danube-api-key: $DANUBE_API_KEY`. Copy-paste recipes: `{baseDir}/references/rest-api.md`.

## Working with tools
Confidence
72% confidence
Finding
The skill explicitly enables arbitrary REST calls to a large, dynamic catalog of third-party and privately connected tools using a single API key. Even though the document includes consent guardrails, this broad external execution surface can transmit sensitive user data or trigger powerful downstream actions if the agent is prompted incorrectly or if tool selection is manipulated.

External Transmission

Medium
Category
Data Exfiltration
Content
gates on), or when you want to see raw responses.

```bash
BASE="https://api.danubeai.com/v1"
AUTH="danube-api-key: ${DANUBE_API_KEY}"
```
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
gates on), or when you want to see raw responses.

```bash
BASE="https://api.danubeai.com/v1"
AUTH="danube-api-key: ${DANUBE_API_KEY}"
```
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
gates on), or when you want to see raw responses.

```bash
BASE="https://api.danubeai.com/v1"
AUTH="danube-api-key: ${DANUBE_API_KEY}"
```
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
gates on), or when you want to see raw responses.

```bash
BASE="https://api.danubeai.com/v1"
AUTH="danube-api-key: ${DANUBE_API_KEY}"
```
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
# Public catalog only — no key needed. category = communication | productivity | development |
# data | finance | marketing | social | analytics | security | infrastructure | ai_ml | design |
# education | health | other. sort = popular | new | name | trending.
curl -s "$BASE/services/public?category=communication&sort=popular&limit=20"

# Every tool of one service.
curl -s "$BASE/services/<SERVICE_ID>/tools" -H "$AUTH"
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
they want it stored:

```bash
curl -s -X POST "$BASE/credentials/store" \
  -H "$AUTH" -H "Content-Type: application/json" \
  -d '{"service_id": "<SERVICE_ID>", "credential_type": "bearer", "credential_value": "<KEY THE USER GAVE YOU>"}'
# credential_type: "bearer" or "api_key" — the tool's schema / auth_required error says which
Confidence
91% confidence
Finding
This example instructs the agent to transmit a user-provided credential to a remote credential storage endpoint. Even though the text says to do so only after user confirmation, the capability is inherently sensitive because it enables collection, transfer, and persistence of live secrets outside the immediate user context.

External Transmission

Medium
Category
Data Exfiltration
Content
# Read with the VAULT_ADDR / VAULT_TOKEN of the process that runs the tool: your
# data-plane agent or self-hosted deployment. The hosted service has no per-customer
# Vault setting, so it cannot reach your Vault.
curl -s -X POST "$BASE/credentials/store" \
  -H "$AUTH" -H "Content-Type: application/json" \
  -d '{"service_id": "<SERVICE_ID>", "credential_type": "bearer", "credential_value": "vault://secret/acme/api#token"}'
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
# Use a FRESH UUID each run: an unparseable one is a 400, and so is reusing one that
# already names an execution.
EXEC_ID=$(uuidgen | tr 'A-Z' 'a-z')   # or python3 -c 'import uuid;print(uuid.uuid4())'
curl -s -X POST "$BASE/workflows/<WORKFLOW_ID>/execute" \
  -H "$AUTH" -H "Content-Type: application/json" \
  -d "{\"inputs\": {\"url\": \"https://example.com\"}, \"execution_id\": \"$EXEC_ID\"}"
curl -s "$BASE/workflows/executions/$EXEC_ID" -H "$AUTH"
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
## Getting an API key without the dashboard (device flow)

```bash
curl -s -X POST "$BASE/auth/device/code" -H "Content-Type: application/json" -d '{"client_name": "OpenClaw"}'
# → {"device_code": "...", "user_code": "XXXX-XXXX", "verification_url": "https://...", "expires_in": 600, "interval": 5}
# The USER opens verification_url and enters user_code. Then poll:
curl -s -X POST "$BASE/auth/device/token" -H "Content-Type: application/json" -d '{"device_code": "<DEVICE_CODE>"}'
Confidence
60% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Scope Creep

Low
Category
Excessive Agency
Content
with no capture mapping, a self-hosted deployment (custody stays in the customer's own
environment), or a store that failed. These come back completely unmasked with
`_meta.redaction.passthrough_reason` explaining why, alongside `count: 0`. This is
not limited to short-lived handoff tokens like a Plaid *link* token: a Plaid **access**
token, a rotated webhook signing secret, and other durable secrets pass through this way.
Treat anything that arrives unmasked as a live secret — show the user where to put it,
don't echo it back, and don't paste it into a later call's parameters.
Confidence
84% confidence
Finding
The skill explicitly states that durable secrets such as access tokens and webhook signing secrets may be returned to the agent completely unmasked in some cases. Even with advisory language telling the agent not to echo or reuse them, exposing raw secrets to the model context creates a serious risk of accidental disclosure, retention in logs, or onward transmission to other tools.

Missing User Warnings

Low
Confidence
76% confidence
Finding
This markdown file includes a command that prints whether `DANUBE_API_KEY` is set along with its character count. Although it does not print the secret itself, it directs users to interact with a sensitive credential in the shell and the surrounding text does not include any caution about protecting or not sharing credential-related output.

Static analysis

No suspicious patterns detected.