Back to skill

Security audit

OracleNet — Live Data & Capability Router for AI Agents

Security checks for vulnerabilities and agentic risk

Overview

OracleNet is a mostly coherent live-data router, but its bundled route script can send task intents to arbitrary HTTP(S) endpoints beyond the documented ToolOracle service.

Review before installing. Use this skill only when you are comfortable sending a minimal, nonsensitive routing summary to ToolOracle. Do not include secrets, personal data, confidential business details, wallet seed material, or full documents in the intent. Avoid the bundled script's --endpoint override unless you deliberately trust the exact HTTPS destination, and require explicit user approval before any paid x402 call.

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
scripts/route.py:194
Finding

Caller-Controlled Endpoint Permits Cleartext Intent Disclosure and Limited SSRF

Content
View full analysis

Vulnerability Details

File Location: scripts/route.py, lines 83, 194–195, and 230–231
Vulnerability Type: Arbitrary outbound HTTP(S) destination with insufficient transport and destination validation
Risk Level: Medium

Vulnerable Code

python
with urllib.request.urlopen(request, timeout=timeout) as response:  # noqa: S310 - fixed https endpoint
    status = response.status
    raw = response.read(MAX_RESPONSE_BYTES + 1)
python
parser.add_argument(
    "--endpoint", default=DEFAULT_ENDPOINT,
    help=f"handshake endpoint (default: {DEFAULT_ENDPOINT})",
)
python
if not args.endpoint.startswith(("http://", "https://")):
    return fail("--endpoint must be an http(s) URL", EXIT_USAGE)

The caller-controlled value is subsequently passed to the network function:

python
status, payload = post_handshake(args.endpoint, intent, args.timeout)

Inside post_handshake(), the complete intent is serialized and sent to that endpoint:

python
body = json.dumps({"intent": intent}).encode("utf-8")
request = urllib.request.Request(
    endpoint,
    data=body,
    method="POST",
    headers={
        "Content-Type": "application/json",
        "Accept": "application/json",
        "User-Agent": USER_AGENT,
    },
)

Technical Analysis

The Skill declares a fixed OracleNet handshake endpoint at https://tooloracle.io/handshake. However, route.py exposes an unrestricted --endpoint option and accepts both HTTPS and cleartext HTTP URLs.

This creates two related security issues:

  1. Intent disclosure: The complete natural-language intent is posted to the selected destination. An HTTP destination exposes it to network interception, while an attacker-controlled HTTPS destination receives it directly.
  2. Limited server-side request forgery: A caller can direct the script to issue an HTTP POST from the agent's network context to l ...[truncated 2806 chars]
Remediation
View remediation

Remediation Suggestions

  1. Remove endpoint customization from the production client if it is not required:

    python
    endpoint = DEFAULT_ENDPOINT
    
  2. Require the exact expected HTTPS origin and path:

    python
    from urllib.parse import urlsplit
    
    parsed = urlsplit(args.endpoint)
    if (
        parsed.scheme != "https"
        or parsed.hostname != "tooloracle.io"
        or parsed.port not in (None, 443)
        or parsed.path != "/handshake"
        or parsed.username is not None
        or parsed.password is not None
    ):
        return fail("endpoint must be https://tooloracle.io/handshake", EXIT_USAGE)
    
  3. If custom endpoints are an intentional development feature, place them behind an explicitly named option such as --allow-custom-endpoint, require interactive or principal confirmation, and display a warning that the complete intent will leave the system.

  4. Reject loopback, private, link-local, multicast, reserved, and unspecified IP address ranges after DNS resolution. Revalidate every resolved address immediately before connection to reduce DNS-rebinding risk.

  5. Disable redirects or validate every redirect target. In particular, reject HTTPS-to-HTTP redirects and redirects outside the approved origin.

  6. Never permit cleartext HTTP for intents. Enforce https rather than merely checking for either http:// or https://.

  7. Update the source annotation so it accurately reflects endpoint policy. The existing “fixed https endpoint” comment should only remain if the endpoint is actually fixed and HTTPS-only.

  8. Preserve the existing secret scanner as defense in depth, but clearly state that it is not a privacy filter. Require callers to submit only a minimal routing summary with sensitive identifiers removed.

Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • 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
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
Findings (4)

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
93% confidence
Finding

The skill explicitly instructs the agent to make outbound network requests, including POSTs to a third-party handshake endpoint and subsequent MCP/tool discovery calls, but it does not declare any tool scope or allowed-tools restrictions. That mismatch weakens policy enforcement and can let an agent with broader ambient network access perform unintended external communication beyond what a reviewer or runtime expects.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
84% confidence
Finding

The skill directs the agent to transmit user/task-derived intent text to an external service over the network without any technical guardrail enforcing sanitization or data minimization. Even though the prose warns not to send secrets, the handshake is designed as a default first step and could still leak sensitive prompts, internal context, regulated data, or user information if an upstream agent passes more than a minimal intent string.

Content

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

Step 2 — the free handshake

bash
curl -sS -X POST https://tooloracle.io/handshake \
  -H "Content-Type: application/json" \
  -d '{"intent":"Find current XRPL liquidity and verify the result"}'

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% 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 · references/route-recipes.md (reported line 46)May include surrounding context.

Next safe action: tools/list on the free endpoint, then call the tool.

bash
curl -sS -X POST https://tooloracle.io/eth/mcp/ \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"eth_gas","arguments":{}}}'

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The code comment and suppression note imply a fixed HTTPS destination, but the CLI accepts any user-supplied http:// or https:// URL via --endpoint and then sends the intent there. In an agent skill context, this enables exfiltration of task content to an attacker-controlled server and permits cleartext transmission over HTTP, undermining the script's stated trust and transport assumptions.

Content

No source excerpt is available for this finding.

Static analysis

Detected: suspicious.exposed_secret_literal

File appears to expose a hardcoded API secret or token.

Critical
Code
suspicious.exposed_secret_literal
Location
scripts/smoke_test.py:193