Back to skill

Security audit

Molt Pmxt

Security checks for vulnerabilities and agentic risk

Overview

This skill is coherent and not deceptive, but it can place live prediction-market orders with private keys without enforceable safeguards.

Review before installing. Only use this skill if you intentionally want an agent to access live prediction-market accounts. Use dedicated low-balance accounts, least-privilege or revocable keys, explicit exchange selection, and external spending/confirmation controls; consider disabling order execution until the skill enforces previews, limits, validation, and one-time confirmations in code.

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)

T05 · Unauthorized Access and Privilege Escalation

Warning
Location
src/tools.ts:45
Finding

Dynamic Exchange Discovery Exceeds the Declared Network Allowlist

Content
View full analysis

Vulnerability Details

File Location: src/tools.ts:45-71, 127-139
Vulnerability Type: Least-privilege violation through undeclared network destinations
Risk Level: Medium

Vulnerable Code

ts
const exportList = Object.keys(pmxt) as Array<keyof typeof pmxt>;
// Try to find the Exchange class constructor from exports if needed, or use imported Exchange
const ExchangeClass = (pmxt as any).Exchange || Exchange;

// Dynamic discovery for any other exchanges
for (const key of exportList) {
    const normalizedKey = key.toLowerCase();
    if (exchanges.has(normalizedKey)) continue;

    const ExportedItem = (pmxt as any)[key];

    // Check if it is a class that extends Exchange (and is not Exchange itself)
    // We use prototype check to confirm inheritance
    if (
        typeof ExportedItem === 'function' &&
        ExportedItem.prototype instanceof ExchangeClass &&
        ExportedItem !== ExchangeClass
    ) {
        try {
            const instance = new ExportedItem();
            exchanges.set(normalizedKey, instance);
            // console.log(`Loaded exchange: ${key}`);
        } catch (e) {
            console.warn(`Failed to initialize exchange adapter for ${key}:`, e);
        }
    }
}
ts
const targets = normalizedExchange
    ? (exchanges.has(normalizedExchange) ? [normalizedExchange] : [])
    : Array.from(exchanges.keys());

if (normalizedExchange && targets.length === 0) {
    return { success: false, error: `Unsupported exchange: ${exchange}` };
}

const promises = targets.map(async (key) => {
    const client = exchanges.get(key);
    if (!client) return;

    try {
        // Assuming all exchanges implement fetchMarkets({ query })
        // If the signature varies, we might need more robust checking or an adapter
        const markets = await (client as any).fetchMarkets({ query });

        if (Array.isArray(markets)) {
            results.push(...markets.map(m => normalizeM
...[truncated 2666 chars]
Remediation
View remediation

Remediation Suggestions

  1. Remove automatic discovery and registration of arbitrary pmxtjs exchange subclasses.
  2. Define an immutable allowlist containing only polymarket, kalshi, and limitless.
  3. Construct clients exclusively from explicit, reviewed adapter constructors.
  4. When no exchange is supplied, target only the explicit allowlist rather than all map entries.
  5. Enforce destination restrictions at the HTTP or runtime sandbox layer in addition to application checks.
  6. Pin pmxtjs to an exact reviewed version instead of a caret range, and update it only after dependency review.
  7. Add tests proving that unexpected exported Exchange subclasses are neither initialized nor queried.
  8. Consider requiring an explicit exchange argument to avoid unnecessary disclosure of each query to multiple providers.

T09 · Insecure Skill Coding Practices

Error
Location
src/tools.ts:218
Finding

Real-Money Orders Lack Enforceable Confirmation and Input Validation

Content
View full analysis

Vulnerability Details

File Location: src/tools.ts:218-237
Vulnerability Type: Unenforced transaction authorization and insufficient financial input validation
Risk Level: High

Vulnerable Code

ts
export async function pmxt_order(
    market_id: string,
    outcome: string,
    amount: number,
    side: "buy" | "sell",
    exchange: string
): Promise<ToolResult<any>> {
    try {
        const normalizedExchange = exchange.toLowerCase();
        const client = exchanges.get(normalizedExchange);

        if (!client) {
            throw new Error(`Unsupported exchange: ${exchange}`);
        }

        const result = await client.createOrder({
            market_id,
            outcome,
            amount,
            side
        });

        return { success: true, data: result };
    } catch (error: any) {
        return {
            success: false,
            error: `Order failed: ${error.message}. Ensure credentials (API_KEY, PRIVATE_KEY) are correctly configured.`
        };
    }
}

Technical Analysis

SKILL.md states that the order tool must never be called without explicit user confirmation containing the amount and outcome. That requirement exists only as natural-language guidance. The executable order function does not require a confirmation token, transaction identifier, or other proof that the user reviewed and authorized the exact order.

The function immediately retrieves an authenticated exchange client and forwards caller-controlled order fields to createOrder. It also does not verify that:

  • amount is finite, positive, within user-approved limits, or denominated in the expected unit;
  • market_id is nonempty and belongs to the selected exchange;
  • outcome is a valid outcome for the identified market;
  • the requested order exactly matches a recently displayed quote or confirmation;
  • duplicate calls are prevented through idempotency controls.

Although TypeScript constrains side at compile ...[truncated 1522 chars]

Remediation
View remediation

Remediation Suggestions

  1. Implement a two-step transaction flow:
    • Prepare the exact order and return a human-readable summary.
    • Require a short-lived, single-use confirmation token before submission.
  2. Bind the confirmation token cryptographically or server-side to the user/session, exchange, market ID, outcome, side, amount, price constraints, and expiration time.
  3. Reject any execution request that differs from the confirmed transaction.
  4. Validate amount with Number.isFinite(amount), require it to be greater than zero, and enforce configurable per-order and daily limits.
  5. Validate market_id, outcome, and side against fresh market metadata from the selected exchange.
  6. Require maximum-price or slippage limits where supported rather than submitting an unconstrained market order.
  7. Add an idempotency key and replay protection so retries cannot create duplicate orders.
  8. Record a security audit event for preparation, confirmation, submission, exchange response, and rejection without logging private keys or full credentials.
  9. Prefer narrowly scoped trading credentials and wallet allowances that cap potential losses.
  10. Add tests confirming that unconfirmed, expired, modified, malformed, excessive, and replayed orders are rejected before any network request.
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • 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
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
Findings (21)

Context-Inappropriate Capability

Critical
Category
Not specified by scanner
Confidence
99% confidence
Finding

The skill exposes a direct order-placement function that can create live buy/sell orders on external exchanges using configured credentials, with no policy checks, spending limits, dry-run mode, or confirmation workflow. In an agent environment, this creates a high-risk transactional capability that could be triggered by prompt injection, tool misuse, or operator misunderstanding, resulting in immediate financial loss.

Content

No source excerpt is available for this finding.

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
93% confidence
Finding

The dependency tree includes ws 8.18.0, which is flagged for memory disclosure and fragmentation-based DoS issues. This is more concerning here because pmxt-core, ethers providers, and related packages indicate network and WebSocket usage, so a reachable vulnerable ws instance could expose process memory or allow remote service degradation.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: ws==8.17.1 — 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
92% confidence
Finding

A second vulnerable ws version, 8.17.1, is present under a transitive dependency. Because this project pulls in multiple market/exchange SDKs and socket-based clients, the presence of multiple vulnerable WebSocket stacks increases attack surface and makes remote denial of service or memory exposure more plausible.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: axios==1.13.5 — 16 advisory(ies): CVE-2026-44494 (axios Vulnerable to Full Man-in-the-Middle via Prototype Pollution Gadget in `co); CVE-2026-44495 (axios Vulnerable to Credential Theft and Response Hijacking via Prototype Pollut); CVE-2025-62718 (Axios has a NO_PROXY Hostname Normalization Bypass that Leads to SSRF) +13 more

High
Category
Supply Chain
Confidence
95% confidence
Finding

axios 1.13.5 is flagged with multiple advisories, including SSRF-related and prototype-pollution-assisted attack paths. This is significant in this dependency set because the included SDKs and server components likely make outbound HTTP requests to exchanges or APIs, so request-manipulation issues can become directly exploitable depending on how user-controlled URLs, headers, or proxy settings are handled by the consuming code.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

High
Category
Not specified by scanner
Confidence
98% confidence
Finding

The module eagerly initializes authenticated exchange clients on load using API keys and private keys from environment variables, enabling immediate access to real-money trading functionality without any visible purpose restriction, consent gate, or runtime safety control. In an agent skill context, this materially increases risk because any downstream tool invocation can act through funded accounts once the module is imported.

Content

No source excerpt is available for this finding.

Missing User Warnings

High
Category
Not specified by scanner
Confidence
97% confidence
Finding

The order function executes trades immediately from provided parameters and returns the exchange result, without any user-facing warning, explicit confirmation step, or secondary verification for destructive financial actions. This is dangerous because accidental calls, malicious prompts, or ambiguous instructions can translate directly into irreversible market positions and loss of funds.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
70% confidence
Finding

npx commands without a version suffix (e.g. @1.0.0) create a rug-pull risk if the upstream server is compromised and publishes a malicious update.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
70% confidence
Finding

npx commands without a version suffix (e.g. @1.0.0) create a rug-pull risk if the upstream server is compromised and publishes a malicious update.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The skill instructs operators to provide private keys and exchange credentials for live trading, but it does not present a clear, prominent warning about the real-money nature of the capability, key-handling risks, or the possibility of financial loss if the agent misuses these credentials. In an agent context, embedding wallet/API secrets into runtime for automated tool use materially increases the risk of unauthorized or mistaken trading and potential credential compromise.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The skill exposes a direct order-placement function for real-money market orders and only provides a procedural confirmation rule, not a user-facing warning about irreversibility, slippage, loss, or the consequences of executing on the wrong market/outcome. Because this is an agent skill, mistaken invocation, prompt confusion, or ambiguous user intent could translate directly into financial transactions.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The code loads sensitive API keys and private keys from environment variables to authenticate exchange clients, but there is no indication of disclosure, access control boundary, or minimization of credential use. While reading env vars is common, in this skill it is tied to high-risk financial operations and silent client initialization, which increases the chance that operators enable live credentials without understanding the exposure.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: @babel/core==7.29.0 — 1 advisory(ies): CVE-2026-49356 (@babel/core: Arbitrary File Read via sourceMappingURL Comment)

Low
Category
Supply Chain
Confidence
75% confidence
Finding

The lockfile pins @babel/core 7.29.0, which is flagged for an arbitrary file read issue via sourceMappingURL handling. In this package-lock context there is no direct exploit path shown, but it is a real supply-chain exposure because downstream tooling may process attacker-controlled source maps during builds or tests.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: @vitest/mocker==4.0.18 — 1 advisory(ies): CVE-2026-84373 (Vitest: Path Traversal / Arbitrary File Read via @vitest/mocker Redirect Mock)

Low
Category
Supply Chain
Confidence
71% confidence
Finding

@vitest/mocker 4.0.18 is a real vulnerable dependency according to the advisory, but it is a dev/test component rather than production runtime code. That makes exploitation less likely in normal skill execution, though it can still matter in CI or developer environments if tests process attacker-controlled mock paths.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: baseline-browser-mapping==2.9.19 — 1 advisory(ies): CVE-2026-45819 (baseline-browser-mapping process termination on invalid input causes denial of s)

Low
Category
Supply Chain
Confidence
62% confidence
Finding

baseline-browser-mapping 2.9.19 is reported vulnerable to process termination on invalid input, but it is a tooling-oriented package used through browserslist rather than an obvious runtime-facing component. The issue is still real, though its practical risk to this skill is limited unless build tooling consumes attacker-controlled input in CI or local development.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: bn.js==5.2.2 — 1 advisory(ies): CVE-2026-2739 (bn.js affected by an infinite loop)

Low
Category
Supply Chain
Confidence
68% confidence
Finding

bn.js 5.2.2 is flagged for an infinite-loop condition, which could enable denial of service when processing malicious numeric input. In this project it appears in crypto/web3-related dependency chains, so while the lockfile alone does not prove exploitability, the vulnerability is real and could matter if untrusted big-number values are parsed or manipulated.

Content

No source excerpt is available for this finding.

Vague Triggers

Low
Category
Not specified by scanner
Confidence
88% confidence
Finding

This is a manifest file, so vague-trigger review applies. The description field is empty, which provides no specificity about when the skill should activate, what phrases should trigger it, or what contexts should be excluded.

Content

No source excerpt is available for this finding.

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
91% confidence
Finding

The runtime dependency pmxtjs is specified with a caret range (^2.0.7), which allows automatic installation of newer compatible releases. If an upstream release is compromised or introduces malicious behavior, consumers may pull the changed version without review, creating a supply-chain risk in a dependency that ships with the skill.

Content

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

json
"license": "ISC",
  "type": "module",
  "dependencies": {
    "pmxtjs": "^2.0.7"
  },
  "devDependencies": {
    "@types/node": "^25.2.2",

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
40% confidence
Finding

Dependencies lack version pinning, allowing potential malicious package updates. Consider pinning versions.

Content

Scanner excerpt · package.json (reported line 19)May include surrounding context.

json
"pmxtjs": "^2.0.7"
  },
  "devDependencies": {
    "@types/node": "^25.2.2",
    "ts-node": "^10.9.2",
    "typescript": "^5.9.3",
    "vitest": "^4.0.18"

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
40% confidence
Finding

Dependencies lack version pinning, allowing potential malicious package updates. Consider pinning versions.

Content

Scanner excerpt · package.json (reported line 20)May include surrounding context.

json
},
  "devDependencies": {
    "@types/node": "^25.2.2",
    "ts-node": "^10.9.2",
    "typescript": "^5.9.3",
    "vitest": "^4.0.18"
  }

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
40% confidence
Finding

Dependencies lack version pinning, allowing potential malicious package updates. Consider pinning versions.

Content

Scanner excerpt · package.json (reported line 21)May include surrounding context.

json
"devDependencies": {
    "@types/node": "^25.2.2",
    "ts-node": "^10.9.2",
    "typescript": "^5.9.3",
    "vitest": "^4.0.18"
  }
}

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
40% confidence
Finding

Dependencies lack version pinning, allowing potential malicious package updates. Consider pinning versions.

Content

Scanner excerpt · package.json (reported line 22)May include surrounding context.

json
"@types/node": "^25.2.2",
    "ts-node": "^10.9.2",
    "typescript": "^5.9.3",
    "vitest": "^4.0.18"
  }
}

Static analysis

No suspicious patterns detected.