T03 · Remote Payload Retrieval and Execution
- Location
README.md:58- Finding
Unverified Remote Installer Executed Directly by Shell
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The skill appears to perform Semantic Scholar searches as advertised, but its recommended installation path runs mutable remote code and unpinned packages, so it should be reviewed before installation.
Before installing, prefer the documented Python venv path over the curl-to-sh uv installer, avoid running setup with elevated privileges, pin the installer/repository/dependencies to reviewed versions where possible, and expect the tool to contact Semantic Scholar and optionally write JSON files to paths you provide.
README.md:58Unverified Remote Installer Executed Directly by Shell
README.md:27Installation Uses Mutable npx Package and Unpinned Git Repository
requirements.txt:1Python Dependencies Use Open-Ended Version Constraints
Piping downloaded content directly into sh removes any opportunity for inspection and creates an immediate arbitrary code execution path. In the context of a developer skill README, this is more dangerous because users are encouraged to run setup commands locally, so compromise of the upstream script would directly impact the host system.
# Install uv (if not already installed)
curl -LsSf https://astral.sh/uv/install.sh | sh
# Create virtual environment and install dependencies
cd ~/.claude/skills/semanticscholar-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/semanticscholar-search-skill
uv venv
source .venv/bin/activate # Linux/macOS
The sample output labels such as 标题, 作者, and 年份 indicate the skill may present results in Chinese, but the README does not tell users this or provide any language/locale opt-in. SQP-3 applies because this is a natural-language locale constraint that appears to be imposed without user choice or justification.
The example output labels are entirely in Chinese, while the rest of the skill documentation is in English. This creates a natural-language locale constraint in the skill description without any user opt-in or explanation that the skill is intended to operate in Chinese.
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 installer script with curl ... | sh, which delegates trust to external network content at runtime. If the remote server, transport, or hosted script is compromised, users can execute arbitrary shell commands on their machine 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/semanticscholar-search-skill
The markdown documents --output results.json usage, which causes local file creation or overwrite, but it does not include any warning that the command writes to disk. Because SQP-2 applies to markdown files when behaviors affecting user data or system integrity are undocumented, this omission is a valid missing-warning issue.
This requirements file contains natural-language comments exclusively in Chinese, which imposes a specific language choice without indicating user preference, opt-in, or a documented region-specific reason. The policy requires avoiding forced language or locale constraints unless they are optional or clearly justified.
Using a lower-bounded but unpinned dependency such as semanticscholar>=0.4.0 allows future installs to resolve to unexpected versions, which can introduce vulnerable or breaking releases without review. This weakens supply-chain control and makes builds non-reproducible, increasing the chance that a compromised or insecure dependency version is deployed.
# Semantic Scholar Search 依赖列表
# 核心 Semantic Scholar 库
semanticscholar>=0.4.0
# HTTP 请求
requests>=2.31.0
Using requests>=2.31.0 without an exact pin permits installation of any later version, including releases that may introduce security regressions or incompatible changes. In a supply-chain context, this reduces reproducibility and makes it harder to verify whether deployed environments are using a known-safe version.
semanticscholar>=0.4.0
# HTTP 请求
requests>=2.31.0
The manifest references requests without pinning an exact version, while the package has multiple known advisories across versions. Because the resolved version is not fixed, it is impossible to verify from this file alone whether installations will avoid affected releases, creating uncertainty around exposure to known dependency vulnerabilities.
The CLI prints core user-facing labels such as paper title, authors, year, citations, and save confirmations in Chinese, while the rest of the tool description and command interface are in English. This imposes a specific language on users without opt-in or documented locale justification, which matches the language/locale policy violation criteria.
No suspicious patterns detected.