T03 · Remote Payload Retrieval and Execution
- Location
README.md:14- Finding
Unverified Remote Installer Is Piped Directly into a Shell
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This A-share stock skill mostly matches its stated purpose, but its installer guidance, API handling, and bundled local data create avoidable security and privacy risks.
Review before installing. Do not run the README curl-to-shell installer unless you independently trust and verify it. Use a trusted uv installation path, pin dependencies, configure only a trusted HTTPS or loopback API endpoint, and assume stock symbols plus the API key go to that backend. Treat data/portfolio.json as plaintext local financial data and clear the bundled sample record before use.
README.md:14Unverified Remote Installer Is Piped Directly into a Shell
scripts/utils/api_client.py:5API Credentials Can Be Sent to an Unrestricted or Plaintext Endpoint
scripts/scan.py:1Runtime Dependencies Are Unpinned and Include an Unused Package
data/portfolio.json:1Bundled Portfolio Data Exposes Financial and Workstation Metadata
The explicit use of '| sh' creates a command chain that executes untrusted network content without review, magnifying the risk of supply-chain compromise and making exploitation trivial if the fetched content is altered. In a README, this is especially dangerous because users are likely to copy-paste it verbatim.
本插件建议使用 uv 运行脚本,它会自动处理依赖:
# 确保已安装 uv
curl -LsSf https://astral.sh/uv/install.sh | sh
This finding captures the same core issue in English: the declared purpose suggests specialized investment-advisory functionality, while the implementation appears to perform generic local JSON persistence unrelated or only loosely related to the claimed analysis features. Such overclaiming can mislead users into invoking the skill in contexts involving sensitive financial data, with an inaccurate understanding of what the code actually does.
This finding captures the same core issue in English: the declared purpose suggests specialized investment-advisory functionality, while the implementation appears to perform generic local JSON persistence unrelated or only loosely related to the claimed analysis features. Such overclaiming can mislead users into invoking the skill in contexts involving sensitive financial data, with an inaccurate understanding of what the code actually does.
The README explicitly states that portfolio data is stored locally and stock scans call a cloud backend, but it does not clearly warn users that sensitive financial data may persist on disk or be transmitted over the network. In an investment-related skill, this omission can mislead users about privacy boundaries and increase the risk of unintended disclosure of holdings or behavior.
The skill advertises network, environment-variable, and local file capabilities through its documented commands and metadata, but it does not declare any explicit tool scope such as permissions or allowed-tools. That makes the effective privilege boundary opaque to users and reviewers, increasing the risk of over-broad execution and unintended access to secrets, filesystem data, or remote endpoints.
The manifest description is entirely in Chinese and presents the skill as a Chinese-language experience without offering any language choice or stating that it is region- or language-specific by design. This can violate language/locale policy expectations when users are not given an explicit opt-in or alternative.
The invocation text for stock analysis is broad and phrased similarly to ordinary user requests, which can cause the skill to trigger in unintended contexts. Over-broad activation increases the chance that users' general financial questions are routed into code-executing workflows involving network calls or file access without sufficiently explicit intent.
The description is written entirely in Chinese and frames the skill as a Chinese-language assistant without indicating that language selection depends on user preference. This can cause the agent to respond in an unintended language, undermining user intent and potentially reducing comprehension in a financial-advice context where misunderstanding can have downstream consequences.
The script emits all user-facing status and portfolio messages in Chinese, while the CLI description is in English, with no option for the user to select a language or any documented reason for a Chinese-only interface. This is a natural-language locale policy concern because it imposes a specific language without opt-in.
This code emits multiple user-facing strings in Chinese, including the report title, section headers, and status messages, with no option for the user to select another language. That creates a language/locale policy issue because the skill forces a specific language without opt-in or documented regional scope.
Most of the user-facing description and usage guidance is written in Chinese, while the title and some labels are in English, and there is no indication that the skill is intentionally region-specific or that users can choose another language. This can violate a language/locale policy when a specific language is imposed without opt-in or justification.
The README instructs users to fetch and execute a remote installation script directly with curl piped into a shell. If the remote host, TLS trust chain, DNS, or delivery path is compromised, arbitrary code will execute immediately on the user's system with the user's privileges.
本插件建议使用 uv 运行脚本,它会自动处理依赖:
# 确保已安装 uv
curl -LsSf https://astral.sh/uv/install.sh | sh
This manifest description states the skill's purpose but does not define when it should be invoked, what phrases should trigger it, or any exclusion conditions. In a manifest file, that lack of specificity can lead to overly broad or unintended activation if the platform uses description text for routing.
Line L16 stores sys.prefix, which is the Python installation prefix, while the inline comment says it is a placeholder for timestamp logic. This is not merely incomplete documentation: the code records a filesystem/runtime path-like value in an added_at field whose comment indicates time metadata.
This code makes outbound HTTP requests to a cloud API and includes an X-API-Key header, which means user-supplied symbols and credentials are transmitted off-system. There is no confirmation prompt, visible user-facing log, or warning in this file indicating that data will be sent to an external service.