Back to skill

Security audit

Volcano Plot Script

Security checks for vulnerabilities and agentic risk

Overview

The skill is a coherent volcano-plot tool, but its optional R export can place user-controlled text directly into executable R code, so it needs review before use.

Use this only in a controlled workspace with trusted inputs. Avoid `--export-r` when any argument or output path may come from an untrusted source, and review any generated `.R` file before running it. Prefer pinned dependencies or an isolated environment for installation.

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)

T09 · Insecure Skill Coding Practices

Error
Location
scripts/main.py:248
Finding

R Code Injection Through Unescaped CLI Arguments

Content
View full analysis
% mutate(regulation = case_when( .data[[pvalue_col]] < pvalue_thresh & .data[[log2fc_col]] > log2fc_thresh ~ "up", .data[[pvalue_col]] < pvalue_thresh & .data[[log2fc_col]] < -log2fc_thresh ~ "down", TRUE ~ "ns" )) # Create plot p <- ggplot(data, aes(x=.data[[log2fc_col]], y=negLog10_pvalue, color=regulation)) + geom_point(alpha=0.6, size=1.5) + scale_color_manual(values=c("up"="{args.color_up}", "down"="{args.color_down}", "ns"="{args.color_ns}"), labels=c("up"="Upregulated", "down"="Downregulated", "ns"="Not significant")) + geom_hline(yintercept=-log10(pvalue_thresh), linetype="dashed", color="gray") + geom_vline(xintercept=c(-log2fc_thresh, log2fc_thresh), linetype="dashed", color="gray") + labs(x="{args.xlabel}", y="{args.ylabel}", title="{args.title}") + theme_minimal() + theme(legend.position="bottom") # Save plot ggsave("{output_path}", p, width=10, height=8, dpi={args.dpi}) print(paste("Plot saved to:", "{output_path}")) ''' ``` ### Technical Analysis The optional R exporter constructs executable R source code through direct Python f-string interpolation. Several attacker-controllable command-line values are placed inside quoted R string literals without escaping or val ...[truncated 2121 chars]
Remediation
View remediation

T08 · Insecure Dependencies

Warning
Location
requirements.txt:1
Finding

Unpinned Python and R Dependencies Create Supply-Chain Exposure

Content
View full analysis
Remediation
View remediation
Vulnerability Patterns
  • 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
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
Findings (9)

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 51)May include surrounding context.

md
python scripts/main.py --input deg_results.csv --output volcano_plot.png

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
87% confidence
Finding

The skill describes capabilities that read input files and write output plots, but it does not declare any explicit tool scope such as permissions or allowed-tools. This creates ambiguous execution boundaries and increases the chance that an agent runtime grants broader file access than intended, especially if future script-generation behavior expands beyond simple plotting.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The trigger/description is broad enough to match general visualization requests, which can cause the skill to activate outside its intended DEG/volcano-plot niche. Misrouting to a script-generating skill with file I/O increases the chance of unnecessary code generation or file handling in contexts where a safer, narrower skill should have been selected.

Content

No source excerpt is available for this finding.

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
96% confidence
Finding

The dependency list leaves pandas unpinned, so builds may resolve to different versions over time, including vulnerable or breaking releases. This creates supply-chain risk and reduces reproducibility, even though the file itself does not prove a currently exploitable version is installed.

Content

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

text
pandas
matplotlib
seaborn
numpy

Unverifiable Dependency: pandas has 1 known advisory(ies) (CVE-2020-13091 (** DISPUTED ** pandas through 1.0.3 can unserialize and execute commands from an)), but the manifest does not pin a version, so it is unknown whether the installed release is affected

Low
Category
Supply Chain
Confidence
89% confidence
Finding

pandas has at least one known advisory, and because no version is pinned, it is impossible to verify whether deployment will install an affected release. In this context, the risk is somewhat limited because the file is only a dependency manifest for a data-visualization skill, but unresolved version ambiguity still leaves exposure open.

Content

No source excerpt is available for this finding.

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
96% confidence
Finding

matplotlib is specified without a version, allowing unintended upgrades or dependency resolution drift. Unpinned packages increase the chance of pulling a compromised, incompatible, or newly vulnerable release during installation.

Content

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

text
pandas
matplotlib
seaborn
numpy

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
96% confidence
Finding

seaborn is unpinned, which makes the environment non-reproducible and exposes the project to supply-chain and regression risk when dependencies change. While not an immediate exploit by itself, this is a real weakness in dependency hygiene.

Content

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

text
pandas
matplotlib
seaborn
numpy

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
97% confidence
Finding

numpy is unpinned, so installations may resolve to unknown versions, including releases with security issues or behavior changes. For a scientific plotting skill, this is mainly a supply-chain and reproducibility concern rather than a direct code-execution flaw in this file.

Content

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

text
pandas
matplotlib
seaborn
numpy

Unverifiable Dependency: numpy has 16 known advisory(ies) (CVE-2014-1859 (Numpy arbitrary file write via symlink attack); CVE-2021-41495 (NumPy NULL Pointer Dereference); CVE-2021-33430 (NumPy Buffer Overflow (Disputed)) +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
91% confidence
Finding

numpy has multiple known advisories, and the absence of a pinned version means the installed package may or may not be vulnerable. Although the skill purpose is benign bioinformatics plotting, scientific workflows often process external data, so using an unverifiable dependency unnecessarily increases attack surface.

Content

No source excerpt is available for this finding.