Back to skill

Security audit

Stock Analysis 6.2.0

Security checks for vulnerabilities and agentic risk

Overview

The skill mostly matches its stock-analysis purpose, but its Twitter features ask users to expose live X session cookies and pass broad environment secrets to an external CLI.

Review before installing. Use --no-social for hot scans unless you are comfortable giving a third-party CLI access to X session credentials, avoid granting Terminal Full Disk Access, do not place unrelated secrets in the skill .env, and treat portfolio/watchlist files as sensitive local financial data.

Vulnerability Patterns
  • Unauthorized Access and Privilege EscalationObtains permissions beyond the task's legitimate needs
  • 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
Findings (5)

T09 · Insecure Skill Coding Practices

Error
Location
scripts/hot_scanner.py:22
Finding
Hot Scanner exposes the complete process environment to a network-capable third-party executable<![CDATA[ ## Vulnerability Details **File Location**: `scripts/hot_scanner.py:22-30` and `scripts/hot_scanner.py:387-391` **Vulnerability Type**: Excessive credential propagation to a subprocess **Risk Level**: High ### Vulnerable Code ```python # Load .env file if exists ENV_FILE = Path(__file__).parent.parent / ".env" if ENV_FILE.exists(): with open(ENV_FILE) as f: for line in f: line = line.strip() if line and not line.startswith("#") and "=" in line: key, value = line.split("=", 1) os.environ[key] = value ``` ```python env = os.environ.copy() result = subprocess.run( [bird_bin, "search", query, "-n", "15", "--json"], capture_output=True, text=True, timeout=30, env=env ) ``` ### Technical Analysis The scanner imports every assignment from the project `.env` file into the global process environment without restricting variable names. It then copies the entire environment and passes it to the third-party `bird` executable. Twitter/X access only requires a narrow set of authentication values, documented as `AUTH_TOKEN` and `CT0`. Passing every environment variable exceeds least privilege. The child process may receive unrelated cloud credentials, API keys, CI/CD secrets, database passwords, Agent configuration, or other tokens inherited from the parent process or loaded from `.env`. The audited Python code does not directly transmit these unrelated values, and its direct HTTP requests use hardcoded market-data destinations. Nevertheless, `bird` is network-capable and therefore becomes a potential exfiltration boundary for every inherited secret. ### Attack Path 1. A user or Agent runs the Skill in an environment containing unrelated sensitive variables. 2. Alternatively, unrelated secrets are stored in the project `.env` file. 3. `hot_scanner.py` imports every `.env` assignment into `os.environ`. 4. A social scan invokes `bird` and supplies a full copy of `os.environ`. 5. If the ...[truncated 767 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Do not modify the global `os.environ` when parsing `.env`. 2. Accept only explicitly required variables, such as `AUTH_TOKEN` and `CT0`. 3. Construct a minimal subprocess environment rather than copying the parent environment. 4. Preserve only essential runtime values such as a trusted `PATH`, locale, and required Twitter credentials. 5. Reject or ignore unknown `.env` keys. 6. Resolve and validate the expected `bird` executable before invocation. 7. Document that Twitter credentials are passed to an external executable. Example hardening pattern: ```python allowed = {"AUTH_TOKEN", "CT0"} credentials = {} if ENV_FILE.exists(): for raw_line in ENV_FILE.read_text(encoding="utf-8").splitlines(): line = raw_line.strip() if line and not line.startswith("#") and "=" in line: key, value = line.split("=", 1) key = key.strip() if key in allowed: credentials[key] = value.strip() child_env = { "PATH": "/usr/local/bin:/usr/bin:/bin", **credentials, } result = subprocess.run( [verified_bird_path, "search", query, "-n", "15", "--json"], capture_output=True, text=True, timeout=30, env=child_env, check=False, ) ``` ]]>

T09 · Insecure Skill Coding Practices

Error
Location
scripts/rumor_scanner.py:33
Finding
Rumor Scanner exposes the complete process environment to the Twitter CLI<![CDATA[ ## Vulnerability Details **File Location**: `scripts/rumor_scanner.py:33-38`, `scripts/rumor_scanner.py:77-81`, and `scripts/rumor_scanner.py:130-134` **Vulnerability Type**: Excessive credential propagation to a subprocess **Risk Level**: High ### Vulnerable Code ```python def load_env(): """Load environment variables from .env file.""" if BIRD_ENV.exists(): for line in BIRD_ENV.read_text().splitlines(): if '=' in line and not line.startswith('#'): key, value = line.split('=', 1) os.environ[key.strip()] = value.strip().strip('"').strip("'") ``` ```python cmd = [BIRD_CLI, 'search', query, '-n', '10', '--json'] env = os.environ.copy() result = subprocess.run(cmd, capture_output=True, text=True, timeout=30, env=env) ``` The same pattern is repeated for general Twitter buzz searches: ```python cmd = [BIRD_CLI, 'search', query, '-n', '15', '--json'] env = os.environ.copy() result = subprocess.run(cmd, capture_output=True, text=True, timeout=30, env=env) ``` ### Technical Analysis The `.env` parser accepts arbitrary variable names and writes them into the global process environment. Both Twitter search paths then pass the complete environment to `bird`. The declared feature only requires Twitter/X authentication. There is no functional need to disclose all other process secrets to the child. The risk is amplified because the executable performs authenticated network requests and is installed separately from this repository. This behavior explains the pre-scan warning concerning sensitive information sent through a network-capable component. No evidence was found that `rumor_scanner.py` itself deliberately uploads unrelated secrets, but its subprocess boundary gives the external executable access to them. ### Attack Path 1. The Skill is launched from a process containing sensitive environment variables. 2. `load_env()` may add further arbitrary secrets from the project `.env`. 3. `searc ...[truncated 722 chars]
Remediation
<![CDATA[ ## Remediation Suggestions - Replace global environment mutation with a local credential dictionary. - Permit only documented variables such as `AUTH_TOKEN` and `CT0`. - Build an allowlisted subprocess environment instead of using `os.environ.copy()`. - Add a mode that disables authenticated social scanning. - Fail safely when required credentials are unavailable. - Do not silently suppress all subprocess exceptions; log sanitized diagnostic information without printing secrets. - Run the external client under a restricted account or sandbox when possible. - Add automated tests confirming that unrelated environment variables are not visible to the child process. ]]>

T08 · Insecure Dependencies

Warning
Location
scripts/hot_scanner.py:364
Finding
Unpinned globally installed Twitter dependency receives live session credentials<![CDATA[ ## Vulnerability Details **File Location**: `README.md:143-153`, `SKILL.md:152-154`, `docs/HOT_SCANNER.md:114-151`, and `scripts/hot_scanner.py:364-390` **Vulnerability Type**: Unsafe third-party dependency and executable resolution **Risk Level**: Medium ### Vulnerable Code and Instructions ```bash npm install -g @steipete/bird ``` The documentation then instructs users to provide live Twitter/X session credentials: ```text Create `.env` file: AUTH_TOKEN=your_auth_token CT0=your_ct0_token ``` The Hot Scanner also falls back to resolving the executable through the caller's `PATH`: ```python bird_paths = [ "/home/clawdbot/.nvm/versions/node/v24.12.0/bin/bird", "/usr/local/bin/bird", "bird" ] bird_bin = None for p in bird_paths: if Path(p).exists() or p == "bird": bird_bin = p break ``` It subsequently executes the selected binary with credentials in its environment: ```python result = subprocess.run( [bird_bin, "search", query, "-n", "15", "--json"], capture_output=True, text=True, timeout=30, env=env ) ``` ### Technical Analysis The installation command does not pin an exact reviewed package version or verify package integrity. A future release, compromised publisher account, or package-registry incident could alter the code executed by the Skill after the repository has been reviewed. Global installation also expands the package's reach beyond this project. In addition, the fallback string `"bird"` trusts `PATH` resolution. An attacker who can place a malicious executable earlier in `PATH` can cause it to run under the appearance of the expected Twitter client. This is particularly sensitive because the executable receives live session cookies and, under the current implementation, the complete inherited environment. ### Attack Path Supply-chain path: 1. The user runs the documented unpinned global installation command. 2. A compromised or malicious package release is installed. 3. The user config ...[truncated 955 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Pin an exact reviewed version of `@steipete/bird`. 2. Use a lockfile and package integrity verification. 3. Install the dependency in a project-local, isolated environment rather than globally. 4. Resolve the executable to a fixed absolute path. 5. Verify the executable's ownership, permissions, version, and cryptographic digest before use. 6. Do not fall back to an unverified `PATH` lookup. 7. Pass only required credentials through a minimal environment. 8. Consider using an official, scoped Twitter/X API instead of browser session cookies. 9. Document the dependency's trust boundary and provide a social-scanning opt-out. ]]>

T05 · Unauthorized Access and Privilege Escalation

Error
Location
docs/HOT_SCANNER.md:132
Finding
Documentation recommends granting Terminal unnecessary Full Disk Access<![CDATA[ ## Vulnerability Details **File Location**: `docs/HOT_SCANNER.md:132-142` **Vulnerability Type**: Excessive operating-system permissions **Risk Level**: High ### Vulnerable Instructions ```text ### 2. Get Auth Tokens **Option A: Browser cookies (macOS)** 1. Login to x.com in Safari/Chrome 2. Grant Terminal "Full Disk Access" in System Settings 3. Run `bird whoami` to verify ``` ### Technical Analysis Full Disk Access is a broad macOS privacy permission that allows Terminal-launched applications to access protected user data. A stock and social-trend scanner does not require general access to the user's protected files. Because the instructions grant the permission to Terminal rather than to a narrowly isolated component, other commands subsequently launched from Terminal may inherit access to protected browser and user data. This is especially dangerous when combined with a globally installed, mutable third-party executable. The documentation already provides manual token extraction as an alternative, demonstrating that the broad permission is not necessary for the declared functionality. ### Attack Path 1. The user follows the documentation and grants Terminal Full Disk Access. 2. The user installs or runs the third-party Twitter CLI from Terminal. 3. The CLI, or another compromised Terminal-launched process, accesses protected browser databases or unrelated private files. 4. Retrieved cookies, credentials, messages, or documents are transmitted or misused. 5. The permission may remain active after the scan, extending exposure beyond the Skill's execution. ### Impact Assessment A malicious Terminal-launched process may gain access to protected files belonging to the current macOS user, potentially including browser data, communications, backups, and application state. The exact accessible data depends on macOS controls and user configuration. This permission materially exceeds the minimum privileges necessary to retrieve public stock infor ...[truncated 53 chars]
Remediation
<![CDATA[ ## Remediation Suggestions - Remove the recommendation to grant Terminal Full Disk Access. - Prefer manual, scoped credential configuration or an official restricted API. - If browser-cookie access is unavoidable, use a dedicated, sandboxed helper with the narrowest possible permission. - Tell users to revoke any temporary permission immediately after use. - Warn users that browser session cookies can permit account access and must be protected like passwords. - Avoid storing session cookies in a repository-local plaintext `.env` file where possible; use an OS credential store. ]]>

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/portfolio.py:111
Finding
Portfolio and watchlist financial data are stored without explicit restrictive permissions<![CDATA[ ## Vulnerability Details **File Location**: `scripts/portfolio.py:42-48`, `scripts/portfolio.py:111-119`, and `scripts/watchlist.py:56-77` **Vulnerability Type**: Plaintext sensitive data and unsafe file permissions **Risk Level**: Medium ### Vulnerable Code Portfolio directory and path creation: ```python def get_storage_path() -> Path: """Get the portfolio storage path.""" # Use ~/.clawdbot/skills/stock-analysis/portfolios.json state_dir = os.environ.get("CLAWDBOT_STATE_DIR", os.path.expanduser("~/.clawdbot")) portfolio_dir = Path(state_dir) / "skills" / "stock-analysis" portfolio_dir.mkdir(parents=True, exist_ok=True) return portfolio_dir / "portfolios.json" ``` Portfolio write using a predictable temporary path: ```python self.path.parent.mkdir(parents=True, exist_ok=True) # Atomic write: write to temp file, then rename tmp_path = self.path.with_suffix(".tmp") try: with open(tmp_path, "w", encoding="utf-8") as f: json.dump(self._data, f, indent=2) tmp_path.replace(self.path) ``` Watchlist storage: ```python def ensure_dirs(): """Create storage directories.""" WATCHLIST_DIR.mkdir(parents=True, exist_ok=True) ``` ```python def save_watchlist(items: list[WatchlistItem]): """Save watchlist to file.""" ensure_dirs() data = [asdict(item) for item in items] WATCHLIST_FILE.write_text(json.dumps(data, indent=2)) ``` ### Technical Analysis Portfolio files contain asset identifiers, quantities, cost bases, and timestamps. Watchlist files can contain target prices, stop prices, signal preferences, and user notes. This is sensitive financial and behavioral information. The code relies on the process umask to determine directory and file permissions. In a permissive or shared environment, the resulting files may be readable by other local users. The portfolio implementation also uses a predictable `.tmp` filename without explicitly protecting its permissions. The storage is plaintext, a ...[truncated 1167 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Create the state directory with mode `0700`. 2. Create portfolio and watchlist files with mode `0600`. 3. Use `os.open()` with explicit permission flags rather than relying on the process umask. 4. Use a securely created temporary file in the same directory for atomic replacement. 5. Reject symbolic links and verify that the state directory is owned by the current user. 6. Validate the permissions of existing files before reading or updating them. 7. Warn when `CLAWDBOT_STATE_DIR` points to a shared or insecure location. 8. Consider encryption at rest when portfolio information is handled on multi-user systems. Example permission hardening: ```python portfolio_dir.mkdir(parents=True, exist_ok=True, mode=0o700) os.chmod(portfolio_dir, 0o700) fd = os.open( tmp_path, os.O_WRONLY | os.O_CREAT | os.O_TRUNC | os.O_NOFOLLOW, 0o600, ) with os.fdopen(fd, "w", encoding="utf-8") as f: json.dump(self._data, f, indent=2) os.replace(tmp_path, self.path) os.chmod(self.path, 0o600) ``` ]]>
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Tool MisuseTool Parameter Abuse, Chaining Abuse, Unsafe Defaults
  • Rogue AgentSelf-Modification, Session Persistence
Findings (55)

Tool Parameter Abuse

High
Category
Tool Misuse
Content
GET  /portfolios
   POST /portfolios
   PUT  /portfolios/{id}
   DELETE /portfolios/{id}

   GET  /portfolios/{id}/assets
   POST /portfolios/{id}/assets
Confidence
80% confidence
Finding
Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Tool Parameter Abuse

High
Category
Tool Misuse
Content
GET  /portfolios/{id}/assets
   POST /portfolios/{id}/assets
   PUT  /portfolios/{id}/assets/{ticker}
   DELETE /portfolios/{id}/assets/{ticker}

   GET  /portfolios/{id}/performance?period=weekly
   GET  /portfolios/{id}/summary
Confidence
80% confidence
Finding
Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Tool Parameter Abuse

High
Category
Tool Misuse
Content
GET  /alerts
   POST /alerts
   DELETE /alerts/{id}

   GET  /user/subscription
   POST /user/subscription/upgrade
Confidence
80% confidence
Finding
Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Tp4

High
Category
MCP Tool Poisoning
Confidence
94% confidence
Finding
The skill description claims a large set of capabilities and trusted data-source expectations, while the documented behavior appears inconsistent and includes undeclared external sources. This is dangerous because users and orchestrators may make trust decisions based on inaccurate declarations, leading to unexpected data exfiltration, network access, or automation behavior outside the stated scope.

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding
The skill description claims a large set of capabilities and trusted data-source expectations, while the documented behavior appears inconsistent and includes undeclared external sources. This is dangerous because users and orchestrators may make trust decisions based on inaccurate declarations, leading to unexpected data exfiltration, network access, or automation behavior outside the stated scope.

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding
The skill description claims a large set of capabilities and trusted data-source expectations, while the documented behavior appears inconsistent and includes undeclared external sources. This is dangerous because users and orchestrators may make trust decisions based on inaccurate declarations, leading to unexpected data exfiltration, network access, or automation behavior outside the stated scope.

Self-Modification

High
Category
Rogue Agent
Content
- [ ] Add timeout per indicator (10s max)
- [ ] Test with multiple stocks in sequence
- [ ] Measure actual runtime improvement
- [ ] Update SKILL.md with new runtime (target: 3-4s)

**Expected Impact**:
- Reduce runtime from 6-10s to 3-4s per stock
Confidence
85% confidence
Finding
Skill modifies its own code, configuration, or behavior at runtime. Self-modification enables an agent to escalate privileges, disable safety constraints, or install persistent backdoors.

Self-Modification

High
Category
Rogue Agent
Content
- [ ] Add timeout per indicator (10s max)
- [ ] Test with multiple stocks in sequence
- [ ] Measure actual runtime improvement
- [ ] Update SKILL.md with new runtime (target: 3-4s)

**Expected Impact**:
- Reduce runtime from 6-10s to 3-4s per stock
Confidence
85% confidence
Finding
Skill modifies its own code, configuration, or behavior at runtime. Self-modification enables an agent to escalate privileges, disable safety constraints, or install persistent backdoors.

Credential Access

High
Category
Privilege Escalation
Content
Create `.env` file in the skill directory:

```bash
# /path/to/stock-analysis/.env
AUTH_TOKEN=your_auth_token_here
CT0=your_ct0_token_here
```
Confidence
96% confidence
Finding
The .env example directs users to place active Twitter/X authentication tokens in a file within the skill directory, creating a concrete pathway for sensitive credential exposure through source control, backups, logs, or accidental file sharing. Because these values are session tokens rather than low-privilege API keys, compromise could allow unauthorized access to the associated X account until revoked or expired.

Credential Access

High
Category
Privilege Escalation
Content
from collections import defaultdict
from concurrent.futures import ThreadPoolExecutor, as_completed

# Load .env file if exists
ENV_FILE = Path(__file__).parent.parent / ".env"
if ENV_FILE.exists():
    with open(ENV_FILE) as f:
Confidence
86% confidence
Finding
The code explicitly targets a `.env` file and imports its contents, which commonly contain API keys, tokens, or credentials. While loading secrets is sometimes legitimate, here it creates unnecessary credential exposure because the script later runs an external program with inherited environment state.

Credential Access

High
Category
Privilege Escalation
Content
from concurrent.futures import ThreadPoolExecutor, as_completed

# Load .env file if exists
ENV_FILE = Path(__file__).parent.parent / ".env"
if ENV_FILE.exists():
    with open(ENV_FILE) as f:
        for line in f:
Confidence
84% confidence
Finding
Opening and parsing a project-level `.env` file is credential-access behavior that increases risk when combined with later subprocess execution. The danger is contextual: a market scanner does not need broad access to all local secrets, so this exceeds least-privilege expectations.

Env Variable Harvesting

High
Category
Data Exfiltration
Content
for category, query in searches:
                try:
                    env = os.environ.copy()
                    result = subprocess.run(
                        [bird_bin, "search", query, "-n", "15", "--json"],
                        capture_output=True, text=True, timeout=30, env=env
Confidence
98% confidence
Finding
Copying the entire environment is a form of secret harvesting because it collects all available environment variables, including credentials unrelated to this feature. In this file, that harvested data is immediately provided to an external subprocess, making accidental or malicious exfiltration much more plausible.

Credential Access

High
Category
Privilege Escalation
Content
# Bird CLI path
BIRD_CLI = "/home/clawdbot/.nvm/versions/node/v24.12.0/bin/bird"
BIRD_ENV = Path(__file__).parent.parent / ".env"

def load_env():
    """Load environment variables from .env file."""
Confidence
85% confidence
Finding
Referencing a repository-local .env for runtime secrets is not inherently malicious, but in this script it supports external CLI authentication and broad environment propagation. That creates a real credential-handling risk because secrets are pulled from disk and made available to another executable without strict controls.

Credential Access

High
Category
Privilege Escalation
Content
BIRD_ENV = Path(__file__).parent.parent / ".env"

def load_env():
    """Load environment variables from .env file."""
    if BIRD_ENV.exists():
        for line in BIRD_ENV.read_text().splitlines():
            if '=' in line and not line.startswith('#'):
Confidence
87% confidence
Finding
The .env parsing logic reads every key/value pair and places it into os.environ, which is later inherited by the Bird CLI. This broad secret access is dangerous because it exceeds least privilege and can expose credentials unrelated to rumor scanning.

Env Variable Harvesting

High
Category
Data Exfiltration
Content
for query in queries[:4]:  # Limit to avoid rate limits
        try:
            cmd = [BIRD_CLI, 'search', query, '-n', '10', '--json']
            env = os.environ.copy()
            
            result = subprocess.run(cmd, capture_output=True, text=True, timeout=30, env=env)
Confidence
92% confidence
Finding
Copying the full environment and passing it to an external CLI can leak unrelated secrets, tokens, and service credentials into a child process that does not need them. In a tool-running agent environment, this broad inheritance substantially increases blast radius if the CLI is compromised, logs its environment, or forwards telemetry.

Env Variable Harvesting

High
Category
Data Exfiltration
Content
for query in queries[:3]:
        try:
            cmd = [BIRD_CLI, 'search', query, '-n', '15', '--json']
            env = os.environ.copy()
            
            result = subprocess.run(cmd, capture_output=True, text=True, timeout=30, env=env)
Confidence
92% confidence
Finding
This second occurrence repeats the same risky pattern of forwarding the entire environment to an external binary. Because the skill context already includes local .env ingestion, the combination makes credential overexposure more dangerous than ordinary environment inheritance.

Description-Behavior Mismatch

Medium
Confidence
95% confidence
Finding
The manifest describes a stock and crypto analysis skill with portfolio/watchlist features, but this document proposes transforming it into a commercial mobile product with backend services, authentication, cloud infrastructure, and monetization. Those are materially broader product behaviors than an analysis skill and represent a semantic scope expansion rather than an implementation detail.

Context-Inappropriate Capability

Medium
Confidence
93% confidence
Finding
Stripe integration, webhook handling, subscription tier changes, and in-app purchase flows are commercial billing capabilities, not direct requirements of stock or crypto analysis. The manifest does not state any billing or payment-processing purpose, so this capability is contextually outside the justified scope.

Missing User Warnings

Medium
Confidence
86% confidence
Finding
The roadmap includes Mixpanel/Amplitude and Sentry for analytics and error tracking but does not mention any user-facing disclosure, consent flow, or privacy controls tied to that telemetry. In a retail-investor app handling account, portfolio, and behavioral data, undisclosed tracking can lead to privacy violations, regulatory exposure, and accidental leakage of sensitive user information into third-party services.

Missing User Warnings

Medium
Confidence
95% confidence
Finding
The README explicitly instructs users to extract `AUTH_TOKEN` and `CT0` cookies from browser DevTools and store them in a `.env` file, which are effectively session credentials for the user's X account. This encourages insecure handling of sensitive authentication material and increases the risk of account takeover if the tokens are exposed through shell history, logs, backups, repo commits, or weak local file protections.

Lp3

Medium
Category
MCP Least Privilege
Confidence
92% confidence
Finding
The skill advertises shell, network, filesystem, and environment-dependent behavior through documented commands and metadata, but it does not declare any explicit tool scope or permissions boundary. This is dangerous because a host agent may grant broader capabilities than users expect, making command execution, network access, and local file writes occur without clear least-privilege constraints.

Missing User Warnings

Medium
Confidence
89% confidence
Finding
The skill instructs users to place Twitter/X authentication material in a local .env file but does not include any warning about secret sensitivity, storage hygiene, or accidental disclosure. This is dangerous because users may store live session tokens insecurely, commit them to source control, or expose them to other tools, enabling account takeover or unauthorized API access.

Missing User Warnings

Medium
Confidence
91% confidence
Finding
The documentation instructs users to obtain Twitter/X session credentials from browser cookies and store them in a local .env file or environment variables, but it does not clearly warn that these are highly sensitive session tokens that can grant account access. In the context of an agent skill that may be run, shared, or automated, encouraging manual extraction and storage of live auth tokens increases the risk of credential theft, accidental disclosure, or account compromise.

Missing User Warnings

Medium
Confidence
92% confidence
Finding
The usage guide shows portfolio creation, adding holdings, and watchlist modification commands without clearly warning that they persist and mutate local user data. In an agent-driven context, users may assume these are read-only analysis examples and unintentionally create, alter, or overwrite portfolio/watchlist state, leading to integrity issues, privacy exposure, or confusion in downstream automation.

Description-Behavior Mismatch

Medium
Confidence
95% confidence
Finding
The module docstring and CLI description frame this script as 'Stock analysis using Yahoo Finance data' and 'Analyze stocks using Yahoo Finance data'. In practice, the code also fetches Google News RSS for breaking news and uses EDGAR/SEC Form 4 filings for insider trading sentiment, which are materially different data sources and broaden the behavior beyond the stated Yahoo Finance scope.

Static analysis

No suspicious patterns detected.