Back to skill

Security audit

Clawkey

Security checks for vulnerabilities and agentic risk

Overview

This identity-verification skill is coherent, but it should be reviewed because it sends stable agent identity data to third-party APIs and encourages recurring status checks without strong user-consent boundaries.

Review this before installing if you are comfortable registering an agent with ClawKey/VeryAI and sharing a stable device identifier, public key, signed challenge data, and verification status with their API. Treat device IDs as sensitive, avoid automatic heartbeat checks unless you want recurring status lookups, and do not use this as a high-stakes authorization signal unless the server-side protocol and privacy practices are independently acceptable.

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

T09 · Insecure Skill Coding Practices

Warning
Location
SKILL.md:88
Finding

Signed challenge does not cryptographically bind the complete registration context

Content
View full analysis

Vulnerability Details

File Location: SKILL.md:56-78 and SKILL.md:88-105
Vulnerability Type: Incomplete cryptographic context binding and insufficient replay protection
Risk Level: Medium

Vulnerable Code

javascript
const crypto = require("crypto");
const fs = require("fs");

const identityPath = `${process.env.HOME}/.openclaw/identity/device.json`;
const identity = JSON.parse(fs.readFileSync(identityPath, "utf8"));

const message = `clawkey-register-${Date.now()}`;
const privateKey = crypto.createPrivateKey(identity.privateKeyPem);
const signature = crypto.sign(null, Buffer.from(message, "utf8"), privateKey);

const publicKeyDer = crypto
  .createPublicKey(identity.publicKeyPem)
  .export({ type: "spki", format: "der" });

const challenge = {
  deviceId: identity.deviceId,
  publicKey: publicKeyDer.toString("base64"),
  message,
  signature: signature.toString("base64"),
  timestamp: Date.now(),
};
// POST challenge to https://api.clawkey.ai/v1/agent/register/init

The documented challenge construction also states:

markdown
1. **Choose the message to sign**
   For registration, use a one-time challenge to avoid replay, e.g.:
   - `clawkey-register-<unix_timestamp_ms>`

2. **Sign the message** with your Ed25519 **private** key. The signature must be over the **exact** UTF-8 bytes of `message` (no extra prefix/suffix).

Technical Analysis

The Ed25519 signature authenticates only the message string. It does not cryptographically bind the accompanying deviceId, publicKey, standalone timestamp, protocol version, endpoint, or operation type.

Consequently, the integrity of those unsigned fields depends entirely on undocumented server-side validation. If the server does not derive the device identity from the supplied public key and strictly validate every contextual field, an attacker possessing a captured valid request could attempt to replace ...[truncated 2253 chars]

Remediation
View remediation

Remediation Suggestions

  1. Require the server to generate a cryptographically random, high-entropy nonce before registration or verification.
  2. Give each nonce a short expiration period, bind it to the intended endpoint and session, and atomically mark it as consumed after successful use.
  3. Sign a canonical payload containing at least:
    • A fixed protocol domain, such as clawkey.ai
    • Protocol version
    • Intended operation, such as register/init or verify/signature
    • Server-issued nonce
    • Session identifier where applicable
    • deviceId
    • Public-key fingerprint
    • One consistently generated timestamp
  4. Use deterministic serialization or a formally specified binary encoding so that client and server sign and verify identical bytes.
  5. Derive or validate deviceId from the authenticated public key rather than trusting an independently supplied identifier.
  6. Generate the timestamp once and reuse the same value in both the signed payload and request metadata.
  7. Enforce a strict clock-skew window, reject expired requests, and maintain replay detection for all consumed nonces.
  8. Use distinct signed domains for registration and general signature verification to prevent cross-protocol reuse.

T09 · Insecure Skill Coding Practices

Note
Location
SKILL.md:188
Finding

Unauthenticated lookup exposes stable device registration and verification status

Content
View full analysis

Vulnerability Details

File Location: SKILL.md:174-176, SKILL.md:188-192, and HEARTBEAT.md:10-12
Vulnerability Type: Unauthenticated identity-status disclosure and device enumeration
Risk Level: Low

Vulnerable Code

markdown
- **Look up an agent by device id** — get registration and verification status:

```bash
curl "https://api.clawkey.ai/v1/agent/verify/device/DEVICE_ID"

Response: registered, verified, and optionally registeredAt.

text

The API reference explicitly documents that the endpoint requires no authentication:

```markdown
| Method | Endpoint                          | Auth | Description                                            |
| ------ | --------------------------------- | ---- | ------------------------------------------------------ |
| GET    | `/agent/verify/device/{deviceId}` | None | Get agent registration and verification status by device id. |

The heartbeat instructions encourage recurring use of the same endpoint:

bash
curl https://api.clawkey.ai/v1/agent/verify/device/YOUR_DEVICE_ID

Technical Analysis

The endpoint accepts a stable device identifier in the URL and returns whether the device is registered and verified, with an optional registration timestamp. It is explicitly documented as requiring no authentication or proof of key possession.

If device identifiers are public, leaked, reused across systems, or predictable, an unauthenticated party can query the endpoint to determine whether a particular agent is associated with a verified human. Differences between successful, unregistered, and not-found responses may also permit enumeration.

Placing the stable identifier in a URL can additionally expose it through access logs, reverse proxies, monitoring systems, command history, and other infrastructure that records request paths. Periodic heartbeat requests increase the frequency with which the identifier is disclosed to the e ...[truncated 1245 chars]

Remediation
View remediation

Remediation Suggestions

  1. Require proof of possession of the corresponding private key or an authorized access token before returning detailed device status.
  2. If public verification is a product requirement, issue a separate opaque, high-entropy public verification identifier instead of exposing an internal stable device ID.
  3. Return only the minimum public result needed by verifiers and omit registeredAt unless explicitly required.
  4. Normalize responses for nonexistent and unregistered identifiers where practical to reduce enumeration signals.
  5. Apply per-client and per-identifier rate limits, abuse detection, and monitoring for sequential or high-volume lookups.
  6. Avoid predictable device identifiers and document the privacy consequences of sharing them.
  7. Consider a signed, short-lived verification assertion that the agent can present to a third party without allowing arbitrary ongoing status queries.
  8. Ensure periodic heartbeat checks occur only with user consent and only when operationally necessary.
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
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
Findings (16)

External Transmission

Medium
Category
Data Exfiltration
Confidence
90% confidence
Finding

The skill instructs the agent to send a device identifier to an external service via a curl request. Even if this is the intended functionality, it creates an external data transmission path that can expose persistent identifiers and agent state to a third party, which is security-relevant and should be explicitly governed.

Content

Scanner excerpt · HEARTBEAT.md (reported line 12)May include surrounding context.

Are you registered and verified?

bash
curl https://api.clawkey.ai/v1/agent/verify/device/YOUR_DEVICE_ID

Use the same deviceId you use (or will use) for registration.

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 · SKILL.md (reported line 6)May include surrounding context.

md
version: 1.0.0
description: Verifiable human ownership for OpenClaw agents. Register your agent under your human owner via VeryAI palm verification.
homepage: https://clawkey.ai
metadata: { "category": "identity", "api_base": "https://api.clawkey.ai/v1" }
---

# ClawKey — Verifiable Human Ownership

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 · SKILL.md (reported line 100)May include surrounding context.

md
version: 1.0.0
description: Verifiable human ownership for OpenClaw agents. Register your agent under your human owner via VeryAI palm verification.
homepage: https://clawkey.ai
metadata: { "category": "identity", "api_base": "https://api.clawkey.ai/v1" }
---

# ClawKey — Verifiable Human Ownership

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 · SKILL.md (reported line 148)May include surrounding context.

md
version: 1.0.0
description: Verifiable human ownership for OpenClaw agents. Register your agent under your human owner via VeryAI palm verification.
homepage: https://clawkey.ai
metadata: { "category": "identity", "api_base": "https://api.clawkey.ai/v1" }
---

# ClawKey — Verifiable Human Ownership

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 · SKILL.md (reported line 181)May include surrounding context.

md
version: 1.0.0
description: Verifiable human ownership for OpenClaw agents. Register your agent under your human owner via VeryAI palm verification.
homepage: https://clawkey.ai
metadata: { "category": "identity", "api_base": "https://api.clawkey.ai/v1" }
---

# ClawKey — Verifiable Human Ownership

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 · SKILL.md (reported line 282)May include surrounding context.

md
version: 1.0.0
description: Verifiable human ownership for OpenClaw agents. Register your agent under your human owner via VeryAI palm verification.
homepage: https://clawkey.ai
metadata: { "category": "identity", "api_base": "https://api.clawkey.ai/v1" }
---

# ClawKey — Verifiable Human Ownership

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 · SKILL.md (reported line 17)May include surrounding context.

md
>
> Do **not** use `open`, `xdg-open`, `start`, or any command that opens a browser. Always output the **registration URL** as a text or markdown link for the user to click.
>
> - WRONG: `open "https://api.very.org/oauth2/..."`
> - CORRECT: "Open this link to complete verification: https://api.very.org/oauth2/..."

## Key files

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 · SKILL.md (reported line 18)May include surrounding context.

md
>
> Do **not** use `open`, `xdg-open`, `start`, or any command that opens a browser. Always output the **registration URL** as a text or markdown link for the user to click.
>
> - WRONG: `open "https://api.very.org/oauth2/..."`
> - CORRECT: "Open this link to complete verification: https://api.very.org/oauth2/..."

## Key files

Whitespace Padding

Medium
Category
Prompt Injection
Confidence
70% confidence
Finding

Large whitespace padding was detected (a block of blank lines or a long run of spaces). This can push injected instructions below or to the right of the visible area so a human reviewer never sees them while the agent still reads them. Manual review of the hidden content is recommended.

Content

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

md
## Key files

| File         | Purpose                                                                                   |
| ------------ | ----------------------------------------------------------------------------------------- |
| SKILL.md     | https://clawkey.ai/skill.md — registration flow, challenge generation, verification, API  |
| HEARTBEAT.md | https://clawkey.ai/heartbeat.md — periodic checklist: registration status, etc            |

External Transmission

Medium
Category
Data Exfiltration
Confidence
90% confidence
Finding

This step explicitly instructs posting challenge JSON to a third-party service, again without an explicit consent/privacy checkpoint. Because the JSON contains a stable deviceId and public-key challenge material, this creates a real privacy and tracking surface even if cryptographic handling is otherwise correct.

Content

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

md
1. Generate a challenge string, e.g. `clawkey-register-$(date +%s)000` (seconds + "000" for ms) or use your script’s convention.
2. Run the script to sign that message and get the challenge JSON.
3. POST that JSON to `https://api.clawkey.ai/v1/agent/register/init`.

Same challenge format works for `POST /agent/verify/signature` when verifying a signature remotely.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The skill instructs agents to send a stable device identifier, public key, signed message, and timestamp to a third-party API, but it does not clearly require explicit user notice or consent for that data sharing at the point of transmission. While the private key is correctly kept local, persistent identifiers and ownership/verification metadata can still enable tracking, correlation, and privacy leakage across services.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
94% confidence
Finding

This example directs transmission of identity-linked challenge data to an external service without any built-in gating for user approval or privacy notice. In context, the transmission is core to the feature, but it still exposes persistent identifiers and cryptographic metadata to a third party.

Content

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

Build an AgentChallenge as above, then send it to ClawKey to create a session and get a registration URL.

bash
curl -X POST https://api.clawkey.ai/v1/agent/register/init \
  -H "Content-Type: application/json" \
  -d '{
    "deviceId": "my-agent-device-id",

External Transmission

Medium
Category
Data Exfiltration
Confidence
94% confidence
Finding

This example directs transmission of identity-linked challenge data to an external service without any built-in gating for user approval or privacy notice. In context, the transmission is core to the feature, but it still exposes persistent identifiers and cryptographic metadata to a third party.

Content

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

Build an AgentChallenge as above, then send it to ClawKey to create a session and get a registration URL.

bash
curl -X POST https://api.clawkey.ai/v1/agent/register/init \
  -H "Content-Type: application/json" \
  -d '{
    "deviceId": "my-agent-device-id",

External Transmission

Medium
Category
Data Exfiltration
Confidence
91% confidence
Finding

This endpoint use is an operational instruction to send signed message material and device identity data to a third party. In context, that can expose verification events, message metadata, and persistent identifiers, making it a genuine privacy/security concern if invoked automatically or without user understanding.

Content

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

  • Verify a signature — check that a message was signed by the given key and whether that agent is registered under a verified human:
bash
curl -X POST https://api.clawkey.ai/v1/agent/verify/signature \
  -H "Content-Type: application/json" \
  -d '{
    "deviceId": "...",

External Transmission

Medium
Category
Data Exfiltration
Confidence
91% confidence
Finding

This endpoint use is an operational instruction to send signed message material and device identity data to a third party. In context, that can expose verification events, message metadata, and persistent identifiers, making it a genuine privacy/security concern if invoked automatically or without user understanding.

Content

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

  • Verify a signature — check that a message was signed by the given key and whether that agent is registered under a verified human:
bash
curl -X POST https://api.clawkey.ai/v1/agent/verify/signature \
  -H "Content-Type: application/json" \
  -d '{
    "deviceId": "...",

External Transmission

Medium
Category
Data Exfiltration
Confidence
88% confidence
Finding

Looking up a device by stable deviceId enables external querying of registration/verification state and can leak whether a given agent is associated with a verified human. In the wrong context, that supports enumeration, correlation, and privacy leakage around agent identity and ownership status.

Content

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

  • Look up an agent by device id — get registration and verification status:
bash
curl "https://api.clawkey.ai/v1/agent/verify/device/DEVICE_ID"

Response: registered, verified, and optionally registeredAt.

Static analysis

No suspicious patterns detected.