Back to skill

Security audit

arxiv-papers-search-scraper-api-skill

Security checks for vulnerabilities and agentic risk

Overview

This skill is not malicious, but it sends user inputs through a third-party BrowserAct account and is scoped more broadly than its arXiv paper-search purpose supports.

Review before installing. Use it only for arXiv searches, keep BROWSERACT_API_KEY in an environment or secret store rather than pasting it into chat, and avoid submitting sensitive or proprietary search terms because parameters are sent to BrowserAct. Do not use this package for generic scraping, lead generation, pricing, reviews, or arbitrary target URLs unless the publisher narrows and validates that behavior.

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
scripts/arxiv_papers_search_scraper_api.py:21
Finding
Unrestricted Remote Browser Target Exceeds the Declared arXiv Scope<![CDATA[ ## Vulnerability Details **File Location**: `scripts/arxiv_papers_search_scraper_api.py:21-30, 113` **Vulnerability Type**: Unvalidated remote browsing destination **Risk Level**: Medium ### Vulnerable Code ```python def run_arxiv_papers_search_scraper_task(api_key, base_url='https://arxiv.org', keyword='large language model', search_type='all', count='20'): """ Starts a BrowserAct template task and polls for completion. Returns structured data as a string, or None on failure. """ headers = {"Authorization": f"Bearer {api_key}"} payload = { "input": { "base_url": base_url, "keyword": keyword, "search_type": search_type, "count": count, } } ``` The value is taken directly from a command-line argument: ```python base_url = sys.argv[1] if len(sys.argv) > 1 else 'https://arxiv.org' ``` ### Technical Analysis The Skill is expressly presented as an arXiv search integration, but it accepts an arbitrary `base_url` and forwards that value to a remote BrowserAct workflow without validating its scheme, hostname, port, credentials, or destination. Allowing arbitrary destinations is not necessary for the declared arXiv-only functionality. It expands the capability from searching a defined public source to directing a remote browser workflow toward attacker-selected resources. No checks ensure that the URL is exactly `https://arxiv.org` or another explicitly approved arXiv hostname. The actual network request from the local script remains directed to the fixed BrowserAct API endpoint. Therefore, this is not direct local SSRF. The risk arises because BrowserAct receives the untrusted URL and may cause its browser infrastructure to visit it. Whether private or internal destinations can be reached depends on BrowserAct's own network isolation and URL-validation controls. The other remotely supplied parameters are also not validated. In particular, `search_type` is not ...[truncated 1743 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Remove `base_url` from user-controlled input if the Skill is intended exclusively for arXiv. 2. Hardcode the target as `https://arxiv.org`, or enforce an exact allowlist of approved HTTPS arXiv hostnames. 3. Parse URLs with a standards-compliant URL parser and reject: - Non-HTTPS schemes. - Embedded usernames or passwords. - Alternate or unexpected ports. - IP literals and localhost destinations. - Hostnames outside the explicit allowlist. 4. Ensure the remote workflow does not follow redirects to non-allowlisted hosts. This protection should also be enforced by BrowserAct, because local validation cannot control remote redirect behavior. 5. Validate `search_type` against the documented values: `all`, `title`, `author`, `abstract`, `comments`, `journal_ref`, `paper_id`, `doi`, and `full_text`. 6. Parse `count` as an integer and apply a reasonable positive upper bound before submitting a paid remote task. 7. Reject invalid input before making any authenticated BrowserAct API request. ]]>

T09 · Insecure Skill Coding Practices

Note
Location
scripts/arxiv_papers_search_scraper_api.py:101
Finding
Instructions Encourage Disclosure of a Reusable API Key to the Agent<![CDATA[ ## Vulnerability Details **File Location**: `SKILL.md:31-35`; `scripts/arxiv_papers_search_scraper_api.py:101-109` **Vulnerability Type**: Unsafe credential-handling guidance **Risk Level**: Low ### Vulnerable Code and Instructions The script advises the user to provide the API key to the Agent: ```python api_key = os.getenv("BROWSERACT_API_KEY") if not api_key: print("\n[!] ERROR: BrowserAct API Key is missing.", flush=True) print("Please follow these steps:", flush=True) print(f"1. Go to: {API_KEY_URL}", flush=True) print("2. Copy your API Key.", flush=True) print("3. Provide it to me or set it as an environment variable (BROWSERACT_API_KEY).", flush=True) sys.exit(1) ``` The Skill instructions similarly direct the Agent to ask and wait for the user to provide a key when the environment variable is absent: ```markdown Before running, check the `BROWSERACT_API_KEY` environment variable. If not set, do not take other measures; ask and wait for the user to provide it. ``` ### Technical Analysis A BrowserAct API key is a reusable authentication credential that authorizes remote tasks and may consume paid account resources. Asking the user to “provide it to me” encourages the key to be pasted into an Agent conversation instead of being configured through a protected local environment or secret-management mechanism. Credentials entered into a conversation may be retained in chat history, Agent context, telemetry, debugging output, or service logs. This creates unnecessary exposure because the script already supports reading the key from `BROWSERACT_API_KEY`; direct disclosure to the Agent is not required for the Skill's functionality. The script itself does not print the key and sends the Authorization header only to the fixed HTTPS BrowserAct API endpoint. The vulnerability is therefore in the credential-provisioning guidance rather than direct credential exfiltration by the implementation. ### Attack Path 1. The user r ...[truncated 1163 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Remove all instructions asking users to provide or paste the API key into the Agent conversation. 2. Change the message to require local configuration through `BROWSERACT_API_KEY`, a platform secret store, or another protected credential-injection mechanism. 3. Clearly state that API keys must not be sent through chat messages, command-line arguments, source files, or ordinary logs. 4. Where supported, integrate with the hosting platform's scoped secret-management facility so the Agent can invoke the script without reading or displaying the raw credential. 5. Minimize the API key's permissions and apply task, quota, and billing limits through BrowserAct. 6. Rotate any key that has previously been pasted into a conversation or recorded in logs. 7. Preserve the existing behavior of never printing the credential and continue sending it only to the fixed BrowserAct HTTPS API endpoint. ]]>
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • 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
Findings (4)

Lp3

Medium
Category
MCP Least Privilege
Confidence
91% confidence
Finding
The skill declares only runtime requirements in metadata but does not clearly declare or constrain its effective capabilities while instructing the agent to use environment secrets and make outbound API calls. That mismatch can reduce reviewability and informed consent, increasing the chance that the skill is invoked without users understanding it will access a secret and transmit request data to BrowserAct.

Description-Behavior Mismatch

Medium
Confidence
84% confidence
Finding
The skill is presented as an arXiv-specific paper-search tool, but its use cases expand to unrelated domains like products, listings, reviews, pricing, and lead generation. This scope drift can cause overbroad invocation and misuse of an external scraping workflow for tasks users did not explicitly authorize, increasing privacy, compliance, and data-handling risk.

Vague Triggers

Medium
Confidence
88% confidence
Finding
The invocation description is broad enough to match many unrelated scraping, enrichment, research, and lead-generation requests. Overbroad routing increases the likelihood that the agent sends user queries or target data to an external service in contexts where this skill is not appropriate, creating unnecessary data exposure and unauthorized automation risk.

Missing User Warnings

Medium
Confidence
93% confidence
Finding
The skill does not clearly warn that user-provided queries and request parameters will be transmitted to the external BrowserAct API. Without explicit disclosure, users may unknowingly send sensitive research topics, proprietary terms, or other data to a third party, creating consent, confidentiality, and compliance concerns.

Static analysis

No suspicious patterns detected.