T03 · Remote Payload Retrieval and Execution
- Location
README.md:60- 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 mostly builds local SVG diagrams, but its install path and SVG output handling create risks users should review before installing.
Review this skill before installing. Prefer the built-in venv setup over the curl-to-shell uv installer, pin the skill and dependencies to reviewed versions, and avoid embedding generated SVGs from untrusted prompts or data into websites until SVG text and attributes are properly escaped. Do not rely on the advertised AI-model support unless the implementation is updated to actually use and disclose provider calls.
README.md:60Remote Installer Is Downloaded and Executed Without Verification
graphical_abstract_generator.py:78Unescaped User-Controlled Content Is Embedded in Generated SVG Files
README.md:29Dependency Installation Is Not Reproducibly Pinned
The | sh pattern is a classic command-chaining hazard because it causes uninspected remote content to execute directly in a shell. In the context of a skill README meant for easy installation, this increases the likelihood that users will copy-paste it blindly, making compromise more dangerous and more realistic.
# Install uv (if not already installed)
curl -LsSf https://astral.sh/uv/install.sh | sh
# Create virtual environment and install dependencies
cd ~/.claude/skills/scientific-graphical-abstract-skill
Skill selects an external model or provider that may use a different account or billing plan than the operator expects. Undisclosed model switches can cause unexpected cost or quota consumption.
%(prog)s generate --data results.csv --type line --output line.svg
# Use specific model
%(prog)s generate --prompt "Create a mechanism diagram" --model claude --output diagram.svg
"""
)
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.
## Overview
**Scientific Graphical Abstract Generator** is a Claude Code Skill designed to help researchers create professional, publication-quality graphical abstracts for scientific papers. It generates editable SVG visualizations that can be customized for journal requirements.
### Key Features
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/scientific-graphical-abstract-skill
uv venv
source .venv/bin/activate # Linux/macOS
The README encourages use of Anthropic, OpenAI, and DeepSeek API keys and hosted models, but does not warn users that prompts, research text, images, or dataset contents may be transmitted to third-party services. In a scientific research context, this can expose unpublished results, sensitive datasets, or confidential manuscript content to external providers without informed consent.
The module docstring says it generates graphical abstracts using multiple AI models, and the CLI examples/options reinforce that claim, but the implementation only parses prompts locally and builds SVGs with hardcoded templates and simple regex extraction. This is an active contradiction about the skill's core behavior, not just missing detail.
The examples present line-chart generation from CSV and choosing a specific AI model as real supported behaviors. In practice, no model is ever called anywhere in the code, and CSV rows are loaded as generic header-keyed dictionaries while chart generation expects 'label' and 'value' keys, so the documented behavior is inconsistent with what the program actually does.
The program writes directly to a user-specified output path without checking whether the file already exists or warning before overwrite. In a CLI skill context, this can cause destructive modification of arbitrary files accessible to the running user, especially if an agent or wrapper passes attacker-influenced paths or runs in an automated workflow.
The README recommends curl -LsSf https://astral.sh/uv/install.sh | sh, which fetches a remote script and executes it immediately without integrity verification. If the remote host, network path, or delivered script is compromised, users could run arbitrary code 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/scientific-graphical-abstract-skill
This requirements file contains natural-language comments entirely in Chinese, such as the dependency descriptions and optional-install notes. For a general-purpose skill artifact, this imposes a specific language without any stated opt-in, alternative locale, or justification that the skill is region-specific.
Using a lower-bound specifier for matplotlib allows future, unreviewed versions to be installed, which weakens supply-chain reproducibility and can unintentionally pull in vulnerable or incompatible releases. In isolation this is a low-severity dependency hygiene issue rather than evidence of a malicious package.
# Scientific Graphical Abstract Generator 依赖列表
# 图形生成库
matplotlib>=3.7.0
plotly>=5.14.0
# 数据处理
The unpinned plotly dependency permits installation of arbitrary newer releases, reducing reproducibility and making it harder to verify whether deployed versions are secure. This creates a modest supply-chain risk if a bad or breaking upstream release is later consumed automatically.
# 图形生成库
matplotlib>=3.7.0
plotly>=5.14.0
# 数据处理
pandas>=2.0.0
An unpinned pandas dependency means the environment may resolve to different versions over time, complicating assurance that installed builds are free of known issues. Because pandas has historical advisories, leaving it open-ended increases uncertainty and supply-chain exposure.
plotly>=5.14.0
# 数据处理
pandas>=2.0.0
numpy>=1.24.0
# AI模型集成 (可选,根据需要安装)
Because pandas is not pinned, it is impossible to verify from this manifest whether a deployed environment will avoid versions associated with known advisories. The cited issue is disputed and context-dependent, so the direct risk here is uncertainty rather than confirmed exposure.
Specifying numpy with only a minimum version allows later unresolved versions to be installed, which can include vulnerable or unstable releases. Given numpy's broad use and advisory history, this is a real but low-severity dependency management weakness.
# 数据处理
pandas>=2.0.0
numpy>=1.24.0
# AI模型集成 (可选,根据需要安装)
# anthropic>=0.18.0 # Claude API
Numpy has multiple historical advisories, and the absence of a pinned version prevents determining whether installations are affected. In a package that may process untrusted scientific data or files, unresolved numpy version selection can increase the chance of denial-of-service or memory-safety exposure through vulnerable builds.
The svgwrite dependency is not fixed to a specific version, so future installs may consume unreviewed upstream changes. This is a standard supply-chain hygiene issue and is more relevant if the project processes externally supplied SVG content.
# deepseek # DeepSeek API (如果可用)
# SVG处理 (可选)
svgwrite>=1.4.0
cairosvg>=2.5.0 # 用于SVG转PNG
# 图像处理 (可选)
CairoSVG has known issues involving resource exhaustion and unsafe handling of external SVG resources, and the manifest does not constrain the installed version. In this skill's context—graphical abstract and SVG/PNG generation—this is more relevant because the component is directly tied to parsing/rendering potentially complex SVG content.
Pillow is installed with only a minimum version, allowing different environments to resolve to different future releases. Since image libraries often handle attacker-controlled files and Pillow has prior security advisories, leaving it unpinned creates avoidable risk.
cairosvg>=2.5.0 # 用于SVG转PNG
# 图像处理 (可选)
pillow>=10.0.0
Pillow has a long history of vulnerabilities in image parsing, and the unpinned requirement makes it impossible to confirm whether safe versions will be used. This is more significant in a graphics-oriented skill because image libraries may process attacker-influenced files, increasing the practical attack surface for denial-of-service or code-execution-class flaws if an affected release is installed.
No suspicious patterns detected.