Security Audit
Tsanhl/stock-advisor-skills.md:stock-trading-advisor
github.com/Tsanhl/stock-advisor-skills.mdTrust Assessment
Tsanhl/stock-advisor-skills.md:stock-trading-advisor received a trust score of 85/100, placing it in the Mostly Trusted category. This skill has passed most security checks with only minor considerations noted.
SkillShield's automated analysis identified 1 finding: 0 critical, 1 high, 0 medium, and 0 low severity. Key findings include Command Injection via unsanitized user input in shell command arguments.
The analysis covered 4 layers: Manifest Analysis, Static Code Analysis, Dependency Graph, LLM Behavioral Safety. All layers scored 70 or above, reflecting consistent security practices.
Last analyzed on February 22, 2026 (commit 5bd5dd2f). SkillShield performs automated 4-layer security analysis on AI skills and MCP servers.
Layer Breakdown
Behavioral Risk Signals
Security Findings1
| Severity | Finding | Layer | Location | |
|---|---|---|---|---|
| HIGH | Command Injection via unsanitized user input in shell command arguments The skill instructs the LLM to construct and execute a `python3` command using user-provided input for the `--title` and output filename (`<topic-slug>`). If the user input for the topic or title contains shell metacharacters (e.g., `"; rm -rf /; echo "`), it could lead to arbitrary command execution on the host system. While `argparse` in `scripts/build_pdf.py` protects against argument injection within the Python script, the vulnerability lies in the LLM's construction of the shell command string *before* execution, which is susceptible to shell injection if user input is not properly escaped. The LLM must sanitize or escape all user-provided input (e.g., `<topic-slug>`, `<title>`) before incorporating it into a shell command string. A safer approach is to pass user input as environment variables or through a more robust API that doesn't involve direct shell string interpolation, or to strictly validate and whitelist allowed characters for filenames and titles. For example, use `shlex.quote()` on each argument if executing via `subprocess.run(..., shell=True)` or pass arguments as a list to `subprocess.run(..., shell=False)`. | LLM | SKILL.md:199 |
Scan History
Embed Code
[](https://skillshield.io/report/aa299033a3c12dc7)
Powered by SkillShield