Back to skill

Security audit

DryptoBillions

Security checks for vulnerabilities and agentic risk

Overview

This identity skill is mostly coherent, but it handles long-lived private keys and signed identity messages in ways users should review carefully before installing.

Install only if you are comfortable with this skill creating and storing agent identity private keys under $HOME/.openclaw/billions, sending signed identity material through OpenClaw messages, and relying on the listed remote services and npm dependencies. Use a disposable or low-value identity, avoid passing existing private keys with --key, restrict filesystem access to the key directory, and prefer a reviewed/pinned release with fixed dependency and key-storage handling before using it for important identity workflows.

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
scripts/shared/storage/base.js:26
Finding

Plaintext Private Keys Are Stored Without Enforced Owner-Only Permissions

Content
View full analysis
entry.alias === args.alias); if (index >= 0) { keys[index].privateKeyHex = args.key; } else { keys.push({ alias: args.alias, privateKeyHex: args.key }); } await this.writeFile(keys); } ``` ```javascript // scripts/shared/storage/base.js:26-31 async writeFile(data) { await this.ensureDirectory(); const json = JSON.stringify(data, null, 2); const tempPath = `${this.filePath}.tmp`; await fs.writeFile(tempPath, json, "utf-8"); await fs.rename(tempPath, this.filePath); } ``` ### Technical Analysis The key store serializes raw private keys into `$HOME/.openclaw/billions/kms.json`. The common storage implementation creates the directory and temporary file without explicitly enforcing owner-only permissions. The resulting permissions depend on the process umask. Under a common `0022` umask, newly created files may be readable by other local accounts. The temporary file also contains the complete plaintext key before being renamed. No ownership, mode, or symbolic-link checks are performed. This behavior is necessary only to the extent that the Skill needs persistent signing capability. Storing unencrypted private keys with process-default permissions exceeds the minimum safe privilege required for that functionality. ### Attack Path 1. A user creates or imports an identity. 2. `KeysFileStorage.importKey()` places the raw private key in an in-memory JSON object. 3. `FileStorage.writeFile()` writes the object to `$HOME/.openclaw/billions/kms.json.tmp` without an explicit restrictive mode. 4. The temporary file is renamed to `kms.json`, ...[truncated 1033 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Error
Location
scripts/createNewEthereumIdentity.js:15
Finding

Private Keys Can Be Exposed Through Command-Line Arguments

Content
View full analysis
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/verifySignature.js:17
Finding

Signed Verification Tokens Can Be Replayed Because Challenges Do Not Expire or Get Consumed

Content
View full analysis
entry.did === did); if (index >= 0) { // Update existing entry entries[index] = { did, challenge, created_at }; } else { // Add new entry entries.push({ did, challenge, created_at }); } await this.writeFile(entries); } ``` ```javascript // scripts/verifySignature.js:17-24 // Get the stored challenge const challenge = await challengeStorage.getChallenge(args.did); if (!challenge) { console.error(`Error: No challenge found for DID: ${args.did}`); console.error("Generate a challenge first with generateChallenge.js"); process.exit(1); } ``` ```javascript // scripts/verifySignature.js:47-58 // Verify the challenge matches const payload = basicMessage.body; if (payload.message !== challenge) { console.error( `Error: Invalid signature: challenge mismatch ${payload.message} !== ${challenge}`, ); process.exit(1); } outputSuccess("Signature verified successfully"); ``` ### Technical Analysis The challenge record includes a creation timestamp, but verification does not inspect that timestamp or impose an expiration period. Successful verification also does not delete or otherwise mark the challenge as consumed. Consequently, the same signed token remains valid for as long ...[truncated 1859 chars]
Remediation
View remediation
Vulnerability Patterns
  • 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
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
Findings (30)

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding

The description frames the skill as identity/authentication tooling, but the documented behavior also includes direct outbound messaging via openclaw message send. That mismatch can mislead operators and agents into approving or invoking the skill without realizing it can exfiltrate signed tokens or verification URLs to arbitrary recipients.

Content

No source excerpt is available for this finding.

YARA rule 'agent_skill_prompt_injection_hidden_instructions': Prompt injection or hidden instructions embedded in AI agent skill text [agent_skills]

High
Category
YARA Match
Confidence
80% confidence
Finding

YARA rule matched a hack tool or exploit indicator (offensive tools, reconnaissance, privilege escalation, or exploit frameworks).

Content

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


name: DryptoBillions description: Billions/Iden3 authentication and identity management tools for agents. Link, proof, sign, and verify. metadata: { "category": "identity", "clawbot": { "requires": { "bins": ["node", "openclaw"] } }} homepage: https://billions.network/

When to use this Skill

Lets AI agents create and manage their own identities on the Billions Network, and link those identities to a human owner.

  1. When you need to link your agent identity to an owner.
  2. When you need sign a challenge.
  3. When you need link a human to the agent's DID.
  4. When you need to verify a signature to confirm identity ownership.
  5. When use shared JWT tokens for authentication.
  6. When you need to create and manage decentralized identities.

After installing the plugin run the following commands to create an identity and link it to your human DID:

bash
cd scripts && npm install && cd

Credential Access

High
Category
Privilege Escalation
Confidence
98% confidence
Finding

The skill documents that $HOME/.openclaw/billions/kms.json contains unencrypted private keys alongside credentials and identity metadata. In an agent-execution context, storing long-lived signing keys unencrypted on disk creates a severe secret-compromise risk: any local file access, log leakage, backup exposure, or adjacent tool misuse can result in identity theft and unauthorized signing.

Content

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

md
- `kms.json` - **CRITICAL**: Contains unencrypted private keys
- `defaultDid.json` - DID identifiers and public keys
- `challenges.json` - Authentication challenges history
- `credentials.json` - Verifiable credentials
- `identities.json` - Identity metadata
- `profiles.json` - Profile data

Known Vulnerable Dependency: ws==8.18.0 — 2 advisory(ies): CVE-2026-45736 (ws: Uninitialized memory disclosure); CVE-2026-48779 (ws: Memory exhaustion DoS from tiny fragments and data chunks)

High
Category
Supply Chain
Confidence
95% confidence
Finding

The dependency tree includes ws 8.18.0 with advisories for uninitialized memory disclosure and memory exhaustion DoS. In an authentication/identity skill, websocket use can expose sensitive session or identity data and may be reachable from untrusted peers, making both data leakage and denial-of-service more serious.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: snarkjs==0.5.0 — 1 advisory(ies): CVE-2023-33252 (Double spend in snarkjs)

High
Category
Supply Chain
Confidence
97% confidence
Finding

snarkjs 0.5.0 is a known-vulnerable cryptographic dependency with a reported double-spend issue. Because this skill is explicitly for Billions/Iden3 authentication and proof workflows, a flaw in zero-knowledge proof tooling directly undermines core security guarantees and could enable acceptance of invalid or replayed proofs depending on usage.

Content

No source excerpt is available for this finding.

YARA rule 'privilege_escalation_tools': Privilege escalation tools and techniques [hacktools]

High
Category
YARA Match
Confidence
75% confidence
Finding

YARA rule matched a hack tool or exploit indicator (offensive tools, reconnaissance, privilege escalation, or exploit frameworks).

Content

Scanner excerpt · scripts/package-lock.json (reported line 2318)May include surrounding context.

json
"@stablelib/binary": "^1.0.1",
        "@stablelib/chacha": "^1.0.1",
        "@stablelib/wipe": "^1.0.1"
      }
    },
    "node_modules/@stablelib/xchacha20poly1305": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/@stablelib/xchacha20poly1305/-/xchacha20poly1305-1.0.1.tgz",
      "integrity": "sha512-B1Abj0sMJ8h3HNmGnJ7vHBrAvxuNka6cJJoZ1ILN7iuacXp7sUYcgOVEOTLWj+rtQMpspY9tXSCRLPmN1mQNWg==",
      "license": "MIT",
      "dependencies": {
        "@stablelib/aead": "^1.0.1",
        "@stablelib/chacha20poly1305": "^1.0.1",
        "@stablelib/constant-time": "^1.0.1",
        "@stablelib/wipe": "^1.0.1",
        "@stablelib/xchacha20": "^1.0.1"
      }
    },
    "node_modules/@types/json-schema": {
      "version": "7.0.15",
      "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
      "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
      "license": "MIT",

Known Vulnerable Dependency: brace-expansion==1.1.14 — 3 advisory(ies): CVE-2026-13149 (brace-expansion: DoS via exponential-time expansion of consecutive non-expanding); CVE-2026-14257 (brace-expansion: DoS via unbounded expansion length causing an out-of-memory pro); CVE-2026-69152 (brace-expansion: DoS via unbounded intermediate arrays, bypassing the CVE-2026-1)

High
Category
Supply Chain
Confidence
90% confidence
Finding

brace-expansion 1.1.14 has multiple DoS advisories related to pathological expansion behavior and memory use. This is likely a lower-reach transitive utility, but if any user-controlled patterns flow into globbing or brace expansion during build, tooling, or runtime file handling, an attacker could trigger excessive CPU or memory consumption.

Content

No source excerpt is available for this finding.

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

md
function newDataStorage(ethStateStorage) {
  return {
    credential: new CredentialStorage(
      new IdentitiesFileStorage("credentials.json"),
    ),
    identity: new IdentityStorage(
      new IdentitiesFileStorage("identities.json"),

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 · scripts/shared/bootstrap.js (reported line 54)May include surrounding context.

js
function newDataStorage(ethStateStorage) {
  return {
    credential: new CredentialStorage(
      new IdentitiesFileStorage("credentials.json"),
    ),
    identity: new IdentityStorage(
      new IdentitiesFileStorage("identities.json"),

Context-Inappropriate Capability

High
Category
Not specified by scanner
Confidence
97% confidence
Finding

This code launches a subprocess to send direct messages through an external CLI, creating a powerful side-effecting channel unrelated to the stated Billions/Iden3 identity-management purpose. In an agent environment, such a capability can be abused to transmit prompts, secrets, or workflow results to arbitrary targets, and the shared utility placement makes accidental or covert invocation more likely.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
95% confidence
Finding

The README instructs users to run npx clawhub@latest install DryptoBillions, which pulls and executes the latest package version at install time rather than a pinned, reviewed release. This creates a supply-chain risk: if the clawhub package or a dependency is compromised upstream, users may execute attacker-controlled code during installation.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The trigger phrase Please link your agent identity to me. is broad and framed as a natural-language instruction without clear preconditions, authorization checks, or user-consent boundaries. In an agent setting, ambiguous trigger text can cause unintended invocation of identity-linking flows, potentially disclosing verification links or initiating sensitive actions in response to social engineering or prompt injection.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
95% confidence
Finding

This installation command again uses npx clawhub@latest, causing execution of whatever code is published under the latest tag at runtime. In a security-sensitive identity-management skill, this is especially risky because compromise at install time could expose keys, credentials, or modify verification behavior.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
91% confidence
Finding

The skill requires Node and the external openclaw binary and explicitly performs networking and local sensitive-data access, but it does not declare any explicit tool scope or permissions boundary. This increases the chance an agent will invoke capabilities broader than a user expects, especially in a skill that handles private keys and outbound identity messages.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
79% confidence
Finding

The script sends a generated pairing URL to another recipient via sendDirectMessage, and that URL encodes an authorization request used to link a human identity to the agent. While the file has a docstring about creating the URL, there is no visible user-facing disclosure, confirmation, or warning at the send step that identity-related verification data is being transmitted to args.to.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

This code persists private keys directly to a local JSON file as plaintext (privateKeyHex) with no encryption, access control, or integrity protection visible in this component. If the host filesystem is accessible to another local user, malware, backups, logs, or accidental file exposure, the stored keys can be stolen and used to impersonate identities or sign malicious data.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The utility exposes a hidden outbound messaging capability by invoking an external CLI (openclaw message send) from a shared helper. Even though execFileSync avoids classic shell injection and there is some input validation, this still expands the skill beyond identity/authentication into agent-to-agent communication, enabling unreviewed data exfiltration or unexpected side effects when reused elsewhere.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
33% confidence
Finding

The only potentially applicable natural-language policy category is language/locale policy. This file does not clearly impose a locale or language requirement, so this is at most a weak signal. Because the examples are in English but do not explicitly require English-only interaction, confidence is low.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: uuid==9.0.1 — 1 advisory(ies): CVE-2026-41907 (uuid: Missing buffer bounds check in v3/v5/v6 when buf is provided)

Low
Category
Supply Chain
Confidence
83% confidence
Finding

The lockfile includes uuid 9.0.1, which is flagged for a missing buffer bounds check in certain name-based UUID generation paths when a caller supplies a buffer. In this file alone there is no proof the vulnerable API is exercised, but shipping a known-vulnerable package in an identity/authentication skill increases risk because malformed input could trigger crashes or memory-safety issues in dependent code paths.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
89% confidence
Finding

The dependency list includes the explicitly locale-scoped package name @cspell/dict-en_us, which hard-codes a specific English locale in natural-language metadata. For a skill artifact, this can indicate a default language policy choice without any accompanying opt-in or documented justification in this file.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
86% confidence
Finding

The dependency list also includes @cspell/dict-en-gb, another explicit language/locale selection expressed in natural-language package metadata. Because this file provides no user-facing opt-in or justification, it presents the same locale-policy concern.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: uuid==8.3.2 — 1 advisory(ies): CVE-2026-41907 (uuid: Missing buffer bounds check in v3/v5/v6 when buf is provided)

Low
Category
Supply Chain
Confidence
82% confidence
Finding

uuid 8.3.2 is also flagged for the same missing buffer bounds check issue. Although exploitability depends on actual API usage, retaining known-vulnerable UUID libraries in an auth-related dependency graph is unnecessary risk and could become reachable through transitive code paths.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: @stablelib/ed25519==1.0.3 — 1 advisory(ies): GHSA-x3ff-w252-2g7j (StableLib Ed25519 Signature Malleability via Missing S < L Check)

Low
Category
Supply Chain
Confidence
88% confidence
Finding

@stablelib/ed25519 1.0.3 is flagged for signature malleability due to a missing S < L check. In an identity and signing skill, signature verification weaknesses are especially relevant because they can permit alternate encodings of signatures that may bypass deduplication, replay protections, or strict verification assumptions in higher-level logic.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: elliptic==6.6.1 — 1 advisory(ies): CVE-2025-14505 (Elliptic Uses a Cryptographic Primitive with a Risky Implementation)

Low
Category
Supply Chain
Confidence
72% confidence
Finding

elliptic 6.6.1 is flagged for use of a risky cryptographic implementation. In a skill centered on authentication, signing, and verification, reliance on weak or brittle crypto primitives is more concerning than in a non-security-sensitive tool, even if practical exploitability depends on exact algorithm usage.

Content

No source excerpt is available for this finding.

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
93% confidence
Finding

The dependency uses a caret range, allowing npm to install newer compatible releases without explicit review. In a security-sensitive identity and authentication skill, this increases supply-chain risk because a compromised or breaking upstream release could alter verification, proof, or signing behavior unexpectedly.

Content

Scanner excerpt · scripts/package.json (reported line 16)May include surrounding context.

json
"author": "BillionsNetwork",
  "license": "UNLICENSED",
  "dependencies": {
    "@0xpolygonid/js-sdk": "^1.3.0",
    "@iden3/js-iden3-auth": "^1.0.3",
    "@iden3/js-iden3-core": "^1.4.1",
    "ethers": "^6.13.4",