Back to skill

Security audit

portfolio tracking

Security checks for vulnerabilities and agentic risk

Overview

This appears to be a real portfolio tracker, but it needs review because it handles financial credentials and data while making misleading local-only claims and using unsafe credential handling.

Review carefully before installing. Only use read-only, IP-restricted exchange credentials where possible, assume Binance/IBKR/wallet addresses/symbol lookups may be sent to third parties, set strict permissions on ~/.portfolio-tracker, and consider waiting for a version that removes command-line secret passing, enforces secure local storage, pins/updates dependencies, and corrects the privacy disclosures.

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

T09 · Insecure Skill Coding Practices

Error
Location
scripts/binance-sync.ts:214
Finding

Exchange credentials are exposed through command-line arguments

Content
View full analysis
'); result = await fetchBinanceBalances(apiKey, apiSecret); break; } case 'validate': { const apiKey = process.argv[3]; const apiSecret = process.argv[4]; if (!apiKey || !apiSecret) throw new Error('Usage: validate '); result = await validateBinanceCredentials(apiKey, apiSecret); break; } ``` ```ts // scripts/ibkr-sync.ts:289-304 switch (command) { case 'sync': { const token = process.argv[3]; const queryId = process.argv[4]; if (!token || !queryId) throw new Error('Usage: sync '); result = await fetchIbkrPositions(token, queryId); break; } case 'validate': { const token = process.argv[3]; const queryId = process.argv[4]; if (!token || !queryId) throw new Error('Usage: validate '); result = await validateIbkrCredentials(token, queryId); break; } ``` The command instructions explicitly direct the agent to invoke these interfaces with plaintext credentials: ```md Validate via `npx tsx /scripts/binance-sync.ts validate ` Run `npx tsx /scripts/ibkr-sync.ts sync ` ``` ### Technical Analysis Secrets placed in `process.argv` become part of the process command line. Depending on the operating system and execution environment, that command line may be visible through process-inspection interfaces, shell history, te ...[truncated 1775 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Error
Location
scripts/data-store.ts:64
Finding

Sensitive configuration files are created without enforced restrictive permissions

Content
View full analysis
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/ibkr-sync.ts:195
Finding

IBKR access tokens are embedded in request URLs

Content
View full analysis
{ const url = `${FLEX_BASE_URL}.SendRequest?t=${token}&q=${queryId}&v=3`; const res = await fetch(url); if (!res.ok) throw new Error(`IBKR SendRequest failed: HTTP ${res.status}`); const xml = await res.text(); const parsed = parseFlexResponse(xml); if (parsed.status === 'Success' && parsed.referenceCode) return parsed.referenceCode; throw new Error(`IBKR SendRequest error: [${parsed.errorCode}] ${parsed.errorMessage}`); } async function fetchFlexStatement(token: string, referenceCode: string): Promise { const MAX_RETRIES = 10; const RETRY_DELAY_MS = 3000; for (let attempt = 0; attempt < MAX_RETRIES; attempt++) { const url = `${FLEX_BASE_URL}.GetStatement?t=${token}&q=${referenceCode}&v=3`; const res = await fetch(url); ``` ### Technical Analysis The IBKR Flex token is included in the URL query string. HTTPS protects the URL from passive network observers while in transit, but it does not prevent URL capture by application diagnostics, HTTP instrumentation, endpoint monitoring, debugging proxies, provider-side access logs, or error-reporting systems. This behavior may be dictated by the IBKR Flex Web Service protocol. If so, transmission to IBKR is necessary for the declared functionality, but the application must still treat the complete URL as sensitive and prevent it from entering logs or telemetry. ### Attack Path 1. A user starts an IBKR synchronization. 2. The script constructs a URL containing the reusable Flex token and query or reference identifier. 3. HTTP instrumentation, a debugging proxy, endpoint telemetry, or provider-side logging records the complete URL. 4. An attacker or unauthorized operator obtains access to t ...[truncated 543 chars]
Remediation
View remediation

other

Note
Location
README.md:77
Finding

Absolute local-only privacy claims contradict required external data transmission

Content
View full analysis
Remediation
View remediation
Vulnerability Patterns
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
Findings (87)

Known Vulnerable Dependency: fast-xml-parser==4.5.3 — 6 advisory(ies): CVE-2026-33036 (fast-xml-parser affected by numeric entity expansion bypassing all entity expans); CVE-2026-27942 (fast-xml-parser has stack overflow in XMLBuilder with preserveOrder); CVE-2026-41650 (fast-xml-parser XMLBuilder: XML Comment and CDATA Injection via Unescaped Delimi) +3 more

Critical
Category
Supply Chain
Confidence
95% confidence
Finding

fast-xml-parser@4.5.3 is a direct runtime dependency, and the cited advisories include parser/builder flaws such as entity expansion bypass, stack overflow, and XML injection issues. If the skill processes XML from imported statements, feeds, or user-supplied data, these flaws could enable denial of service, malformed output generation, or injection into downstream consumers, making this materially risky in runtime.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: vitest==2.1.9 — 2 advisory(ies): CVE-2026-47429 (When Vitest UI server is listening, arbitrary file can be read and executed); CVE-2026-84373 (Vitest: Path Traversal / Arbitrary File Read via @vitest/mocker Redirect Mock)

Critical
Category
Supply Chain
Confidence
90% 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: fast-xml-parser==4.5.3 — 6 advisory(ies): CVE-2026-33036 (fast-xml-parser affected by numeric entity expansion bypassing all entity expans); CVE-2026-27942 (fast-xml-parser has stack overflow in XMLBuilder with preserveOrder); CVE-2026-41650 (fast-xml-parser XMLBuilder: XML Comment and CDATA Injection via Unescaped Delimi) +3 more

Critical
Category
Supply Chain
Confidence
98% confidence
Finding

The resolved fast-xml-parser version is flagged with multiple critical advisories, including entity expansion bypasses, stack overflow, and XML injection issues. In a portfolio tracker, XML data may plausibly come from feeds, imports, or external market/account sources, so processing attacker-controlled XML could lead to denial of service, parser bypass, or unsafe output generation even in a nominally local app.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: vitest==2.1.9 — 2 advisory(ies): CVE-2026-47429 (When Vitest UI server is listening, arbitrary file can be read and executed); CVE-2026-84373 (Vitest: Path Traversal / Arbitrary File Read via @vitest/mocker Redirect Mock)

Critical
Category
Supply Chain
Confidence
95% confidence
Finding

Vitest 2.1.9 is reported as vulnerable to arbitrary file read and, in some configurations, file execution/path traversal issues. Although vitest is a devDependency rather than production runtime code, it becomes dangerous if the skill's tests, mocker features, or Vitest UI server are ever run on a developer machine or CI environment with untrusted input, because local files under ~/.portfolio-tracker or elsewhere could be exposed.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

The IBKR sync capability is not reflected in the local-only description and implies ingestion of external brokerage data. Although this overlaps with other mismatch findings, it is still a meaningful transparency issue because users are not clearly told that remote broker data may be processed and stored locally.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

The IBKR sync capability is not reflected in the local-only description and implies ingestion of external brokerage data. Although this overlaps with other mismatch findings, it is still a meaningful transparency issue because users are not clearly told that remote broker data may be processed and stored locally.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

The IBKR sync capability is not reflected in the local-only description and implies ingestion of external brokerage data. Although this overlaps with other mismatch findings, it is still a meaningful transparency issue because users are not clearly told that remote broker data may be processed and stored locally.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

The IBKR sync capability is not reflected in the local-only description and implies ingestion of external brokerage data. Although this overlaps with other mismatch findings, it is still a meaningful transparency issue because users are not clearly told that remote broker data may be processed and stored locally.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding

The IBKR sync capability is not reflected in the local-only description and implies ingestion of external brokerage data. Although this overlaps with other mismatch findings, it is still a meaningful transparency issue because users are not clearly told that remote broker data may be processed and stored locally.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding

The IBKR sync capability is not reflected in the local-only description and implies ingestion of external brokerage data. Although this overlaps with other mismatch findings, it is still a meaningful transparency issue because users are not clearly told that remote broker data may be processed and stored locally.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
94% confidence
Finding

The IBKR sync capability is not reflected in the local-only description and implies ingestion of external brokerage data. Although this overlaps with other mismatch findings, it is still a meaningful transparency issue because users are not clearly told that remote broker data may be processed and stored locally.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding

The IBKR sync capability is not reflected in the local-only description and implies ingestion of external brokerage data. Although this overlaps with other mismatch findings, it is still a meaningful transparency issue because users are not clearly told that remote broker data may be processed and stored locally.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
90% confidence
Finding

The IBKR sync capability is not reflected in the local-only description and implies ingestion of external brokerage data. Although this overlaps with other mismatch findings, it is still a meaningful transparency issue because users are not clearly told that remote broker data may be processed and stored locally.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

High
Category
Not specified by scanner
Confidence
98% confidence
Finding

The skill claims all data stays local but documents remote fetching from exchanges, brokers, market-data providers, blockchain services, and an AI advice feature. This is a serious semantic deception issue because it can induce users to share sensitive financial context under a false privacy model.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

High
Category
Not specified by scanner
Confidence
98% confidence
Finding

The file makes authenticated network requests to Binance endpoints, which directly contradicts the stated metadata claim that the tracker runs entirely locally and keeps all data in ~/.portfolio-tracker/. This is dangerous because users may disclose exchange API credentials under false assumptions about offline/local-only behavior, weakening informed consent and trust boundaries.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

High
Category
Not specified by scanner
Confidence
98% confidence
Finding

The file hardcodes multiple third-party RPC endpoints, which directly contradicts the stated behavior that the portfolio tracker runs entirely locally and keeps all data in ~/.portfolio-tracker/. Even though the functionality is plausibly for legitimate balance lookup, it causes outbound network access and disclosure of user wallet addresses to external services, creating a material trust and privacy gap.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

High
Category
Not specified by scanner
Confidence
95% confidence
Finding

The fetch functions perform live multi-chain balance lookups against public RPC infrastructure, which is broader capability than an 'entirely local' tracker implies. In this context, the danger is not code execution but undisclosed external communication and data exposure, especially when a user may trust the skill to avoid all network egress.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

High
Category
Not specified by scanner
Confidence
98% confidence
Finding

The skill metadata claims the portfolio tracker runs entirely locally and keeps all data under ~/.portfolio-tracker/, but this code performs outbound requests to Binance and CoinGecko. That discrepancy is security-relevant because user asset symbols and usage patterns are transmitted to third parties without being clearly disclosed, undermining user trust and privacy expectations.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

High
Category
Not specified by scanner
Confidence
97% confidence
Finding

The historical-data and symbol-search features send user-provided symbols and queries to Yahoo Finance, which contradicts the 'entirely locally' description. Even if the transmitted data seems low sensitivity, portfolio-related searches can reveal holdings, interests, and behavior to external services unexpectedly.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

High
Category
Not specified by scanner
Confidence
98% confidence
Finding

The skill metadata promises that it runs entirely locally and keeps all data under ~/.portfolio-tracker/, but this code sends user-supplied brokerage credentials to Interactive Brokers over the network and retrieves account data remotely. That mismatch is security-relevant because users may trust the manifest when deciding whether to provide sensitive tokens, and the hidden network dependency expands the data exposure and attack surface beyond what was disclosed.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: nanoid==3.3.11 — 3 advisory(ies): CVE-2026-67214 (nanoid: non-secure generators can loop indefinitely with negative size); CVE-2026-67213 (nanoid: custom generators can loop indefinitely when size is zero); CVE-2026-73086 (nanoid: Integer Overflow or Wraparound)

High
Category
Supply Chain
Confidence
80% 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: postcss==8.5.6 — 4 advisory(ies): CVE-2026-45623 (PostCSS: Arbitrary file read and information disclosure via attacker-controlled ); CVE-2026-69153 (PostCSS: incomplete fix of GHSA-6g55-p6wh-862q — attacker-controlled sourceMappi); CVE-2026-41305 (PostCSS has XSS via Unescaped </style> in its CSS Stringify Output) +1 more

High
Category
Supply Chain
Confidence
80% 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: rollup==4.57.1 — 1 advisory(ies): CVE-2026-27606 (Rollup 4 has Arbitrary File Write via Path Traversal)

High
Category
Supply Chain
Confidence
80% 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: vite==5.4.21 — 3 advisory(ies): CVE-2026-39365 (Vite Vulnerable to Path Traversal in Optimized Deps `.map` Handling); CVE-2026-53571 (vite: `server.fs.deny` bypass on Windows alternate paths); CVE-2026-53632 (launch-editor: NTLMv2 hash disclosure via UNC path handling on Windows)

High
Category
Supply Chain
Confidence
80% 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: 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
91% confidence
Finding

ws@8.17.1 is a runtime dependency pulled in through ethers, and the advisories include memory disclosure and memory exhaustion denial of service. If the skill connects to attacker-controlled WebSocket endpoints or processes malicious frames, this could expose sensitive process memory or degrade availability; the 'local-only' description makes this dependency more concerning because it suggests undocumented network capability.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.