Back to skill

Security audit

BlindOracle - Privacy-First Agent Infrastructure

Security checks for vulnerabilities and agentic risk

Overview

The skill is a high-impact payments and transfer wrapper that is partly disclosed, but it obscures the underlying crypto rails and relies on unsafe, unaudited runtime imports and weak payment checks.

Install only if you are comfortable with a third-party financial/crypto skill that can initiate settlement, conversion, swap, and withdrawal workflows. Require truthful rail names in user-facing output, explicit per-transaction confirmation, payment-proof validation, domain/tool scoping, and packaged or pinned dependencies before using it with real funds or autonomous agents.

Vulnerability Patterns
  • Insecure DependenciesIntroduces malicious components through unsafe dependency sources
  • 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 (3)

T09 · Insecure Skill Coding Practices

Error
Location
handler.py:439
Finding

Payment Authorization Bypass Through Unvalidated payment_proof Presence Check

Content
View full analysis
0 and "payment_proof" not in request: amount, currency, details = self._calculate_payment(capability, params) logger.info(f"[Brand A] Payment required: {amount} {currency}") return payment_required_response(amount, currency, details) # Security gateway approved, denial_reason, security_details = self._wrap_security(request) if not approved: logger.warning(f"[Brand A] Security denied: {denial_reason}") return error_response(403, f"Security check failed: {denial_reason}") # Route to handler with translation result = self._route_capability(capability, params) if security_details: result["security"] = _translate_response_b_to_a(security_details) return result ``` The security wrapper constructs its request without including the payment proof: ```python security_request = SecurityRequest( interface="openclaw_skill_brand_a", operation=brand_b_capability, agent_id=agent_id, parameters=_translate_params_a_to_b(params), amount_sats=params.get("stake_units", params.get("transfer_units", 0)), security_level=security_level, metadata={"request_id": request.get("id", "unknown"), "brand": "A"}, ) ``` ### Technical Analysis The paid-capability gate verifies only that the `payment_proof` key exists in the request. It does not validate the value's type, signature, payer, recipient, amount, asset, network, confirmation state, expiration, nonce, or replay status. Consequently, values such as `null`, an empty object, an arbitrary string, or a forged structure satisfy the local authorization condition. The proof is not passed into `_wrap_security()` and `_route_capability()` forwards only the translated capability paramete ...[truncated 1362 chars]
Remediation
View remediation

T08 · Insecure Dependencies

Error
Location
handler.py:28
Finding

Unsafe Import-Path Manipulation Enables Local Dependency and Handler Hijacking

Content
View full analysis
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
handler.py:341
Finding

Unvalidated Financial Amounts Permit Invalid Fees and Denial of Service

Content
View full analysis
Tuple[str, str, Dict[str, Any]]: """Calculate payment required for capability.""" pricing = CAPABILITY_PRICING.get(capability, {"base_fee": 0.0, "currency": "USDC"}) base_fee = pricing["base_fee"] currency = pricing["currency"] if "percentage" in pricing: # Check both Brand A and B param names for amount amount = params.get("stake_units", params.get("transfer_units", params.get("request_units", params.get("amount_sats", 0)))) percentage_fee = amount * pricing["percentage"] total = base_fee + percentage_fee else: total = base_fee details = { "capability": capability, "base_fee": base_fee, } if "percentage" in pricing: details["percentage_fee"] = pricing["percentage"] return f"{total:.6f}", currency, details ``` ### Technical Analysis The payment calculator consumes user-controlled amount fields without validating their type, sign, maximum value, precision, or denomination. Negative numeric values can produce zero or negative payment requests. Strings, containers, or incompatible objects can raise exceptions during multiplication or formatting. The implementation also uses binary floating-point values for financial fee calculations. This can introduce rounding discrepancies, especially for large or high-precision amounts. There is no clearly enforced conversion between the documented stake or transfer units and USDC, increasing the risk of inconsistent fee calculation. Although the outer request handler catches resulting exceptions, malformed inputs can reliably force error responses and generate exception logs. Invalid negative fees may in ...[truncated 1384 chars]
Remediation
View remediation
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 (7)

Intent-Code Divergence

High
Category
Not specified by scanner
Confidence
96% confidence
Finding

The module docstring explicitly claims a privacy-first sanitized wrapper with no cryptocurrency-specific terms, while the implementation maps user-facing operations to crypto trading, Lightning/ETH withdrawals, and prediction-market actions. This kind of deliberate capability relabeling can mislead operators, reviewers, and policy enforcement layers into approving or invoking higher-risk financial functionality under innocuous names.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

High
Category
Not specified by scanner
Confidence
97% confidence
Finding

The Brand A to Brand B mapping materially changes the apparent meaning of operations, for example translating benign-sounding account, credential, transfer, and settlement requests into prediction placement, token minting, swaps, and withdrawals. This semantic mismatch is dangerous because security review, user intent, logging, and policy enforcement may all operate on the misleading outer label rather than the real privileged backend action.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

High
Category
Not specified by scanner
Confidence
91% confidence
Finding

The handler exposes cross-rail swaps and blockchain withdrawal functions through sanitized labels such as transfer and settlement operations, which conceals that the skill can move value across crypto rails. In an agent skill context, hidden fund-movement functionality materially increases abuse risk, especially if platform reviewers or calling agents believe they are invoking ordinary privacy/account features.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The README promotes payment, settlement, and transfer operations, including instant settlement, on-chain settlement, and cross-rail conversion, but does not clearly warn users that these actions can move real funds, may be irreversible, and can incur fees or losses if misused. In an agent-skill context, ambiguous documentation increases the chance that autonomous or semi-autonomous users invoke financial capabilities without adequate operator consent, confirmation, or understanding of consequences.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
91% confidence
Finding

The skill advertises external API endpoints and invocation patterns that require network access, but the manifest does not declare any explicit tool scope such as permissions or allowed-tools. This creates a transparency and policy-enforcement gap: a host may not present or constrain the skill's network behavior clearly, increasing the chance of unexpected outbound requests to a third-party service handling forecasts, identity, and payments.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The skill includes settlement, transfer, conversion, and micropayment capabilities that can move funds and potentially trigger irreversible on-chain or cross-rail transactions, yet it does not prominently warn users about financial risk, transaction finality, fees, or the need for explicit confirmation. In an agent context, this omission is dangerous because users may authorize actions they do not fully understand, and an autonomous workflow could invoke value-moving operations with insufficient friction.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The code intentionally scrubs cryptocurrency-specific language from external responses and positions this as a compliance feature, which can suppress signals that users, monitors, or governance controls need to understand the true nature of an operation. While string sanitization alone is not direct code execution risk, here it functions as concealment that amplifies the danger of the hidden financial capabilities elsewhere in the skill.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.