Back to skill

Security audit

Opportunity Scout

Security checks for vulnerabilities and agentic risk

Overview

This skill is a public-source opportunity research helper with disclosed local state and report generation, though users should treat generated reports as untrusted web-derived content.

Install only if you are comfortable with a skill that searches public forums, writes local config/history files, and produces markdown reports. Open generated reports as untrusted web-derived summaries, avoid feeding them back to agents as instructions, and use explicit output paths where overwriting an existing file would not matter.

Vulnerability Patterns
  • 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
  • Embedded Malicious CodeShips malicious scripts inside the skill and executes them locally
Findings (1)

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/digest.py:141
Finding

Untrusted Search Results Are Rendered as Unsanitized Markdown and YAML

Content
View full analysis
1: sub = parts[1].split("/")[0] source = f"reddit:r/{sub}" elif "news.ycombinator.com" in url: source = "hackernews" elif "github.com" in url: source = "github" # Match signal keywords found in title + snippet text = f"{title} {snippet}".lower() matched = [] all_signals = item.get("signal_keywords", DEFAULT_SIGNAL_KEYWORDS) for kw in all_signals: if kw.lower() in text: matched.append(kw) finding = { "title": title, "url": url, "snippet": snippet, "source": item.get("source", source), "niche": item.get("niche", ""), "date": item.get("date", item.get("age", datetime.now().strftime("%Y-%m-%d"))), "matched_keywords": matched, } findings.append(finding) ``` Untrusted niche values are inserted directly into YAML frontmatter: ```python # YAML frontmatter lines.append("---") lines.append(f"date: {date_str}") lines.append(f"time: {time_str}") lines.append("type: opportunity-scan") niche_yaml = ", ".join(niches) if niches else "general" lines.append(f"niches: [{niche_yaml}]") lines.append(f"find ...[truncated 4402 chars]
Remediation
View remediation
Vulnerability Patterns
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • 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
Findings (6)

Tp4

High
Category
MCP Tool Poisoning
Confidence
96% confidence
Finding

The declared description presents an operational research/analysis skill that gathers and analyzes demand signals from external sources. The supplied code chunk does not implement that behavior; it only configures such a system by reading/writing a local JSON config, adding/removing niches and sources, setting schedules, and adjusting scoring weights. Configuration is a supporting component, but this chunk alone materially differs from the declared primary purpose and lacks the core promised capabilities.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding

The code partially aligns with the discovery/scanning theme: it prepares queries aimed at finding pain-point language and processes returned search results into findings. However, several important parts of the declared description are not implemented in this chunk. There is no competition analysis, no trend tracking, and no richer prioritization or digest generation beyond sorting findings by number of matched keywords. The claimed 'signal strength scoring' is only a very rough proxy via keyword matching, not an explicit scoring system. Also, the script does not itself fetch data from Reddit/HN/configurable sources; it only generates queries and parses externally supplied search results. So the description overstates the implemented behavior.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
70% confidence
Finding

Without declared permissions the skill's intent is opaque and cannot be validated.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The 'Use when' field includes generic triggers such as 'business ideas', 'product ideas', and 'what should I build', which are broad enough to match ordinary conversation outside a narrowly defined opportunity-scanning context. The manifest does not provide exclusion conditions or negative examples to constrain when the skill should versus should not activate.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

This manifest file defines activation-like signal phrases such as "looking for," "frustrated," "workaround," and "does anyone know of" that are common in everyday discussion and not narrowly scoped to the skill's purpose. The configuration provides no explicit constraints or negative examples to distinguish genuine opportunity signals from general conversation, increasing the risk of overly broad triggering.

Content

No source excerpt is available for this finding.

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
83% confidence
Finding

The instructions explicitly support writing output to user-specified paths without guardrails, which can lead to unintended file overwrite or placement in sensitive locations if the path is influenced by ambiguous user input. In an agent setting, file-write actions should be constrained because seemingly harmless report generation can clobber existing files or create artifacts outside the intended workspace.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.