Back to skill

Security audit

Equity Analyst

Security checks for vulnerabilities and agentic risk

Overview

This skill mostly matches its Korean stock-analysis purpose, but it ships under-documented report scripts with unsafe shell-based browser automation and local file writes that users should review before installing.

Review this skill before installing if you do not want an agent running local Python scripts, opening an OpenClaw browser profile, scraping Naver Finance, or writing report files into a local workspace. Treat the stock outputs as informational only, not financial advice. The safest path is to use only the documented analyzer/scraper workflow and avoid the daily or morning report scripts unless their shell invocation and hardcoded paths are fixed.

Vulnerability Patterns
  • Insecure DependenciesIntroduces malicious components through unsafe dependency sources
  • 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
Findings (2)

T09 · Insecure Skill Coding Practices

Error
Location
scripts/daily_popular_report.py:14
Finding

Shell Command Injection Through Unescaped Browser Command Arguments

Content
View full analysis
"{save_path}" 2>&1' out, err, rc = run_cmd(cmd, timeout=20) ``` ### Technical Analysis `run_cmd()` passes a dynamically constructed string to `subprocess.run()` with `shell=True`. Both `browser_open()` and `browser_snapshot()` interpolate function arguments directly into quoted shell commands without shell escaping. Quotation marks alone do not provide a security boundary. An argument containing a quote followed by shell syntax can terminate the quoted value and append another command. Redirection syntax is also deliberately interpreted by the shell in `browser_snapshot()`. The current `main()` function primarily supplies fixed URLs and stock-derived URLs containing six-digit tickers, which reduces exposure through the default execution path. However, the helper functions themselves accept unrestricted strings and are callable by imported code or future integrations. Any path that forwards untrusted input to these functions creates a command-execution vulnerability. ### Attack Path 1. An attacker influences a URL or snapshot output path passed to `browser_open()` or `bro ...[truncated 1289 chars]
Remediation
View remediation

T08 · Insecure Dependencies

Warning
Location
scripts/scrape_naver.py:18
Finding

Unpinned Third-Party Dependency Installation Guidance

Content
View full analysis
Remediation
View remediation
beautifulsoup4== ``` 2. Generate and verify cryptographic hashes for all direct and transitive dependencies, then install using: ```bash python -m pip install --require-hashes -r requirements.txt ``` 3. Commit a lock file generated by a dependency-locking tool and review dependency updates before merging them. 4. Configure installation to use an approved HTTPS package repository and avoid untrusted extra indexes. 5. Install dependencies inside a dedicated virtual environment under a non-administrative account. 6. Replace the generic installation message with a reference to the locked project manifest: ```python print( "Missing dependencies. Install reviewed packages with: " "python -m pip install --require-hashes -r requirements.txt" ) ``` 7. Add automated dependency vulnerability and provenance checks to the release process. ]]>
Vulnerability Patterns
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Tool MisuseTool Parameter Abuse, Chaining Abuse, Unsafe Defaults
  • Behavioral ASTexec() Call, eval() Call, Dynamic Import
Findings (30)

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding

If the code only scrapes or exposes a CLI extractor while the skill claims to compute scores and recommendations, users may rely on outputs that are not actually produced by the documented logic. This kind of functional deception is dangerous because it defeats review, masks real capabilities, and can enable unauthorized collection or execution under the cover of a benign finance-analysis label.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
93% confidence
Finding

If the code only scrapes or exposes a CLI extractor while the skill claims to compute scores and recommendations, users may rely on outputs that are not actually produced by the documented logic. This kind of functional deception is dangerous because it defeats review, masks real capabilities, and can enable unauthorized collection or execution under the cover of a benign finance-analysis label.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding

If the code only scrapes or exposes a CLI extractor while the skill claims to compute scores and recommendations, users may rely on outputs that are not actually produced by the documented logic. This kind of functional deception is dangerous because it defeats review, masks real capabilities, and can enable unauthorized collection or execution under the cover of a benign finance-analysis label.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
92% confidence
Finding

If the code only scrapes or exposes a CLI extractor while the skill claims to compute scores and recommendations, users may rely on outputs that are not actually produced by the documented logic. This kind of functional deception is dangerous because it defeats review, masks real capabilities, and can enable unauthorized collection or execution under the cover of a benign finance-analysis label.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

If the code only scrapes or exposes a CLI extractor while the skill claims to compute scores and recommendations, users may rely on outputs that are not actually produced by the documented logic. This kind of functional deception is dangerous because it defeats review, masks real capabilities, and can enable unauthorized collection or execution under the cover of a benign finance-analysis label.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

High
Category
Not specified by scanner
Confidence
93% confidence
Finding

The skill performs external browser automation and local process execution, which materially expands its capability beyond passive equity analysis. In context, this is more dangerous because the script consumes live web content and constructs shell commands, increasing exposure to injection, unintended navigation, and abuse of the host environment.

Content

No source excerpt is available for this finding.

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
99% confidence
Finding

Using subprocess.run with shell=True is a classic tool-parameter abuse pattern because shell metacharacters are interpreted rather than treated as data. Here the helper is reused by browser_open and browser_snapshot with interpolated values, so a crafted URL or path could trigger arbitrary command execution on the host.

Content

Scanner excerpt · scripts/daily_popular_report.py (reported line 16)May include surrounding context.

python
def run_cmd(cmd, timeout=30):
    """Run shell command and return output."""
    result = subprocess.run(
        cmd,
        shell=True,
        capture_output=True,

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
80% confidence
Finding

The skill advertises executable scripts and browser/network-based automation but does not declare any explicit tool scope or permission boundaries. In agent environments, this creates an over-broad trust surface where file, shell, and network actions may be available without clear least-privilege constraints, increasing the risk of unintended scraping, local file access, or command execution.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The skill provides investment recommendations and attractiveness scores without a clear warning that the output is informational only and not financial advice. In this context, users may over-trust deterministic-looking scores and recommendations, leading to real financial harm or compliance issues if the model produces incorrect or stale analysis.

Content

No source excerpt is available for this finding.

Ae2

Medium
Category
analysis-evasion
Confidence
90% confidence
Finding

Artifact content does not match its filename extension

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
81% confidence
Finding

The news-scoring logic includes Korean-specific keywords and the example input uses Korean company data, but the script does not state that it is limited to Korean-language inputs or provide any language selection mechanism. This creates a locale-specific behavior that is implicit rather than user-opted or clearly justified.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The manifest description states the skill provides an Investment Attractiveness Score and BUY/HOLD/AVOID recommendations. In the implemented verdict logic, scores from 65 to 79.9 produce "BUY_LEAN", which expands the documented recommendation set beyond what the skill claims to return.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The script always prints the full structured analysis JSON to stderr, which can be captured by orchestrators, logs, CI systems, or parent processes without the user's awareness. Even if the current data seems non-sensitive, unsolicited secondary-channel output can leak proprietary analysis inputs, company-specific context, or future extensions that may include confidential data.

Content

No source excerpt is available for this finding.

subprocess module call

Medium
Category
Dangerous Code Execution
Confidence
98% confidence
Finding

This helper executes shell commands with shell=True, which turns any interpolated string into shell syntax. In this script it is used to build browser commands containing a URL and file path, so if either value becomes attacker-controlled or malformed, it can lead to command injection and arbitrary local command execution.

Content

Scanner excerpt · scripts/daily_popular_report.py (reported line 16)May include surrounding context.

python
def run_cmd(cmd, timeout=30):
    """Run shell command and return output."""
    result = subprocess.run(
        cmd,
        shell=True,
        capture_output=True,

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

Natural-language strings, parsing logic, and report output assume Korean content such as '인기 검색 종목', '더보기', and Korean report labels. This effectively forces a specific language/locale behavior without user opt-in or documented justification.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The manifest describes an equity-analysis skill that analyzes Korean stocks and returns a score and BUY/HOLD/AVOID recommendation. This script not only performs analysis, but also persists a daily report to disk and includes delivery behavior aimed at sending the report to LINE, which is a broader reporting/notification workflow than the stated analysis function.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
98% confidence
Finding

The top-level documentation explicitly states that the script sends a LINE report. No LINE API call, messaging client, or outbound message delivery exists in the code; the script only prints a preview and writes a text file.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The manifest describes an equity analyst skill that analyzes Korean stock tickers and returns an Investment Attractiveness Score and BUY/HOLD/AVOID recommendation based on the prompt. This file hardcodes five stocks and produces a batch morning report, which is a materially different product and interaction model from the claimed single-stock analyst behavior.

Content

No source excerpt is available for this finding.

subprocess module call

Medium
Category
Dangerous Code Execution
Confidence
70% confidence
Finding

subprocess module calls execute external commands. Without careful input validation, this enables command injection.

Content

Scanner excerpt · scripts/daily_popular_report.py (reported line 210)May include surrounding context.

python
python_exe = "C:/Users/IM/AppData/Local/Programs/Python/Python310/python.exe"

    try:
        result = subprocess.run(
            [python_exe, script_path, '--input', input_path],
            capture_output=True,
            text=True,

subprocess module call

Medium
Category
Dangerous Code Execution
Confidence
70% confidence
Finding

subprocess module calls execute external commands. Without careful input validation, this enables command injection.

Content

Scanner excerpt · scripts/morning_report.py (reported line 131)May include surrounding context.

python
python_exe = "C:/Users/IM/AppData/Local/Programs/Python/Python310/python.exe"

    try:
        result = subprocess.run(
            [python_exe, script_path, '--input', input_path],
            capture_output=True,
            text=True,

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

The generated report strings and labels are fixed in Korean, and the skill does not offer any user opt-in or configuration for language selection. This creates a locale constraint in natural-language output without explicit choice or justification.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The report header and column labels are hardcoded in Korean, which imposes a specific language on all users of the script. There is no indication that the user can choose the output language or that the script is intentionally limited to a Korean-only context.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
76% confidence
Finding

The manifest description is written as an instruction for a Korean-stock analyst persona entirely in Korean, which can imply a forced language/locale behavior. While the skill is scoped to Korean equities, the file does not explicitly state that responses may be in Korean only or offer the user a language choice, so the locale constraint is not clearly documented as a justified policy exception.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Low
Category
Not specified by scanner
Confidence
81% confidence
Finding

The module documentation describes the script as taking input data and outputting a structured analysis report. However, when executed as main, the script additionally prints a JSON block to stderr for debugging/capturing, which is an undocumented extra output behavior and can contradict consumer expectations about outputs.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Low
Category
Not specified by scanner
Confidence
97% confidence
Finding

The module docstring states that the script 'Generates report and sends to LINE'. In the actual implementation, the report is written to a local file and the LINE send step is only mentioned in comments as something a cron/system event or manual command could do later, so the documented behavior overstates what the code actually performs.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.