T09 · Insecure Skill Coding Practices
- Location
SKILL.md:203- Finding
SMTP Authorization Credential Stored in Plaintext Source Configuration
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This stock-picking skill is not overtly malicious, but it asks for email credentials and automated stock-recommendation workflows while the packaged code is incomplete and contains scoring issues that could mislead users.
Review carefully before installing. Treat generated stock picks as unaudited financial signals, not advice; avoid using automatic schedules until the missing scripts and scoring logic are verified; store email credentials in environment variables or a secret manager instead of source files; and install pinned dependency versions in an isolated environment.
SKILL.md:203SMTP Authorization Credential Stored in Plaintext Source Configuration
requirements.txt:1Unbounded Third-Party Dependency Versions Permit Unreviewed Future Releases
The trigger phrases include very generic financial terms such as '选股', '推荐股票', and '今日推荐', which can match ordinary user conversation and cause the skill to activate unexpectedly. In this context, accidental invocation is more sensitive because the skill can drive stock-picking workflows, generate recommendations, and potentially send emails, creating a meaningful risk of unintended financial guidance or automated actions.
The capital-factor function returns hard-coded positive placeholder values instead of real fund-flow data, which guarantees an artificial contribution to the final score. In a stock-selection system, this is dangerous because it can systematically bias recommendations and mislead users into trusting fabricated '资金面' analysis.
The combined-score logic claims to use a 90% concentration factor via chip_factors.get('details', {}), but calculate_chip_factors() flattens and returns only selected fields and does not preserve a nested details object. As a result, the concentration component is effectively always absent or defaults incorrectly, causing the ranking model to silently mis-score stocks while presenting results as quantitatively grounded.
This code file contains natural-language text that forces a specific language/locale for the skill description and console interaction. Under the policy, locale-specific language is only acceptable when the skill offers user choice or clearly documents a justified regional constraint, which is not present here.
The entire skill description and usage guidance are presented in Chinese, including risk warnings and setup instructions, with no indication that other languages are supported or that the Chinese-only presentation is an intentional, justified regional constraint. This can violate the language/locale policy because users are not given an explicit language choice or opt-in.
The natural-language skill description forces a specific language presentation, but the file does not mention that the skill is Chinese-only, region-specific, or that users can choose another language. Under the language/locale policy, a fixed language without user opt-in or documented justification is a policy concern.
This Python file contains natural-language strings in Chinese in the module docstring and throughout the script, which effectively forces a specific language for users and maintainers. The policy allows locale constraints only when they are optional or clearly justified, neither of which is present here.
This code file contains natural-language descriptions exclusively in Chinese, and the same locale choice continues in user-facing console output. Under the policy, forcing a specific language without user opt-in is a natural-language policy concern unless the locale restriction is explicitly justified.
The main routine prints status and test messages only in Chinese, which enforces a specific language for user-visible behavior. The file does not indicate that the skill is region-specific or provide any mechanism for the user to choose a language.
The print statements in the executable test block present operational results only in Chinese. This is a natural-language policy concern because the file does not offer opt-in language selection or indicate that Chinese-only output is required for a justified regional use case.
The dependency on akshare is only lower-bounded and not pinned to a specific version, which makes builds non-reproducible and increases supply-chain risk if a later compromised or incompatible release is installed. In a stock-selection skill that likely runs on a schedule and may fetch external market data automatically, silently pulling newer package versions can change behavior or introduce malicious code paths without review.
akshare>=1.18.0
pandas>=1.5.0
numpy>=1.23.0
The pandas requirement is unpinned, so the environment may install different versions over time, including versions with known or future vulnerabilities. Because this skill appears to perform automated quantitative analysis, inconsistent dependency resolution can affect both integrity of results and exposure to vulnerable transitive code during scheduled execution.
akshare>=1.18.0
pandas>=1.5.0
numpy>=1.23.0
Dependency has known vulnerabilities (CVEs). Using packages with unpatched security flaws exposes the environment to known exploits.
The numpy dependency is specified with a minimum version only, which allows uncontrolled upgrades and prevents reproducible deployments. For an automated analytics skill, this expands supply-chain risk and can unexpectedly introduce vulnerable or breaking versions into production.
akshare>=1.18.0
pandas>=1.5.0
numpy>=1.23.0
Dependency has known vulnerabilities (CVEs). Using packages with unpatched security flaws exposes the environment to known exploits.
No suspicious patterns detected.