Back to skill

Security audit

puget-sound-salmon-report

Security checks for vulnerabilities and agentic risk

Overview

This skill appears to do what it claims: scrape public fishing data, generate reports, and optionally email user-configured recipients.

Install only if you are comfortable with the skill scraping WDFW, writing local report state, reading a local email-credential file, and sending email to configured recipients or subscriber lists. Use --dry-run or --test before scheduled sends, keep SMTP/API credentials limited, and consider pinning matplotlib in an isolated environment.

Vulnerability Patterns
  • Insecure DependenciesIntroduces malicious components through unsafe dependency sources
  • 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
  • Embedded Malicious CodeShips malicious scripts inside the skill and executes them locally
Findings (1)

T08 · Insecure Dependencies

Note
Location
SKILL.md:22
Finding
Unpinned Third-Party Dependency Installation## Vulnerability Details **File Location**: `SKILL.md`, line 22 **Vulnerability Type**: Unpinned dependency installation **Risk Level**: Low ### Vulnerable Code ```bash pip install --user matplotlib # only needed for the weekly chart; everything else is stdlib ``` ### Technical Analysis The setup instructions install `matplotlib` without specifying an audited version or verifying package hashes. Consequently, installation behavior and transitive dependencies can change over time without corresponding changes to the reviewed Skill. The package name is legitimate and installation uses the standard Python package workflow; there is no evidence that the Skill intentionally installs a malicious or typosquatted dependency. Nevertheless, an unpinned installation creates a supply-chain exposure if a future package release or one of its transitive dependencies is compromised. Package installation may execute build backend or installation logic with the privileges of the invoking user. The `--user` option limits installation to the current user's Python environment and does not request administrator privileges. This reduces the potential scope but does not protect the user's files, credentials, or processes from code executed under that account. ### Attack Path 1. An attacker compromises a future `matplotlib` release, a required transitive dependency, or the configured Python package index. 2. A user follows the documented setup command after the compromised release becomes the version selected by `pip`. 3. `pip` downloads the unreviewed package or dependency and runs any applicable build or installation logic as the current user. 4. Malicious installation logic executes with the user's permissions and can access resources available to that account. This attack requires an upstream package, dependency, or package-index compromise; the repository itself does not contain or retrieve a known malicious payload. ### Impact Assess ...[truncated 791 chars]
Remediation
## Remediation Suggestions 1. Pin `matplotlib` and all transitive dependencies to versions that have been reviewed and tested. 2. Place dependencies in a dedicated requirements or lock file rather than installing an unconstrained latest release. 3. Record and enforce package hashes with `pip --require-hashes` to detect unexpected artifact substitution. 4. Example installation workflow: ```bash python3 -m pip install --user --require-hashes -r requirements.txt ``` 5. Generate the locked dependency set from a trusted package index and review updates before refreshing versions or hashes. 6. Prefer an isolated virtual environment so the optional charting dependency cannot alter the user's broader Python environment.
Vulnerability Patterns
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
Findings (2)

Lp3

Medium
Category
MCP Least Privilege
Confidence
88% confidence
Finding
The skill clearly performs network access and writes persistent local files, but the metadata declares no permissions. That creates a transparency and least-privilege problem: operators may approve or run the skill without realizing it can scrape remote content, fetch subscriber lists, send email, and persist state. In an agent/runtime environment, undeclared capabilities increase the chance of unintended data access or outbound actions.

Tp4

High
Category
MCP Tool Poisoning
Confidence
84% confidence
Finding
The stated purpose emphasizes creel scraping and reporting, but the skill also supports bulk email distribution, remote subscriber ingestion, unsubscribe handling, and persistent storage. That mismatch is security-relevant because users may authorize a seemingly simple reporting skill without appreciating that it can contact external recipient sources and distribute messages at scale, which raises abuse, privacy, and compliance risks. The context makes this more dangerous because the skill is designed for proactive alerts and automated scheduling, enabling repeated outbound actions with little human review.

Static analysis

No suspicious patterns detected.