Back to skill

Security audit

Teller MCP – Borrow USDC & Altcoins (no margin calls)

Security checks for vulnerabilities and agentic risk

Overview

The skill matches its Teller MCP purpose, but it needs review because it can return remotely supplied blockchain transaction payloads for borrowing or repayment without enough validation or safety warnings.

Install only if you are comfortable with an MCP tool that sends wallet-linked borrowing parameters to the configured Teller API and returns unsigned transaction payloads. Before signing anything produced by this skill, independently verify the chain, contract address, spender, calldata, token amounts, native value, loan terms, and repayment details, and avoid automated signing unless you add strict validation and confirmation gates. Keep the API base URL fixed to a trusted HTTPS endpoint and update the reported vulnerable dependencies before production use.

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

T09 · Insecure Skill Coding Practices

Error
Location
scripts/tellermcp-server/src/client.ts:113
Finding

Unvalidated Remote Transaction Payloads Are Returned for Wallet Submission

Content
View full analysis
(path: string, query?: Record): Promise { const url = new URL(path, this.baseUrl); if (query) { for (const [key, value] of Object.entries(query)) { if (value === undefined || value === null || value === '') continue; url.searchParams.set(key, String(value)); } } const controller = new AbortController(); const timeout = setTimeout(() => controller.abort(), this.timeoutMs); try { const response = await fetch(url, { signal: controller.signal, headers: { 'accept': 'application/json' } }); if (!response.ok) { const body = await response.text(); throw new Error(`Request failed with ${response.status}: ${body}`); } return (await response.json()) as T; ``` The transaction-building MCP tool then returns this remotely supplied data without independently validating its destination, calldata, value, or function selector: ```typescript async input => { const data = await client.getBorrowTransactions(input); return jsonResponse( `Prepared ${data.summary.totalTransactions} borrow transaction${data.summary.totalTransactions === 1 ? '' : 's'}.`, data ); } ``` The API reference explicitly encourages direct use: ```markdown - Use results directly as calldata for sequential submission. ``` ### Technical Analysis The generic cast `(await response.json()) as T` provides TypeScript compile-time typing only. It does not perform runtime validation. Consequently, an API response containing arbitrary `to`, `data`, `value ...[truncated 2779 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/tellermcp-server/src/client.ts:15
Finding

Configurable Unrestricted API Destination Can Receive Wallet and Financial Data

Content
View full analysis
{ return this.request('/borrow-terms', { wallet: params.wallet, chainId: params.chainId, collateralToken: params.collateralToken, poolAddress: params.poolAddress }); } getBorrowTransactions(params: { walletAddress: string; collateralTokenAddress: string; chainId: number; poolAddress: string; collateralAmount: string; principalAmount: string; loanDuration?: number; }): Promise { return this.request('/borrow-tx', { walletAddress: params.walletAddress, collateralTokenAddress: params.collateralTokenAddress, chainId: params.chainId, poolAddress: params.poolAddress, collateralAmount: params.collateralAmount, principalAmount: params.principalAmount, loanDuration: params.loanDuration }); } getLoans(params: { walletAddress: string; chainId: number }): Promise
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
Findings (19)

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
- `package.json` / `package-lock.json` – Node 20+ project metadata

Known Vulnerable Dependency: @hono/node-server==1.19.9 — 3 advisory(ies): CVE-2026-39406 (@hono/node-server: Middleware bypass via repeated slashes in serveStatic); GHSA-frvp-7c67-39w9 (Node.js Adapter for Hono: Path traversal in `serve-static` on Windows via encode); CVE-2026-29087 (@hono/node-server has authorization bypass for protected static paths via encode)

High
Category
Supply Chain
Confidence
86% confidence
Finding

The lockfile pins @hono/node-server 1.19.9, and the listed advisories describe path traversal and authorization bypass issues in static file serving. Even though this file is only a dependency manifest, the skill is explicitly for installing and running an MCP backend server, so shipping a server stack with known static-path bypass flaws is a real supply-chain risk if the vulnerable code paths are used.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: express-rate-limit==8.2.1 — 1 advisory(ies): CVE-2026-30827 (express-rate-limit: IPv4-mapped IPv6 addresses bypass per-client rate limiting o)

High
Category
Supply Chain
Confidence
83% confidence
Finding

express-rate-limit 8.2.1 is flagged for bypass of per-client throttling using IPv4-mapped IPv6 addresses. Since the MCP backend is a network-facing server, ineffective rate limiting can materially weaken brute-force and abuse protections if this package is used in request handling.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: fast-uri==3.1.0 — 7 advisory(ies): CVE-2026-13676 (fast-uri vulnerable to host confusion via failed IDN canonicalization); CVE-2026-18446 (fast-uri vulnerable to host confusion via backslash authority introducer); CVE-2026-75975 (fast-uri vulnerable to server-side request forgery via malformed IPv6 normalizat) +4 more

High
Category
Supply Chain
Confidence
80% confidence
Finding

fast-uri 3.1.0 is a real vulnerable transitive dependency with multiple advisories including host confusion and possible SSRF-related parsing flaws. In an MCP server that may process URLs, endpoints, or callback-related inputs, unsafe URI normalization can enable bypass of hostname restrictions or misrouting of security decisions.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: hono==4.11.9 — 16 advisory(ies): CVE-2026-56762 (Hono missing validation of cookie name on write path in setCookie()); CVE-2026-47676 (Hono: app.mount() strips mount prefix using undecoded path, causing incorrect ro); CVE-2026-47675 (Hono: Cookie helper does not sanitize sameSite and priority, allowing Set-Cookie) +13 more

High
Category
Supply Chain
Confidence
84% confidence
Finding

hono 4.11.9 is listed with numerous high-severity advisories affecting cookies, routing, and related request handling. Because this skill installs and runs an MCP backend server, weaknesses in the underlying web framework can directly affect authentication, authorization, and request integrity in deployed environments.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: ip-address==10.0.1 — 2 advisory(ies): CVE-2026-69192 (ip-address: Address4 decodes leading-zero octets as decimal while resolvers deco); CVE-2026-42338 (ip-address has XSS in Address6 HTML-emitting methods)

High
Category
Supply Chain
Confidence
80% confidence
Finding

ip-address 10.0.1 is a real vulnerable dependency; one advisory impacts address parsing semantics and another affects HTML-emitting methods. In this context, the rate-limiting stack depends on IP parsing, so inconsistent interpretation of addresses can contribute to control bypasses, though the XSS angle is less relevant unless the server renders those methods into HTML.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: path-to-regexp==8.3.0 — 2 advisory(ies): CVE-2026-4923 (path-to-regexp vulnerable to Regular Expression Denial of Service via multiple w); CVE-2026-4926 (path-to-regexp vulnerable to Denial of Service via sequential optional groups)

High
Category
Supply Chain
Confidence
80% confidence
Finding

path-to-regexp 8.3.0 is flagged for ReDoS/DoS conditions from crafted route patterns. As a routing dependency in a server stack, vulnerable pattern processing can let attackers consume CPU and degrade availability if exposed through route matching or dynamically constructed paths.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
95% confidence
Finding

The skill instructs users to install and run a bundled MCP server that performs outbound network access to Teller APIs and can read configuration from environment variables, but it does not declare any explicit tool scope such as permissions or allowed-tools. That omission weakens least-privilege controls and makes the skill harder to sandbox or review, increasing the chance that an agent or operator runs network-capable code with broader access than intended.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
88% confidence
Finding

The README advertises tools that generate on-chain borrow and repay transactions but provides no warning that these outputs can move funds, incur debt, trigger approvals, or expose users to liquidation and loss if misused. In an agent-integrated MCP context, documentation shapes operator trust and automation behavior, so omitting transaction-risk guidance increases the chance that users or agents treat generated calldata as routine data rather than financially sensitive actions.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

This code sends wallet addresses, pool addresses, collateral amounts, and related borrowing/repayment parameters to a remote API via HTTP requests. The file contains no confirmation prompt, logging, comment, or docstring warning users that this data will be transmitted off-host.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
85% confidence
Finding

The skill exposes tools that build borrow and repayment transactions and returns them in a form ready for downstream execution, but it does not include any explicit warning, confirmation requirement, or safety-oriented framing that these are financially consequential blockchain actions. In an MCP/agent context, this increases the chance that another agent or UI treats the output as routine automation and submits transactions without adequate human review, leading to unintended borrowing, repayments, fees, or loss from incorrect parameters.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: body-parser==2.2.2 — 1 advisory(ies): CVE-2026-12590 (body-parser vulnerable to denial of service when invalid limit value silently di)

Low
Category
Supply Chain
Confidence
69% confidence
Finding

body-parser 2.2.2 is flagged for a denial-of-service condition involving invalid limit handling. This is a true vulnerable dependency in the lockfile, though the practical risk depends on whether attacker-controlled request bodies and parser limits are exposed by the MCP server.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: esbuild==0.27.3 — 1 advisory(ies): GHSA-g7r4-m6w7-qqqr (esbuild allows arbitrary file read when running the development server on Window)

Low
Category
Supply Chain
Confidence
60% confidence
Finding

Dependency has known vulnerabilities (CVEs). Using packages with unpatched security flaws exposes the environment to known exploits.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: qs==6.15.0 — 3 advisory(ies): CVE-2026-82417 (qs: Denial of Service via Attacker Controlled isBuffer); CVE-2026-8723 (qs has a remotely triggerable DoS: qs.stringify crashes with TypeError on null/u); CVE-2026-82562 (qs array-limit bypass via bracket-key comma parsing)

Low
Category
Supply Chain
Confidence
70% confidence
Finding

qs 6.15.0 is a real vulnerable dependency with denial-of-service-related advisories in querystring parsing/stringifying behavior. In a server context this can be triggered remotely if untrusted query parameters or nested objects are parsed without bounds, although the listed issues are lower severity than the routing and auth-related ones above.

Content

No source excerpt is available for this finding.

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 · scripts/tellermcp-server/package.json (reported line 15)May include surrounding context.

json
"author": "",
  "license": "MIT",
  "dependencies": {
    "@modelcontextprotocol/sdk": "^1.26.0",
    "zod": "^4.3.6"
  },
  "devDependencies": {

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 · scripts/tellermcp-server/package.json (reported line 16)May include surrounding context.

json
"license": "MIT",
  "dependencies": {
    "@modelcontextprotocol/sdk": "^1.26.0",
    "zod": "^4.3.6"
  },
  "devDependencies": {
    "@types/node": "^25.2.3",

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 · scripts/tellermcp-server/package.json (reported line 19)May include surrounding context.

json
"zod": "^4.3.6"
  },
  "devDependencies": {
    "@types/node": "^25.2.3",
    "tsx": "^4.21.0",
    "typescript": "^5.9.3"
  }

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 · scripts/tellermcp-server/package.json (reported line 20)May include surrounding context.

json
},
  "devDependencies": {
    "@types/node": "^25.2.3",
    "tsx": "^4.21.0",
    "typescript": "^5.9.3"
  }
}

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 · scripts/tellermcp-server/package.json (reported line 21)May include surrounding context.

json
"devDependencies": {
    "@types/node": "^25.2.3",
    "tsx": "^4.21.0",
    "typescript": "^5.9.3"
  }
}

Static analysis

Detected: suspicious.env_credential_access

Environment variable access combined with network send.

Critical
Code
suspicious.env_credential_access
Location
scripts/tellermcp-server/src/client.ts:15