Back to skill

Security audit

OlaXBT Nexus Data

Security checks for vulnerabilities and agentic risk

Overview

This crypto data skill mostly behaves like an API client, but it needs Review because it includes under-disclosed private-key signing code and can send JWTs to configurable endpoints.

Install only if you trust the publisher and can keep configuration locked down. Do not provide a wallet private key to this package, avoid using NexusAuth, do not override NEXUS_AUTH_URL or NEXUS_DATA_URL except in a trusted test environment, and treat NEXUS_JWT as a bearer secret that can spend credits or access account-scoped API data.

Vulnerability Patterns
  • Unauthorized Access and Privilege EscalationObtains permissions beyond the task's legitimate needs
  • 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
Findings (2)

T09 · Insecure Skill Coding Practices

Error
Location
src/olaxbt_nexus_data/__init__.py:82
Finding
JWT Disclosure Through Unrestricted API Base URL Overrides<![CDATA[ ## Vulnerability Details **File Location**: `src/olaxbt_nexus_data/__init__.py:82-83`; `src/olaxbt_nexus_data/core/client.py:127-149`; `src/olaxbt_nexus_data/core/auth.py:440-453` **Vulnerability Type**: Credential disclosure through unrestricted authenticated request destinations **Risk Level**: High ### Vulnerable Code ```python # src/olaxbt_nexus_data/__init__.py:82-83 self.auth_url = auth_url or os.getenv( "NEXUS_AUTH_URL", "https://api.olaxbt.xyz/api", ) self.data_url = data_url or os.getenv( "NEXUS_DATA_URL", "https://api-data.olaxbt.xyz/api/v1", ) ``` ```python # src/olaxbt_nexus_data/core/client.py:127-149 # Build URL url = f"{self.base_url}/{endpoint.lstrip('/')}" # Prepare headers request_headers = { "Content-Type": "application/json", "User-Agent": f"OlaXBT-Nexus-Client/{self.auth.wallet_address[:10]}...", "X-Request-ID": generate_request_id(), } if require_auth: try: auth_headers = self.auth.get_auth_headers() request_headers.update(auth_headers) except AuthenticationError as e: logger.error(f"Authentication failed: {str(e)}") raise if headers: request_headers.update(headers) ``` ```python # src/olaxbt_nexus_data/core/auth.py:440-453 def get_auth_headers(self) -> Dict[str, str]: return { "Authorization": f"Bearer {self._jwt}", "X-Request-ID": generate_request_id(), "X-Wallet-Address": self.wallet_address, } def get_credits_balance(self) -> Dict[str, Any]: endpoint = f"{self.auth_url}/credits/balance" try: headers = self.get_auth_headers() response = requests.get( endpoint, headers=headers, timeout=self.security_config.timeout, ) ``` ### Technical Analysis The client accepts `auth_url` and `data_url` from constructor arguments or environment variables without validating their schemes or hosts. The request layer then unconditionally attaches the wallet-linked JWT ...[truncated 2289 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Enforce HTTPS for every authenticated endpoint: ```python from urllib.parse import urlparse def validate_api_url(url: str, allowed_hosts: set[str]) -> str: parsed = urlparse(url) if parsed.scheme != "https": raise ValueError("Authenticated API URLs must use HTTPS") if parsed.hostname not in allowed_hosts: raise ValueError("API host is not permitted") if parsed.username or parsed.password: raise ValueError("Credentials in API URLs are prohibited") return url.rstrip("/") ``` 2. Allowlist the documented service hosts: - `api.olaxbt.xyz` for authentication requests. - `api-data.olaxbt.xyz` for data requests. 3. If custom endpoints are required for testing, require an explicit development-only option such as `allow_unsafe_custom_origin=False`. Do not enable it through an implicitly trusted environment variable in production. 4. Bind credentials to their intended origin. Before adding `Authorization`, verify that the destination has the expected HTTPS scheme, hostname, and port. 5. Disable credential forwarding during redirects, or reject cross-origin redirects entirely. This protection should be tested explicitly because HTTP libraries may follow redirects. 6. Add automated tests confirming that: - HTTP URLs are rejected. - Unknown hosts are rejected. - Cross-origin redirects do not receive the JWT. - Official HTTPS endpoints continue to work. 7. Update the documentation so that any supported custom endpoint behavior and associated trust requirements are stated accurately. ]]>

T05 · Unauthorized Access and Privilege Escalation

Warning
Location
src/olaxbt_nexus_data/core/auth.py:58
Finding
Exported Legacy Authentication Class Retains and Uses Ethereum Private Keys<![CDATA[ ## Vulnerability Details **File Location**: `src/olaxbt_nexus_data/core/auth.py:58-89`, `198-205`, and `212-241`; `src/olaxbt_nexus_data/__init__.py:187-193` **Vulnerability Type**: Excessive sensitive-key capability and arbitrary-message signing **Risk Level**: Medium ### Vulnerable Code ```python # src/olaxbt_nexus_data/core/auth.py:58-89 def __init__( self, wallet_address: str, private_key: str, auth_url: str, security_config: SecurityConfig, ): """ Initialize authentication client. Args: wallet_address: Ethereum wallet address private_key: Ethereum private key auth_url: Authentication API URL security_config: Security configuration Raises: ValidationError: If credentials are invalid """ # Validate inputs if not validate_wallet_address(wallet_address): raise ValidationError( f"Invalid wallet address format: {wallet_address[:20]}..." ) if not validate_private_key(private_key): raise ValidationError( "Invalid private key format. Should be 0x + 64 hex characters" ) # Store credentials self.wallet_address = wallet_address self.private_key = private_key ``` ```python # src/olaxbt_nexus_data/core/auth.py:198-205 try: # Use personal_sign (EIP-191) signed = w3.eth.account.sign_message( text=message, private_key=self.private_key, ) return signed.signature.hex() ``` ```python # src/olaxbt_nexus_data/core/auth.py:212-241 def _get_jwt_token(self, auth_message: str, signature: str) -> str: """ Exchange signature for JWT token. Args: auth_message: Original auth message signature: Signed message Returns: JWT token Raises: AuthenticationError: If token exchange fails """ endpoint = f"{self.auth_url}/auth/wallet" try: # Extract nonce from message (simplified) import re nonce_mat ...[truncated 3808 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Remove `NexusAuth` from this JWT-only package and remove it from `__all__`. 2. Delete private-key validation and signing code that is not required by `NexusClient`. 3. Remove `web3` from mandatory dependencies if no remaining JWT-only functionality requires it. This reduces both supply-chain and runtime attack surface. 4. If wallet authentication must remain available, move it into a separate, explicitly named package or optional module whose purpose and security implications are clearly documented. 5. For any retained wallet-signing flow: - Require HTTPS. - Strictly allowlist the official authentication host. - Reject redirects to different origins. - Parse and validate the complete message format. - Verify the expected domain, URI, chain ID, nonce, expiration, and statement before signing. - Prefer a recognized structured sign-in standard, such as SIWE/EIP-4361, with full semantic validation. - Require explicit user confirmation showing the complete message before signing. - Avoid retaining the private key as a long-lived object attribute. - Prefer an external wallet provider or hardware wallet so the package never receives the raw private key. 6. Add regression tests ensuring the JWT-only public API cannot accept private keys and that no private-key-related class is exported unintentionally. 7. Correct documentation and package metadata so the stated security model matches the actual exported capabilities. ]]>
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
Findings (70)

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding
A skill described as not handling private keys but validating wallet credentials would mislead users about the sensitivity of inputs and the trust required. In a cryptocurrency context, any hidden or under-disclosed expectation to process private-key material is especially dangerous because compromise or misuse can directly lead to asset loss.

Tp4

High
Category
MCP Tool Poisoning
Confidence
93% confidence
Finding
A skill described as not handling private keys but validating wallet credentials would mislead users about the sensitivity of inputs and the trust required. In a cryptocurrency context, any hidden or under-disclosed expectation to process private-key material is especially dangerous because compromise or misuse can directly lead to asset loss.

Tp4

High
Category
MCP Tool Poisoning
Confidence
96% confidence
Finding
A skill described as not handling private keys but validating wallet credentials would mislead users about the sensitivity of inputs and the trust required. In a cryptocurrency context, any hidden or under-disclosed expectation to process private-key material is especially dangerous because compromise or misuse can directly lead to asset loss.

Description-Behavior Mismatch

High
Confidence
98% confidence
Finding
The module includes a full wallet/private-key authentication path despite the skill being described as JWT-only with no private key handling. In an agent-skill context, introducing unnecessary key-handling and signing capability expands the trust boundary and creates a route for sensitive credential exposure or misuse if the class is wired up, imported elsewhere, or later enabled by configuration.

Context-Inappropriate Capability

High
Confidence
98% confidence
Finding
The code performs local Ethereum message signing with a supplied private key, which is inconsistent with the stated JWT-only purpose and gives the skill cryptographic authority it should not need. In practice, any bug, malicious prompt path, or future feature reuse around this code could turn the skill into a signer for attacker-chosen messages or lead to theft/exposure of wallet credentials.

Intent-Code Divergence

Medium
Confidence
95% confidence
Finding
The changelog materially contradicts the skill metadata: it says the skill uses a wallet-linked JWT with no private key in scope, yet the release notes claim 'private key encryption and secure storage.' That inconsistency is dangerous because it can conceal a broader secret-handling trust boundary than advertised, causing deployers to grant the skill access to signing material or misjudge the consequences of compromise.

Skill Enumeration

Medium
Category
Agent Snooping
Content
![License](https://img.shields.io/badge/license-MIT-yellow)
![OpenClaw](https://img.shields.io/badge/OpenClaw-2026.3.0%2B-orange)

Official OlaXBT Nexus Data API integration for OpenClaw agents. This skill uses a **JWT only** (no private key in the skill). Obtain the JWT via the [Nexus auth flow](https://github.com/olaxbt/olaxbt-skills-hub/blob/main/skills/nexus/SKILL.md); then set `NEXUS_JWT` and use the client.

## Features
Confidence
80% confidence
Finding
Skill enumerates or reads other installed skills. Access to other skills' SKILL.md files or the skills directory reveals prompt instructions, capabilities, and secrets that should be invisible to peer skills.

Skill Enumeration

Medium
Category
Agent Snooping
Content
![License](https://img.shields.io/badge/license-MIT-yellow)
![OpenClaw](https://img.shields.io/badge/OpenClaw-2026.3.0%2B-orange)

Official OlaXBT Nexus Data API integration for OpenClaw agents. This skill uses a **JWT only** (no private key in the skill). Obtain the JWT via the [Nexus auth flow](https://github.com/olaxbt/olaxbt-skills-hub/blob/main/skills/nexus/SKILL.md); then set `NEXUS_JWT` and use the client.

## Features
Confidence
80% confidence
Finding
Skill enumerates or reads other installed skills. Access to other skills' SKILL.md files or the skills directory reveals prompt instructions, capabilities, and secrets that should be invisible to peer skills.

Skill Enumeration

Medium
Category
Agent Snooping
Content
![License](https://img.shields.io/badge/license-MIT-yellow)
![OpenClaw](https://img.shields.io/badge/OpenClaw-2026.3.0%2B-orange)

Official OlaXBT Nexus Data API integration for OpenClaw agents. This skill uses a **JWT only** (no private key in the skill). Obtain the JWT via the [Nexus auth flow](https://github.com/olaxbt/olaxbt-skills-hub/blob/main/skills/nexus/SKILL.md); then set `NEXUS_JWT` and use the client.

## Features
Confidence
80% confidence
Finding
Skill enumerates or reads other installed skills. Access to other skills' SKILL.md files or the skills directory reveals prompt instructions, capabilities, and secrets that should be invisible to peer skills.

Skill Enumeration

Medium
Category
Agent Snooping
Content
![License](https://img.shields.io/badge/license-MIT-yellow)
![OpenClaw](https://img.shields.io/badge/OpenClaw-2026.3.0%2B-orange)

Official OlaXBT Nexus Data API integration for OpenClaw agents. This skill uses a **JWT only** (no private key in the skill). Obtain the JWT via the [Nexus auth flow](https://github.com/olaxbt/olaxbt-skills-hub/blob/main/skills/nexus/SKILL.md); then set `NEXUS_JWT` and use the client.

## Features
Confidence
80% confidence
Finding
Skill enumerates or reads other installed skills. Access to other skills' SKILL.md files or the skills directory reveals prompt instructions, capabilities, and secrets that should be invisible to peer skills.

Skill Enumeration

Medium
Category
Agent Snooping
Content
![License](https://img.shields.io/badge/license-MIT-yellow)
![OpenClaw](https://img.shields.io/badge/OpenClaw-2026.3.0%2B-orange)

Official OlaXBT Nexus Data API integration for OpenClaw agents. This skill uses a **JWT only** (no private key in the skill). Obtain the JWT via the [Nexus auth flow](https://github.com/olaxbt/olaxbt-skills-hub/blob/main/skills/nexus/SKILL.md); then set `NEXUS_JWT` and use the client.

## Features
Confidence
80% confidence
Finding
Skill enumerates or reads other installed skills. Access to other skills' SKILL.md files or the skills directory reveals prompt instructions, capabilities, and secrets that should be invisible to peer skills.

Skill Enumeration

Medium
Category
Agent Snooping
Content
![License](https://img.shields.io/badge/license-MIT-yellow)
![OpenClaw](https://img.shields.io/badge/OpenClaw-2026.3.0%2B-orange)

Official OlaXBT Nexus Data API integration for OpenClaw agents. This skill uses a **JWT only** (no private key in the skill). Obtain the JWT via the [Nexus auth flow](https://github.com/olaxbt/olaxbt-skills-hub/blob/main/skills/nexus/SKILL.md); then set `NEXUS_JWT` and use the client.

## Features
Confidence
80% confidence
Finding
Skill enumerates or reads other installed skills. Access to other skills' SKILL.md files or the skills directory reveals prompt instructions, capabilities, and secrets that should be invisible to peer skills.

Skill Enumeration

Medium
Category
Agent Snooping
Content
![License](https://img.shields.io/badge/license-MIT-yellow)
![OpenClaw](https://img.shields.io/badge/OpenClaw-2026.3.0%2B-orange)

Official OlaXBT Nexus Data API integration for OpenClaw agents. This skill uses a **JWT only** (no private key in the skill). Obtain the JWT via the [Nexus auth flow](https://github.com/olaxbt/olaxbt-skills-hub/blob/main/skills/nexus/SKILL.md); then set `NEXUS_JWT` and use the client.

## Features
Confidence
80% confidence
Finding
Skill enumerates or reads other installed skills. Access to other skills' SKILL.md files or the skills directory reveals prompt instructions, capabilities, and secrets that should be invisible to peer skills.

Skill Enumeration

Medium
Category
Agent Snooping
Content
![License](https://img.shields.io/badge/license-MIT-yellow)
![OpenClaw](https://img.shields.io/badge/OpenClaw-2026.3.0%2B-orange)

Official OlaXBT Nexus Data API integration for OpenClaw agents. This skill uses a **JWT only** (no private key in the skill). Obtain the JWT via the [Nexus auth flow](https://github.com/olaxbt/olaxbt-skills-hub/blob/main/skills/nexus/SKILL.md); then set `NEXUS_JWT` and use the client.

## Features
Confidence
80% confidence
Finding
Skill enumerates or reads other installed skills. Access to other skills' SKILL.md files or the skills directory reveals prompt instructions, capabilities, and secrets that should be invisible to peer skills.

Skill Enumeration

Medium
Category
Agent Snooping
Content
![License](https://img.shields.io/badge/license-MIT-yellow)
![OpenClaw](https://img.shields.io/badge/OpenClaw-2026.3.0%2B-orange)

Official OlaXBT Nexus Data API integration for OpenClaw agents. This skill uses a **JWT only** (no private key in the skill). Obtain the JWT via the [Nexus auth flow](https://github.com/olaxbt/olaxbt-skills-hub/blob/main/skills/nexus/SKILL.md); then set `NEXUS_JWT` and use the client.

## Features
Confidence
80% confidence
Finding
Skill enumerates or reads other installed skills. Access to other skills' SKILL.md files or the skills directory reveals prompt instructions, capabilities, and secrets that should be invisible to peer skills.

Skill Enumeration

Medium
Category
Agent Snooping
Content
![License](https://img.shields.io/badge/license-MIT-yellow)
![OpenClaw](https://img.shields.io/badge/OpenClaw-2026.3.0%2B-orange)

Official OlaXBT Nexus Data API integration for OpenClaw agents. This skill uses a **JWT only** (no private key in the skill). Obtain the JWT via the [Nexus auth flow](https://github.com/olaxbt/olaxbt-skills-hub/blob/main/skills/nexus/SKILL.md); then set `NEXUS_JWT` and use the client.

## Features
Confidence
80% confidence
Finding
Skill enumerates or reads other installed skills. Access to other skills' SKILL.md files or the skills directory reveals prompt instructions, capabilities, and secrets that should be invisible to peer skills.

Skill Enumeration

Medium
Category
Agent Snooping
Content
![License](https://img.shields.io/badge/license-MIT-yellow)
![OpenClaw](https://img.shields.io/badge/OpenClaw-2026.3.0%2B-orange)

Official OlaXBT Nexus Data API integration for OpenClaw agents. This skill uses a **JWT only** (no private key in the skill). Obtain the JWT via the [Nexus auth flow](https://github.com/olaxbt/olaxbt-skills-hub/blob/main/skills/nexus/SKILL.md); then set `NEXUS_JWT` and use the client.

## Features
Confidence
80% confidence
Finding
Skill enumerates or reads other installed skills. Access to other skills' SKILL.md files or the skills directory reveals prompt instructions, capabilities, and secrets that should be invisible to peer skills.

Skill Enumeration

Medium
Category
Agent Snooping
Content
![License](https://img.shields.io/badge/license-MIT-yellow)
![OpenClaw](https://img.shields.io/badge/OpenClaw-2026.3.0%2B-orange)

Official OlaXBT Nexus Data API integration for OpenClaw agents. This skill uses a **JWT only** (no private key in the skill). Obtain the JWT via the [Nexus auth flow](https://github.com/olaxbt/olaxbt-skills-hub/blob/main/skills/nexus/SKILL.md); then set `NEXUS_JWT` and use the client.

## Features
Confidence
80% confidence
Finding
Skill enumerates or reads other installed skills. Access to other skills' SKILL.md files or the skills directory reveals prompt instructions, capabilities, and secrets that should be invisible to peer skills.

External Transmission

Medium
Category
Data Exfiltration
Content
The skill does **not** handle private keys. Get a JWT using the [Nexus Skills API auth flow](https://github.com/olaxbt/olaxbt-skills-hub/blob/main/skills/nexus/SKILL.md):
1. `POST https://api.olaxbt.xyz/api/auth/message` with `{"address": "0x..."}`
2. Sign the returned message with your wallet (e.g. OpenClaw or one-time sign-in)
3. `POST https://api.olaxbt.xyz/api/auth/wallet` with address, signature, message, nonce → receive `token` (JWT)
4. Set `export NEXUS_JWT="<token>"` and use the client

```python
Confidence
71% confidence
Finding
This step instructs users to send address, signature, message, and nonce to an external service to obtain a JWT. Even though this is a legitimate auth flow, signed wallet authentication artifacts are sensitive and, if mishandled, logged, or sent to an untrusted or overrideable endpoint, could enable account/session takeover or replay within the service's acceptance rules. The skill context makes this less suspicious than generic exfiltration because wallet login is expected, but it still carries real credential-handling risk.

External Transmission

Medium
Category
Data Exfiltration
Content
NEXUS_JWT="<your-jwt-from-nexus-auth-flow>"

# Optional
NEXUS_AUTH_URL="https://api.olaxbt.xyz/api"
NEXUS_DATA_URL="https://api-data.olaxbt.xyz/api/v1"
```
Confidence
84% confidence
Finding
The README explicitly allows overriding NEXUS_AUTH_URL and NEXUS_DATA_URL via environment variables. If an attacker can influence the runtime environment, they can redirect the client to attacker-controlled endpoints and capture the JWT or all subsequent authenticated traffic, turning a normal external API integration into credential exfiltration. In an agent-skill context, environment-variable driven endpoint control is more dangerous because users often install and run skills without closely auditing all env sources.

External Transmission

Medium
Category
Data Exfiltration
Content
client = NexusClient(
    jwt_token="...",  # optional, else uses NEXUS_JWT
    auth_url="https://api.olaxbt.xyz/api",
    data_url="https://api-data.olaxbt.xyz/api/v1",
    timeout=30,
    max_retries=3,
Confidence
86% confidence
Finding
The client configuration example shows caller-supplied auth_url and data_url parameters, which can permit runtime redirection of authenticated requests to arbitrary servers. Combined with a JWT-bearing client, this creates a straightforward path for token exfiltration or man-in-the-middle style abuse if untrusted code or config can set these values. Because the skill's only credential is the JWT, endpoint redirection materially weakens the trust boundary.

Lp3

Medium
Category
MCP Least Privilege
Confidence
88% confidence
Finding
The skill declares no explicit tool scope even though it requires environment access and makes networked API calls. In an agent environment, missing permission boundaries can let the skill operate with broader capabilities than users expect, increasing the chance of unintended data exposure or misuse of credentials like NEXUS_JWT.

Missing User Warnings

Medium
Confidence
97% confidence
Finding
The example prints the JWT token to stdout, even if truncated, which exposes sensitive credential material in terminals, shell history captures, CI logs, notebooks, screen recordings, or centralized log collection systems. Because this is a wallet-linked bearer token for API access, any leaked portion or future modification to print the full token creates unnecessary credential exposure risk in a sample users may copy into production workflows.

External Transmission

Medium
Category
Data Exfiltration
Content
"POST /auth/message, sign the message with your wallet, POST /auth/wallet, then set NEXUS_JWT."
            )

        self.auth_url = auth_url or os.getenv("NEXUS_AUTH_URL", "https://api.olaxbt.xyz/api")
        self.data_url = data_url or os.getenv("NEXUS_DATA_URL", "https://api-data.olaxbt.xyz/api/v1")

        self.security_config = SecurityConfig(
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
"POST /auth/message, sign the message with your wallet, POST /auth/wallet, then set NEXUS_JWT."
            )

        self.auth_url = auth_url or os.getenv("NEXUS_AUTH_URL", "https://api.olaxbt.xyz/api")
        self.data_url = data_url or os.getenv("NEXUS_DATA_URL", "https://api-data.olaxbt.xyz/api/v1")

        self.security_config = SecurityConfig(
Confidence
60% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Static analysis

No suspicious patterns detected.