Back to skill

Security audit

info-research-report

Security checks for vulnerabilities and agentic risk

Overview

This report-generation skill is mostly purpose-aligned, but it needs review because it can fetch arbitrary URLs from input data and send gathered content to external AI and email services.

Install only if you are comfortable with webpage content, prompts, summaries, and generated reports being processed by configured third-party AI/email services. Use trusted results.json files, prefer --no-fetch for sensitive work, avoid internal/private URLs, and review the DOCX before sending externally.

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 (2)

T09 · Insecure Skill Coding Practices

Warning
Location
run.py:128
Finding

Unvalidated URL Fetching Enables Server-Side Request Forgery

Content
View full analysis
str: """Fetch webpage content through mcporter and BrowserOS.""" try: cmd = ["mcporter", "call", "browseros.get_page_content", f"url={url}"] result = subprocess.run( cmd, capture_output=True, text=True, timeout=timeout, encoding='utf-8', errors='ignore' ) ``` The URL reaches this function directly from the user-supplied results file: ```python title = item.get("title") or "" url = item.get("url") or "" content = item.get("content") or "" if not content and fetch_content and url and url != "N/A": print(f" Fetching content from: {url}") content = fetch_page_content(url) if content: item["content"] = content[:8000] ``` ### Technical Analysis The Skill accepts a path to a JSON file and reads each result's `url` field without validating its scheme, hostname, resolved IP address, port, or redirect destination. The URL is then passed to the externally installed BrowserOS tool. Using an argument array for `subprocess.run` prevents conventional shell metacharacter injection, but it does not constrain where BrowserOS may connect. Depending on BrowserOS protocol support and network placement, a crafted URL could target: - Loopback services such as `127.0.0.1` or `::1` - RFC 1918 private-network hosts - Link-local services and cloud metadata endpoints - Internal administrative applications - Non-HTTP schemes supported by the browser backend - A public URL that redirects to a prohibited internal destination This exceeds the minimum network privilege needed to research public web sources. The declared functionality requires access to public webpages, not arbitrary access to the host's internal or p ...[truncated 1430 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
run.py:168
Finding

Untrusted Web Content Can Manipulate LLM-Generated Report Conclusions

Content
View full analysis
.*?", "", text, flags=re.DOTALL | re.IGNORECASE) lines = [] for line in text.splitlines(): l = line.strip() if l.startswith("The user is asking me") or l.startswith("I need to be careful"): continue lines.append(line) return "\n".join(lines).strip() ``` ### Technical Analysis Webpage content is attacker-controlled data. The Skill appends that data to an LLM prompt and asks the model to produce content that is later trusted as a structured summary. A malicious page can embed instructions telling the model to disregard the summarization request, fabricate conclusions, omit unfavorable facts, or emit attacker-selected report text. The prompt contains natural-language requirements, but there is no robust trust-boundary separation or output enforcement. `_clean_llm_output()` only removes `think` tags and two specific English sentence prefixes. It does not detect or neutralize source-level instructions, validate factual corresp ...[truncated 1907 chars]
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • 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 (17)

Tp4

High
Category
MCP Tool Poisoning
Confidence
96% confidence
Finding

The skill advertises an automated research-report workflow, but the documentation reveals additional behaviors with security and privacy consequences: sending scraped page content to third-party LLM APIs, invoking external browser tooling, and depending on prebuilt results.json rather than performing the claimed end-to-end search itself. This mismatch can cause users to unknowingly expose sensitive content or grant broader execution/network trust than expected.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The README advertises automatic sending of generated reports to a specified email address, but does not warn users that potentially sensitive collected content will be transmitted externally. In a research-report workflow that may aggregate scraped web content and AI-generated analysis, this can cause unintentional disclosure of sensitive, regulated, or internal information if users do not realize outbound email is part of the process.

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.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
72% confidence
Finding

The manifest description is written only in Chinese, which may imply a language-specific skill experience without documenting user opt-in or a justified locale restriction. Under the language policy, a forced language or locale should be explicit, optional, or clearly justified as region-specific.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
88% confidence
Finding

The hardcoded use of an external Minimax API endpoint indicates the skill is designed to transmit analysis inputs to a third-party service. In this context, the danger is not the URL itself but the silent off-platform transmission of potentially sensitive research content and metadata as part of normal operation.

Content

Scanner excerpt · run.py (reported line 81)May include surrounding context.

python
if api_key:
        try:
            import requests
            url = "https://api.minimax.chat/v1/text/chatcompletion_v2"
            headers = {
                "Authorization": f"Bearer {api_key}",
                "Content-Type": "application/json"

External Transmission

Medium
Category
Data Exfiltration
Confidence
94% confidence
Finding

The skill sends prompts, which may include fetched webpage contents and potentially sensitive research material, to an external LLM provider over the network. This creates a real data-exfiltration surface because any confidential data present in source pages or prompts is transmitted off-host to a third party, and the workflow does not appear to require explicit user consent or data minimization before transmission.

Content

Scanner excerpt · run.py (reported line 91)May include surrounding context.

python
"messages": [{"role": "user", "content": prompt}],
                "temperature": temperature
            }
            resp = requests.post(url, headers=headers, json=data, timeout=120)
            resp.raise_for_status()
            result = resp.json()
            return result["choices"][0]["message"]["content"].strip()

External Transmission

Medium
Category
Data Exfiltration
Confidence
88% confidence
Finding

The OpenAI API endpoint likewise represents an external transmission destination for prompts and source-derived content. Because the tool automatically fetches and summarizes webpages, users may not realize that raw content is being forwarded externally, making the privacy and data-governance risk more significant in this skill context.

Content

Scanner excerpt · run.py (reported line 105)May include surrounding context.

python
return ""
    try:
        import requests
        url = "https://api.openai.com/v1/chat/completions"
        headers = {
            "Authorization": f"Bearer {api_key}",
            "Content-Type": "application/json"

External Transmission

Medium
Category
Data Exfiltration
Confidence
94% confidence
Finding

This fallback OpenAI request transmits full prompt data externally, including user topic, page text, and derived research context. In a reporting tool that ingests arbitrary webpages, this can leak regulated, proprietary, or sensitive information to a third party without strong consent, classification, or filtering controls.

Content

Scanner excerpt · run.py (reported line 116)May include surrounding context.

python
"max_tokens": max_tokens,
            "temperature": temperature
        }
        resp = requests.post(url, headers=headers, json=data, timeout=60)
        resp.raise_for_status()
        result = resp.json()
        return result["choices"][0]["message"]["content"].strip()

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
89% confidence
Finding

The manifest describes an automated information research workflow involving search, deep content extraction, DOCX generation, and email sending. However, this implementation invokes an external CLI tool via subprocess to fetch page content, introducing arbitrary local program execution capability beyond the stated business purpose.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
98% confidence
Finding

The prompt explicitly requires all output to be in Chinese and forbids English output, which is a natural-language locale constraint. Because this is imposed unconditionally rather than based on user preference or a clearly documented regional-compliance need, it fits the language/locale policy violation category.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

This instruction again forces the model to respond only in Chinese and suppresses English output, with no evidence of user-selected language preference. That creates a language-policy issue across the skill's generated content.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

Although sending email is declared in the manifest, the implementation does so by spawning a Python interpreter on an external script rather than using a bounded mail API. This gives the skill a broader local execution capability than is semantically necessary for a research-report generator.

Content

No source excerpt is available for this finding.

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
87% confidence
Finding

The README describes webpage fetching and analysis but does not clearly warn that the skill performs network access and may transmit queries or retrieved content to third-party sites and APIs. Because the workflow also supports LLM summarization, users may unknowingly expose research topics, browsing targets, or collected content to external services.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
90% confidence
Finding

The description line forces a specific language/locale for the skill's natural-language interface. Under the policy, language constraints should either offer user choice or be clearly justified as region-specific; this file does not provide either at the point of description.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
83% confidence
Finding

The operational instructions and user-facing documentation are entirely in Chinese, while the skill does not state that users may interact in other languages or choose a locale. This can constitute a language policy violation when a specific language is imposed without opt-in or documented justification.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Low
Category
Not specified by scanner
Confidence
78% confidence
Finding

The manifest description presents an end-to-end workflow including multi-source search and deep mining, but the later integration section says the search/parsing stages are expected to be performed by other tools or upstream skills, while this skill itself is mainly a report generator and email sender using an existing results.json. That creates a semantic mismatch between the advertised all-in-one workflow and the documented operational scope of the skill file.

Content

No source excerpt is available for this finding.

Vague Triggers

Low
Category
Not specified by scanner
Confidence
90% confidence
Finding

In this manifest file, the only descriptive text is a broad capability statement meaning 'automated workflow for information research reports,' but it does not specify trigger phrases, scope boundaries, or when the skill should versus should not activate. That ambiguity can cause unintended invocation because many general research or reporting requests could match this description.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.