Back to skill

Security audit

LinkFox Market Research

Security checks for vulnerabilities and agentic risk

Overview

This skill mostly does what it claims, but it should be reviewed because it opens generated reports that may run untrusted active web content.

Review before installing. Avoid using sensitive business plans, secrets, or regulated data in prompts, and do not open generated reports in a privileged browser profile unless the skill is changed to validate report URLs, sanitize imported HTML, disable remote scripts, and escape user-provided text.

Vulnerability Patterns
  • Remote Payload Retrieval and ExecutionFetches external code whose behavior can change after review
  • 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
  • Embedded Malicious CodeShips malicious scripts inside the skill and executes them locally
Findings (2)

T03 · Remote Payload Retrieval and Execution

Error
Location
scripts/market-research.sh:82
Finding

Untrusted Remote HTML and JavaScript Are Downloaded and Executed

Content
View full analysis
str: """Extract inline script blocks, excluding external references.""" scripts = re.findall(r']*src=)[^>]*>(.*?)', html, re.DOTALL) return "\n".join(s for s in scripts if s.strip()) ``` From `scripts/merge_html.py:83-110`: ```python def merge(files: list, keyword: str = "") -> str: """Merge multiple HTML reports into a single report with navigation.""" reports = [] all_styles = set() all_scripts = [] external_css = set() external_js = set() for f in files: html = f.read_text(encoding="utf-8") title = extract_title(html) subtitle = extract_subtitle(html) body = extract_body(html) style = extract_styles(html) script = extract_scripts(html) order = guess_part_order(title) # Collect external CSS/JS references for m in re.finditer(r']+href="([^"]+)"[^>]*stylesheet', html): external_css.add(m.group(1)) for m in re.finditer(r']+src="([^"]+)"', html): external_js.add(m.group(1)) if style: all_styles.add(style) if script: all_scripts.append(f"// === {title} ===\n{script}") ``` From `scripts/merge_html.py:145-147` and `233-240`: ```python js_links = "\n".join(f'' for url in sorted(externa ...[truncated 3586 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Error
Location
scripts/merge_html.py:123
Finding

Stored HTML Injection Through the User-Supplied Category Name

Content
View full analysis
{report_title} ``` From `scripts/merge_html.py:223-226`: ```html
📊 {report_title}
{len(reports)} reports · LinkFox Agent
``` ### Technical Analysis The category name originates from the first command-line argument and is stored in `NAME`. It is passed to `merge_html.py` as the `--keyword` value and assigned directly to `report_title`. The title is then interpolated into two HTML contexts without HTML escaping: - The document's `` element. - Visible markup inside the sidebar. Filename filtering through `SAFE_NAME` does not protect these output contexts because the unfiltered `NAME` value is separately passed to `merge_html.py`. An attacker can provide a category name containing closing tags and active markup. For example, a value structured as `` can terminate the original title element and introduce a script into the generated document. The generated report is persistent on disk and is intended to be opened after generation, making this a stored HTML injection issue. The node ID is also incorporated into the title without explicit numeric validation. Alt ...[truncated 1732 chars]
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • 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
Findings (13)

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding

The skill description presents a specialized reporting workflow, but the underlying behavior appears to depend on a general external agent and may accept freer-form tasks than disclosed. In context, this makes the skill more dangerous because it handles networked remote execution with an API key, so a seemingly harmless research request could become a gateway to broader off-platform actions and metadata exposure.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

The skill description presents a specialized reporting workflow, but the underlying behavior appears to depend on a general external agent and may accept freer-form tasks than disclosed. In context, this makes the skill more dangerous because it handles networked remote execution with an API key, so a seemingly harmless research request could become a gateway to broader off-platform actions and metadata exposure.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding

The skill description presents a specialized reporting workflow, but the underlying behavior appears to depend on a general external agent and may accept freer-form tasks than disclosed. In context, this makes the skill more dangerous because it handles networked remote execution with an API key, so a seemingly harmless research request could become a gateway to broader off-platform actions and metadata exposure.

Content

No source excerpt is available for this finding.

Credential Access

High
Category
Privilege Escalation
Confidence
70% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · scripts/linkfox.py (reported line 41)May include surrounding context.

python
def get_api_key() -> str:
    """Get API key from environment."""
    key = os.environ.get("LINKFOXAGENT_API_KEY")
    if not key:
        print(

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
93% confidence
Finding

The skill invokes a shell script, reads environment variables, writes output files, and uses networked API access, yet it declares no explicit tool scope or permissions boundary. This is dangerous because the platform and user are not given a clear least-privilege contract, making it easier for the skill to gain broader execution capability than expected and harder to audit or constrain misuse.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The trigger conditions are broad and ambiguous, using natural-language examples that could activate the skill on loosely matching user text. This is dangerous because accidental invocation can send user-provided content into a shell-backed, networked workflow without a clear confirmation boundary, increasing the risk of unintended data transmission or misuse.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The skill states that it requires a network-accessible external API and an API key, but it does not warn users that their inputs will be transmitted to a third-party service. This is dangerous because users may provide commercially sensitive market targets or internal research prompts without informed consent about off-platform processing and credential-backed external calls.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
88% confidence
Finding

The script sends arbitrary task text and polling identifiers to a third-party remote API, but it does not provide an explicit runtime warning or consent check before transmitting user-supplied data. In a market-research skill, prompts may contain sensitive business data, product plans, or account-related information, so silent exfiltration to an external service creates a real privacy and data-handling risk.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The script's user-facing text and usage are entirely in Chinese, and line L015 fixes SITE="美国" rather than letting the user select locale. The policy requires avoiding forced language or locale constraints unless the user is given a choice or the restriction is clearly documented and justified.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
89% confidence
Finding

Line L021 performs rm -rf "$REPORT_DIR", which is a destructive file operation. Although the script prints progress messages elsewhere, there is no user-facing warning, confirmation, or nearby comment disclosing that an existing report directory will be removed before execution.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

This code emits <html lang="zh-CN">, which forces a specific language/locale in the output regardless of user preference. The file also presents all CLI text and generated UI text only in Chinese, with no opt-in or documented regional constraint, matching the language/locale policy concern.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The script forwards a user-supplied task prompt directly to an external service via linkfox.py and suppresses stderr, but provides no explicit notice, consent gate, or data-handling warning. In a market-research skill, prompts may contain category strategy, business plans, product ideas, or other sensitive commercial data, so silent transmission to a third-party backend creates a real confidentiality and compliance risk.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
95% confidence
Finding

The natural-language comments and usage output are presented only in Chinese, including the error/usage path shown to users. For a general-purpose skill, this imposes a specific language without opt-in or explanation, which matches the language/locale policy violation criteria.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.