Back to skill

Security audit

Oracle-X API

Security checks for vulnerabilities and agentic risk

Overview

This skill is mostly coherent Oracle-X API documentation, but it needs Review because it can send account tokens and user prompts to a configurable HTTP service without clear transport or destination safeguards.

Install only if you intend to use a trusted Oracle-X instance. Keep ORACLE_X_TOKEN short-lived and scoped to the account you want queried, use HTTPS for any remote ORACLE_X_URL, avoid sending tokens to plain HTTP except localhost, and be aware that authenticated chat, watchlist, and analysis-job calls can access personal data or spend the operator's provider budget.

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

T09 · Insecure Skill Coding Practices

Warning
Location
examples/client.py:22
Finding

Bearer credentials can be transmitted over unencrypted HTTP

Content
View full analysis
dict[str, str]: if not authenticated: return {} if not TOKEN: raise OracleXError( "This endpoint needs a signed-in user. Set ORACLE_X_TOKEN to a " "Supabase access token (see references/auth.md)." ) return {"Authorization": f"Bearer {TOKEN}"} ``` The related configuration documentation explicitly allows a remote instance without requiring TLS: ```bash export ORACLE_X_URL=http://localhost:8000 # default; set for a remote instance export ORACLE_X_TOKEN=... # only for chat and watchlist ``` ### Technical Analysis The client reads an unrestricted, user-controlled base URL from `ORACLE_X_URL`. For authenticated requests, it attaches a live Supabase JWT using the HTTP `Authorization` header. The URL is not parsed or validated to ensure that non-loopback destinations use HTTPS. Plain HTTP is generally acceptable for a service bound exclusively to the local loopback interface. However, the documentation permits users to set the variable to a remote instance without requiring an `https://` scheme. If a remote plaintext endpoint is configured, the JWT and authenticated request or response content can be observed or modified by an attacker with a network position. The credential is necessary for the declared authenticated functionality, and the implementation correctly avoids attaching it to public calls. The security issue is therefore not excessive credential use, but the absence of transport and destination controls around ...[truncated 1584 chars]
Remediation
View remediation

T08 · Insecure Dependencies

Note
Location
examples/README.md:6
Finding

Unpinned third-party dependency installation

Content
View full analysis
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
  • Tool MisuseTool Parameter Abuse, Chaining Abuse, Unsafe Defaults
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
Findings (18)

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 70)May include surrounding context.

md
description: Base URL of the running Oracle-X instance. Defaults to http://localhost:8000.
      - name: ORACLE_X_TOKEN
        required: false
        description: Supabase access token, needed only for the chat and watchlist endpoints.
---

# Oracle-X

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

md
description: Base URL of the running Oracle-X instance. Defaults to http://localhost:8000.
      - name: ORACLE_X_TOKEN
        required: false
        description: Supabase access token, needed only for the chat and watchlist endpoints.
---

# Oracle-X

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 · examples/client.py (reported line 49)May include surrounding context.

python
description: Base URL of the running Oracle-X instance. Defaults to http://localhost:8000.
      - name: ORACLE_X_TOKEN
        required: false
        description: Supabase access token, needed only for the chat and watchlist endpoints.
---

# Oracle-X

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 · references/auth.md (reported line 26)May include surrounding context.

md
description: Base URL of the running Oracle-X instance. Defaults to http://localhost:8000.
      - name: ORACLE_X_TOKEN
        required: false
        description: Supabase access token, needed only for the chat and watchlist endpoints.
---

# Oracle-X

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
80% confidence
Finding

Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Content

Scanner excerpt · references/auth.md (reported line 15)May include surrounding context.

md
|---|---|
| `POST /api/chat` | Runs on the caller's own LLM provider settings. |
| `POST /api/chat/jobs`, `GET /api/chat/jobs/{job_id}` | A chat job holds a question and its answer. |
| `GET/POST/DELETE /api/chat/history`, `/api/chat/sessions*` | The caller's conversations. |
| `GET/POST/DELETE /api/home/watchlist` | The caller's tracked symbols. |
| `POST /api/analysis/jobs/{timeframe}` | Generation spends the instance's provider budget. |

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
80% confidence
Finding

Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Content

Scanner excerpt · references/auth.md (reported line 16)May include surrounding context.

md
| `POST /api/chat` | Runs on the caller's own LLM provider settings. |
| `POST /api/chat/jobs`, `GET /api/chat/jobs/{job_id}` | A chat job holds a question and its answer. |
| `GET/POST/DELETE /api/chat/history`, `/api/chat/sessions*` | The caller's conversations. |
| `GET/POST/DELETE /api/home/watchlist` | The caller's tracked symbols. |
| `POST /api/analysis/jobs/{timeframe}` | Generation spends the instance's provider budget. |

Prices, technicals, candles, news, analysis reports, macro, chains,

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 · references/auth.md (reported line 34)May include surrounding context.

key in local storage, and session.access_token is the field.

  1. Sign in against Supabase directly, if the user gives you credentials to use. This returns an access token valid for an hour:

    bash
    curl -sf -X POST \
    

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 · references/auth.md (reported line 62)May include surrounding context.

key in local storage, and session.access_token is the field.

  1. Sign in against Supabase directly, if the user gives you credentials to use. This returns an access token valid for an hour:

    bash
    curl -sf -X POST \
    

External Script Fetching

High
Category
Supply Chain
Confidence
90% confidence
Finding

Remote code is downloaded and executed. This bypasses code review and could introduce malicious code.

Content

Scanner excerpt · references/auth.md (reported line 37)May include surrounding context.

use. This returns an access token valid for an hour:

bash
curl -sf -X POST \
  "$SUPABASE_URL/auth/v1/token?grant_type=password" \
  -H "apikey: $SUPABASE_ANON_KEY" \
  -H 'Content-Type: application/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 · references/auth.md (reported line 76)May include surrounding context.

text

- `200` — the token is good.
- `401` — missing, malformed or expired. Supabase access tokens are short-lived;
  an hour-old token is usually the explanation.
- `403` — the account is suspended. `get_current_user` refuses suspended
  accounts at the one choke point every authenticated route passes through.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
94% confidence
Finding

The skill declares network and environment-dependent behavior but does not explicitly constrain tool permissions or allowed tools. That increases the chance an agent runtime will grant broader-than-necessary access, enabling unintended outbound requests or environment-variable use beyond this skill's stated purpose.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

The activation text is extremely broad, instructing invocation for many common finance-related prompts and whenever localhost:8000 is listening. This can cause over-triggering, unnecessary external calls, and accidental transmission of user queries or symbols to a local or configured service without sufficiently specific user intent.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
92% confidence
Finding

The skill is designed to send user-derived market queries and, in some cases, authenticated requests to an external or local HTTP service. Any invocation can transmit user interests, prompts, symbols, and potentially sensitive context to a service whose trust boundary is outside the agent, especially when ORACLE_X_URL is configurable or defaults to localhost where another process may be listening.

Content

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

bash
BASE="${ORACLE_X_URL:-http://localhost:8000}"

curl -sf "$BASE/api/price/BTCUSDT"
curl -sf "$BASE/api/technical/AAPL"
curl -sf "$BASE/api/rag/query?q=bitcoin%20halving%20price%20behavior&symbol=BTC"
curl -sf -H "Authorization: Bearer $ORACLE_X_TOKEN" \

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/auth.md (reported line 37)May include surrounding context.

use. This returns an access token valid for an hour:

bash
curl -sf -X POST \
  "$SUPABASE_URL/auth/v1/token?grant_type=password" \
  -H "apikey: $SUPABASE_ANON_KEY" \
  -H 'Content-Type: application/json' \

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
89% confidence
Finding

This line instructs the skill to respond in a specific way whenever a question mentions BIST/TEFAS/KAP/VİOP, effectively enforcing a locale-based handling rule. The file does not present this as a user-selectable preference or opt-in, so it can be read as a natural-language locale policy constraint.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
98% confidence
Finding

The manifest explicitly says BIST, TEFAS, KAP, and VİOP belong to the separate oracle-x-bist skill and are not part of this one. However, the documented GET /api/market/indices endpoint says it returns global indices including BIST, which expands the skill's described market coverage beyond what the manifest claims.

Content

No source excerpt is available for this finding.

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
84% confidence
Finding

This markdown file states that ORACLE_X_TOKEN is used for chat and watchlist endpoints and that those endpoints are 'scoped to a person', but it does not explicitly warn users that using the token may access or transmit account-specific data. For a skill description, a brief privacy warning would improve disclosure around authenticated operations affecting user data.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
81% confidence
Finding

The natural-language description explicitly excludes Borsa İstanbul content from this skill and directs it elsewhere, including Turkish-market-specific instruments, without framing this as a user choice. While the separation may be intentional, the text imposes a locale/market constraint in mandatory language rather than offering opt-in selection within the interaction.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.