T03 · Remote Payload Retrieval and Execution
- Location
README.md:58- Finding
Remote Installer Is Downloaded and Executed Without Verification
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The skill’s search functionality is coherent, but its installation guidance includes high-impact mutable remote code execution and unpinned dependencies that users should review before installing.
Install only after reviewing the setup path. Prefer the built-in venv/pip flow in an isolated, non-root environment, pin or lock dependencies, and avoid the README’s pipe-to-shell uv installer unless you independently verify the installer. Also expect runtime web scraping of Google Scholar and optional JSON file creation when you provide an output path.
README.md:58Remote Installer Is Downloaded and Executed Without Verification
requirements.txt:1Dependencies and Remote Skill Source Are Not Reproducibly Pinned
The pipe-to-shell pattern is inherently dangerous because it chains network retrieval directly into command execution without inspection or integrity verification. In a skill README, this is especially risky because users may copy-paste setup commands verbatim, enabling straightforward remote code execution if the fetched content is malicious or altered.
# Install uv (if not already installed)
curl -LsSf https://astral.sh/uv/install.sh | sh
# Create virtual environment and install dependencies
cd ~/.claude/skills/google-scholar-search-skill
npx commands without a version suffix (e.g. @1.0.0) create a rug-pull risk if the upstream server is compromised and publishes a malicious update.
Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.
# Install uv (if not already installed)
curl -LsSf https://astral.sh/uv/install.sh | sh
# Create virtual environment and install dependencies
cd ~/.claude/skills/google-scholar-search-skill
uv venv
source .venv/bin/activate # Linux/macOS
The documentation is primarily in English, but the console and author output examples switch to Chinese labels such as '结果', '标题', and '姓名'. This suggests the skill may force or assume a specific output language without explicit user opt-in, which is a natural-language locale policy concern.
This code prints paper and author results using Chinese-only labels such as '结果', '标题', '作者', and '摘要'. The skill does not offer a language selection option or document that it is intentionally limited to Chinese users, which violates the language/locale policy criteria.
Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.
@staticmethod
def write_file(data: Any, filepath: str) -> None:
"""Write data to a file in JSON format.
Args:
data: Data to write
The README instructs users to fetch and execute a remote install script directly with curl ... | sh, which grants immediate shell execution to content retrieved over the network. If the upstream host, transport path, or script is compromised, users could execute arbitrary code during installation.
# Install uv (if not already installed)
curl -LsSf https://astral.sh/uv/install.sh | sh
# Create virtual environment and install dependencies
cd ~/.claude/skills/google-scholar-search-skill
This markdown file describes file-output behavior via JSON export and later exposes --output options, but it does not include any user-facing warning that the skill may write data to disk. For markdown files, SQP-2 applies when potentially data-affecting behavior is described without warning about effects on user data or system state.
The output format section presents console and author output labels entirely in Chinese, while the rest of the skill documentation is in English and does not mention any locale setting or user choice. This suggests a fixed locale/output language without explicit opt-in or justification.
The module-level documentation frames the script as searching Google Scholar, while get_author_info specifically states it uses the scholarly library and imports it dynamically. This is a mild intent/documentation divergence within the code because the implementation path differs from the surrounding direct Google Scholar request/parsing approach.
This file contains natural-language comments exclusively in Chinese, such as the dependency descriptions on L01, L03, L06, and L09. Because the policy requires avoiding forced language choices unless documented or justified, this can be considered a locale/language constraint without opt-in.
Using requests>=2.31.0 leaves dependency resolution open to any later version, which reduces build reproducibility and makes it harder to verify whether deployed environments include vulnerable or breaking releases. In a security-sensitive agent skill, unpinned dependencies increase supply-chain risk because different installations may pull different code over time.
# Google Scholar Search 依赖列表
# HTTP 请求
requests>=2.31.0
# HTML 解析
beautifulsoup4>=4.12.0
The manifest references requests without pinning an exact version, while known advisories exist for some releases of that package. Because the selected installed version is not fixed, it is impossible to confirm from this file alone whether deployments will avoid affected versions, creating uncertainty that can mask known vulnerable installations.
Using beautifulsoup4>=4.12.0 permits uncontrolled upgrades, which can introduce unreviewed code changes or transitive dependency issues into the environment. This is a supply-chain hygiene problem rather than an immediately exploitable flaw, but it can become dangerous if a compromised or incompatible release is resolved at install time.
requests>=2.31.0
# HTML 解析
beautifulsoup4>=4.12.0
# Google Scholar 作者信息库
scholarly>=1.0.0
Using scholarly>=1.0.0 is particularly risky because it is a higher-level third-party library that may have multiple transitive dependencies and behavior changes across releases. Leaving it unpinned makes builds non-reproducible and increases exposure to supply-chain compromise or newly introduced insecure behavior in future versions.
beautifulsoup4>=4.12.0
# Google Scholar 作者信息库
scholarly>=1.0.0
No suspicious patterns detected.