Back to skill

Security audit

hxxra

Security checks for vulnerabilities and agentic risk

Overview

This research helper does what it says, but it sends local PDF text to an external LLM, writes to Zotero, and downloads arbitrary URLs without enough runtime safeguards.

Review before installing if you handle unpublished, confidential, or licensed PDFs. Use only trusted search-result JSON files, avoid running downloads from untrusted paper lists, use least-privilege Zotero API keys, and assume analyze may send the first pages of PDFs plus metadata to the configured LLM provider.

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/hxxra.py:346
Finding

Unrestricted PDF URL Fetching Enables Server-Side Request Forgery

Content
View full analysis
Tuple[bool, str]: """ Download a PDF file. Args: url: PDF URL dest_path: Destination file path timeout: Request timeout in seconds Returns: Tuple[bool, str]: (True if successful, error message if failed) """ headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.0" } try: req = urllib.request.Request(url, headers=headers) with urllib.request.urlopen(req, timeout=timeout, context=SSL_CONTEXT) as resp: with open(dest_path, "wb") as f: shutil.copyfileobj(resp, f) ``` The attacker-controlled data reaches this function through `handle_download()`: ```python with open(from_file, "r", encoding="utf-8") as f: data = json.load(f) if isinstance(data, list): papers = data elif isinstance(data, dict) and "results" in data: papers = data["results"] # ... pdf_url = paper.get("pdf_url", "") # ... success, msg = download_pdf(pdf_url, filepath) ``` ### Technical Analysis The `download` command accepts a caller-selected JSON file and reads each paper's `pdf_url` without validating its origin. The value is passed directly to `urllib.request.urlopen()`. There are no controls restricting: - URL schemes - Destination hostnames or ports - Loopback, private, link-local, or reserved IP addresses - Cloud instance metadata endpoints - DNS rebinding - Redirect destinations - Non-academic or otherwise unexpected external hosts Consequently, a crafted search-results file can instruct the process to make requests to services reachable from the Skill's execution environment. Redirects may also be used to bypass a s ...[truncated 2051 chars]
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • System Prompt LeakageDirect Leakage, Indirect Extraction, Tool-Based Exfiltration
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
Findings (11)

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The analyze command explicitly uses an LLM API to process PDF content, but the documentation does not clearly warn users that extracted paper text may be transmitted to an external third-party service. This creates a privacy and data-governance risk, especially if users analyze unpublished papers, licensed content, or documents containing sensitive annotations or embedded confidential material.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The save command sends paper metadata to the Zotero API, but the skill does not clearly warn users that bibliographic data, URLs, and possibly collection organization details are transmitted to a third-party service. While this is expected for the feature, lack of disclosure can lead to unintended sharing of sensitive research interests, internal project topics, or nonpublic source references.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
50% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · config.json (reported line 14)May include surrounding context.

json
"llm": {
        "provider": "openai",
        "api_key": "YOUR_OPENAI_API_KEY",
        "base_url": "https://api.openai.com/v1",
        "model": "gpt-4o-mini",
        "max_tokens": 4000,
        "temperature": 0.3

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The skill reads Zotero credentials from config/environment and uses them to perform authenticated remote writes. While saving research metadata to Zotero can be functionally relevant to a research assistant, the broad credential access and upload capability are sensitive and are not clearly disclosed in the skill description, creating a trust and data-governance risk.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The code silently loads Zotero API credentials from config or environment and later uses them for outbound requests. This is a security-relevant capability because it accesses secrets and transmits user/library metadata without a clear execution-time notice or consent boundary.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

The analyze flow extracts text from local PDFs and sends that content to an external OpenAI-compatible API. This is a real data exfiltration boundary because potentially sensitive document contents leave the local environment without any prominent disclosure in the skill's stated description.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
90% confidence
Finding

The configured default endpoint points to an external OpenAI API, confirming network transmission of analyzed content off-host. External transmission is not inherently malicious, but in this skill it is security-relevant because the transmitted payload includes extracted document text and metadata from local PDFs.

Content

Scanner excerpt · scripts/hxxra.py (reported line 497)May include surrounding context.

python
# Set defaults
    llm_config.setdefault("provider", "openai")
    llm_config.setdefault("base_url", "https://api.openai.com/v1")
    llm_config.setdefault("model", "gpt-4o-mini")
    llm_config.setdefault("max_tokens", 4000)
    llm_config.setdefault("temperature", 0.3)

Ssd 1

Medium
Category
Not specified by scanner
Confidence
89% confidence
Finding

Extracted PDF text is embedded directly into the LLM prompt as if it were normal paper content, so malicious instructions inside a PDF can influence model output or cause the model to ignore intended extraction behavior. This is a prompt-injection risk that is especially relevant here because the skill processes untrusted third-party documents from the internet.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
98% confidence
Finding

At the transmission point, the code directly sends extracted PDF text and metadata to the LLM API with no user-facing warning or confirmation. This is dangerous because users may reasonably expect local document processing, while the implementation actually exports document content to an external service.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The save command uploads metadata to Zotero as a remote side effect without a clear user-facing notice at the point of execution. Remote write operations can modify a user's external account and should not occur implicitly in a utility skill.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
98% confidence
Finding

Natural-language instructions in the analysis prompt require the model to respond in Chinese and explicitly ask for structured analysis in Chinese. This imposes a specific language choice without offering the user a locale option or explaining why Chinese is required.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.