Back to skill

Security audit

Scholar search

Security checks for vulnerabilities and agentic risk

Overview

This is a straightforward academic-paper search skill, with normal cautions around sending searches to third-party APIs and installing unpinned Python packages.

Use this for non-sensitive literature searches. Install dependencies in a virtual environment, remember that search terms go to Semantic Scholar and arXiv and DOI lookups go to doi.org, and avoid exposing a Semantic Scholar API key in shared environments. For production or managed use, pin or lock the Python dependencies and fix the request timeout handling.

Vulnerability Patterns
  • Insecure DependenciesIntroduces malicious components through unsafe dependency sources
  • 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
Findings (2)

T08 · Insecure Dependencies

Warning
Location
requirements.txt:1
Finding

Unpinned Runtime Dependencies Create Supply-Chain Exposure

Content
View full analysis
=2.31 beautifulsoup4>=4.12 ``` The documented installation workflow executes: ```bash python3 -m pip install -r {baseDir}/requirements.txt ``` ### Technical Analysis The dependency declarations specify only minimum versions. They do not impose upper bounds, pin exact versions, verify package hashes, or use a reviewed lockfile. Consequently, each installation can resolve different future releases and transitive dependencies from the configured Python package index. The package names appear legitimate, and no dependency confusion or typosquatting was identified in the reviewed files. Nevertheless, the unconstrained resolution process delegates trust to all future compatible package releases and their transitive dependency trees. This exceeds the minimum supply-chain exposure necessary for a small, stable helper script. Python packages can execute code during installation and subsequently when imported. A compromised future release, compromised package-index account, malicious package-index mirror, or unexpected transitive dependency could therefore execute code with the privileges of the user running the installation or Skill. ### Attack Path 1. The Skill is invoked on a system where its dependencies are not installed. 2. The documented workflow runs `python3 -m pip install -r requirements.txt`. 3. The configured package index resolves the newest releases satisfying `requests>=2.31` and `beautifulsoup4>=4.12`, including their transitive dependencies. 4. A compromised or malicious compatible package release is downloaded because no exact version or hash is enforced. 5. Malicious package code runs during installation or when `search_papers.py` imports the package. 6. The code operates with the same filesystem, network, environment-variable, and proc ...[truncated 519 chars]
Remediation
View remediation
beautifulsoup4== ``` 2. Generate and commit a lockfile that includes all transitive dependencies. 3. Require cryptographic hashes during installation, such as through a hash-locked requirements file and `pip install --require-hashes`. 4. Use an explicitly trusted package index or an internally controlled package mirror. 5. Periodically update pinned versions through a controlled review and vulnerability-scanning process. 6. Install dependencies inside an unprivileged virtual environment rather than into a system-wide Python environment. ]]>

T09 · Insecure Skill Coding Practices

Note
Location
scripts/search_papers.py:82
Finding

Configured HTTP Timeout Is Not Applied to Network Requests

Content
View full analysis
Crossref/DataCite).""" resp = session.get(f"{DOI_URL}/{doi}", headers={"Accept": "application/x-bibtex"}) if not resp.ok: return None text = resp.text.strip() return text if text.startswith("@") else None ``` The arXiv request has the same flaw: ```python def arxiv_query(session, params): resp = session.get(ARXIV_API, params=params) resp.raise_for_status() soup = BeautifulSoup(resp.text, "html.parser") return [parse_arxiv_entry(e) for e in soup.find_all("entry")] ``` ### Technical Analysis Assigning `session.timeout = timeout` does not configure a default timeout in the `requests` library. `requests.Session.request()` does ...[truncated 1960 chars]
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
Findings (6)

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
92% confidence
Finding

The skill instructs the agent to install dependencies, make outbound network requests, read environment variables for an API key, and write files, but it does not declare any explicit tool scope or permissions boundary. That mismatch can cause the runtime or reviewer to underestimate the skill's capabilities, increasing the risk of unintended network access, package-install side effects, and file writes when the skill is invoked.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The skill enables implicit invocation without any visible trigger constraints, which can cause the agent to call this tool unexpectedly based on loose relevance matching rather than explicit user intent. Even though the tool is read-oriented, it can still expose user queries to third-party services, influence agent behavior, and perform unwanted external lookups or citation exports without clear consent.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% 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 · scripts/search_papers.py (reported line 67)May include surrounding context.

python
warnings.filterwarnings("ignore", category=XMLParsedAsHTMLWarning)

GRAPH_API = "https://api.semanticscholar.org/graph/v1/paper/search"
DOI_URL = "https://doi.org"
ARXIV_API = "https://export.arxiv.org/api/query"
USER_AGENT = "search-papers-skill/1.0"

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
93% confidence
Finding

The dependency is specified with a lower bound only (requests>=2.31), which makes builds non-reproducible and allows future installs to pull in unexpected versions. This increases supply-chain risk and makes it hard to verify whether a deployed version includes known security fixes or newly introduced vulnerabilities.

Content

Scanner excerpt · requirements.txt (reported line 1)May include surrounding context.

text
requests>=2.31
beautifulsoup4>=4.12

Unverifiable Dependency: requests has 16 known advisory(ies) (CVE-2014-1830 (Exposure of Sensitive Information to an Unauthorized Actor in Requests); CVE-2024-47081 (Requests vulnerable to .netrc credentials leak via malicious URLs); CVE-2024-35195 (Requests `Session` object does not verify requests after making first request wi) +13 more), but the manifest does not pin a version, so it is unknown whether the installed release is affected

Low
Category
Supply Chain
Confidence
88% confidence
Finding

Because requests is not pinned, it is impossible to determine from this manifest whether the installed version is affected by one of the known advisories. In a network-facing skill that queries external services like Semantic Scholar and arXiv, uncertainty around the HTTP client version is more significant because any vulnerable release could directly affect outbound request handling, redirects, authentication material, or TLS behavior.

Content

No source excerpt is available for this finding.

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
90% confidence
Finding

beautifulsoup4>=4.12 is also unpinned, so installations may resolve to different versions over time. While not an immediate exploit by itself, this weakens build integrity and can expose the skill to accidental adoption of vulnerable or incompatible releases.

Content

Scanner excerpt · requirements.txt (reported line 2)May include surrounding context.

text
requests>=2.31
beautifulsoup4>=4.12

Static analysis

No suspicious patterns detected.