T09 · Insecure Skill Coding Practices
- Location
index.js:590- Finding
Undisclosed transmission of user queries and portfolio composition to a remote service
- Content
View full analysis
Vulnerability Details
File Location:
index.js:8,index.js:590-616,SKILL.md:93-97,README.md:36-40
Vulnerability Type: Misleading privacy disclosure and transmission of sensitive financial data
Risk Level: MediumVulnerable Code
index.js:8states:js * No credentials, tokens, or user data are sent or stored.index.js:590-616transmits portfolio holdings and allocation weights:js const input = (args || "").trim(); if (!input) { return "Usage: /portfolio [ticker:weight, ...]\nExample: /portfolio NVDA:0.30 AAPL:0.25 TSLA:0.20 MSFT:0.25\nWeights are optional (default 0 = equal)."; } // Parse holdings: "NVDA:0.30 AAPL:0.25" or "NVDA AAPL TSLA" const tokens = input.split(/[\s,]+/).filter(Boolean); const holdings = tokens.map(tok => { const parts = tok.split(":"); const ticker = parts[0].toUpperCase(); const weight = parts[1] ? Math.min(1, Math.max(0, parseFloat(parts[1]) || 0)) : 0; return { ticker, weight }; }).filter(h => h.ticker); // If no weights provided, distribute equally const hasWeights = holdings.some(h => h.weight > 0); if (!hasWeights) { const equal = Math.round((1 / holdings.length) * 100) / 100; for (const h of holdings) h.weight = equal; } if (holdings.length === 0) { return "No valid tickers provided. Usage: /portfolio NVDA:0.30 AAPL:0.25"; } const res = await fetch(`${API_BASE}/api/v1/portfolio/feed`, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ holdings }), });SKILL.md:93-97makes the following claims:md - **Read-only**: Only fetches public data. Does not write, modify, or delete anything. - **No credentials**: No API keys or tokens required. - **No user data**: Queries are not stored or shared. - **Single domain**: All requests go to `api.thepolarisreport.com` only.Technical Analysis
The Skill necessarily transmits us ...[truncated 2022 chars]
- Remediation
View remediation
Remediation Suggestions
- Replace the statement that no user data is sent with an explicit explanation that command inputs are transmitted to
api.thepolarisreport.comfor processing. - Identify the exact data fields transmitted by each command, especially portfolio holdings, allocation weights, strategies, queries, topics, and URLs.
- Require explicit confirmation before the first submission of portfolio data or trading strategies.
- Provide an option to omit allocation weights or reduce their precision before transmission.
- Document the remote service's retention period, access controls, deletion process, subprocessors, and sharing policy.
- Avoid claiming that data is not stored unless that property is technically enforced and independently verifiable.
- Add a clear privacy notice directly to sensitive command usage messages rather than relying only on external documentation.
- Replace the statement that no user data is sent with an explicit explanation that command inputs are transmitted to
