Back to skill

Security audit

auto-plantuml-edit

Security checks for vulnerabilities and agentic risk

Overview

This skill is a mostly coherent UML export tool, but it tells the agent to automatically download and execute an external PlantUML JAR without integrity checks or clear user confirmation.

Review before installing. Use this only in a sandbox or low-privilege environment, require explicit approval before downloading plantuml.jar, verify the JAR with a trusted checksum or signature, pin Python dependencies, and avoid processing untrusted .puml or SVG content without isolation. No credential theft, exfiltration, destructive action, or hidden persistence was found in the inspected artifacts.

Vulnerability Patterns
  • Insecure DependenciesIntroduces malicious components through unsafe dependency sources
  • 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
  • Embedded Malicious CodeShips malicious scripts inside the skill and executes them locally
Findings (1)

T08 · Insecure Dependencies

Warning
Location
SKILL.md:247
Finding
Unverified Retrieval and Execution of Third-Party Dependencies## Vulnerability Details **File Location**: `SKILL.md:247-282`, `SKILL-cn.md:247-282`, and `requirements.txt:1-2` **Vulnerability Type**: Supply-chain integrity failure **Risk Level**: Medium The installation instructions retrieve executable dependencies without cryptographic integrity verification. Python dependencies are also specified using open-ended minimum versions rather than exact, hash-locked versions. ```bash pip install -r requirements.txt ``` ```text pillow>=12.0.0 python-pptx>=1.0.0 ``` ```bash # Navigate to AutoPlantUMLEdit skill directory first curl -L -o "scripts/plantuml.jar" "https://github.com/plantuml/plantuml/releases/download/v1.2026.2/plantuml-1.2026.2.jar" ``` ```powershell # Navigate to AutoPlantUMLEdit skill directory first Invoke-WebRequest -Uri "https://github.com/plantuml/plantuml/releases/download/v1.2026.2/plantuml-1.2026.2.jar" -OutFile "scripts/plantuml.jar" ``` ```bash java -jar scripts/plantuml.jar -version ``` ### Technical Analysis `plantuml.jar` contains executable Java bytecode. The documented workflow downloads this artifact and executes it without first comparing it against a trusted SHA-256 digest or validating a cryptographic signature. HTTPS protects the network connection but does not establish that the upstream account, release artifact, or hosting infrastructure has not been compromised. The Python requirements use `>=` constraints. Consequently, installations performed at different times can resolve to different package versions that were not present during this audit. There is no lock file or package hash enforcement to guarantee artifact identity. This weakens build reproducibility and permits an unexpectedly compromised future release to enter the execution environment. ### Attack Path 1. An attacker compromises an upstream release, package publishing account, distribution channel, or artifact referenced by the installation instructions. 2. The a ...[truncated 1308 chars]
Remediation
## Remediation Suggestions 1. Pin every Python dependency to an exact reviewed version instead of using minimum-version constraints. 2. Generate a hash-locked requirements file and require hash verification during installation, for example with `pip install --require-hashes -r requirements.txt`. 3. Publish the expected SHA-256 digest of `plantuml.jar` in a trusted, version-controlled project file. 4. Verify the JAR checksum before every execution and terminate with an error if verification fails. 5. Where available, validate an upstream cryptographic signature in addition to the checksum. 6. Prefer packaging a reviewed PlantUML artifact with the release or retrieving it through a trusted package manager that supports signature and integrity verification. 7. Perform dependency installation and diagram conversion as a non-privileged user in a sandbox or container with only the necessary filesystem and network access. 8. Add automated dependency scanning and scheduled review of pinned versions, updating hashes only after the new artifacts have been reviewed.
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Rogue AgentSelf-Modification, Session Persistence
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
Findings (17)

Tp4

High
Category
MCP Tool Poisoning
Confidence
91% confidence
Finding
The declared description overstates and mischaracterizes the implementation. The code has no natural-language parsing or UML generation from free text; it only processes an existing .puml file. While it does export SVG/EMF/PPTX-related outputs, the PPT behavior is to place an EMF image into a slide, not to create native individually editable PowerPoint shapes. The EMF conversion also uses Inkscape's --export-text-to-path option, which converts text into vector outlines, further contradicting the claim of editability. There are no suspicious undeclared exfiltration or unrelated behaviors, but the core described functionality does not accurately match the actual code behavior.

Self-Modification

High
Category
Rogue Agent
Content
**Download command:**

```bash
# Navigate to AutoPlantUMLEdit skill directory first
curl -L -o "scripts/plantuml.jar" "https://github.com/plantuml/plantuml/releases/download/v1.2026.2/plantuml-1.2026.2.jar"
```
Confidence
85% confidence
Finding
Skill modifies its own code, configuration, or behavior at runtime. Self-modification enables an agent to escalate privileges, disable safety constraints, or install persistent backdoors.

Self-Modification

High
Category
Rogue Agent
Content
**Download command:**

```bash
# Navigate to AutoPlantUMLEdit skill directory first
curl -L -o "scripts/plantuml.jar" "https://github.com/plantuml/plantuml/releases/download/v1.2026.2/plantuml-1.2026.2.jar"
```
Confidence
85% confidence
Finding
Skill modifies its own code, configuration, or behavior at runtime. Self-modification enables an agent to escalate privileges, disable safety constraints, or install persistent backdoors.

Self-Modification

High
Category
Rogue Agent
Content
**Download command:**

```bash
# Navigate to AutoPlantUMLEdit skill directory first
curl -L -o "scripts/plantuml.jar" "https://github.com/plantuml/plantuml/releases/download/v1.2026.2/plantuml-1.2026.2.jar"
```
Confidence
85% confidence
Finding
Skill modifies its own code, configuration, or behavior at runtime. Self-modification enables an agent to escalate privileges, disable safety constraints, or install persistent backdoors.

Self-Modification

High
Category
Rogue Agent
Content
**Download command:**

```bash
# Navigate to AutoPlantUMLEdit skill directory first
curl -L -o "scripts/plantuml.jar" "https://github.com/plantuml/plantuml/releases/download/v1.2026.2/plantuml-1.2026.2.jar"
```
Confidence
85% confidence
Finding
Skill modifies its own code, configuration, or behavior at runtime. Self-modification enables an agent to escalate privileges, disable safety constraints, or install persistent backdoors.

Vague Triggers

Medium
Confidence
91% confidence
Finding
该段使用“用户表达以下意图时激活”并列出如“帮我画一个...架构图”“我想看...的 UML 图”等自然语言示例,但没有给出排除条件、上下文限制或更严格的触发边界。这些表达在普通对话中也可能出现,容易让技能在非预期场景下被调用。

Missing User Warnings

Medium
Confidence
95% confidence
Finding
文档明确要求在缺少本地 JAR 时自动联网下载 `plantuml.jar`,但没有要求校验来源完整性、版本真实性或进行哈希/签名验证。随后该 JAR 会被 `java -jar` 执行,等同于引入并运行第三方代码;若下载源被劫持、链接被替换或供应链受污染,可能导致执行恶意代码。

Lp3

Medium
Category
MCP Least Privilege
Confidence
95% confidence
Finding
The skill requests or implies shell, file read/write, and environment access through its documented workflow, but it declares no explicit tool scope or permission boundaries. This makes it harder for a host agent to enforce least privilege and increases the chance the skill will execute filesystem or shell actions unexpectedly.

Vague Triggers

Medium
Confidence
90% confidence
Finding
The trigger conditions are broad and based on common natural-language requests, which can cause the skill to activate outside narrowly intended contexts. In an agent environment with shell and file capabilities, overbroad activation increases the risk of unintended command execution, file creation, or network/dependency actions without sufficiently clear user intent.

Missing User Warnings

Medium
Confidence
97% confidence
Finding
The documentation tells the AI to download an external JAR automatically but does not prominently warn the user that network activity and binary retrieval will occur. This undermines informed consent and can lead to silent network access and introduction of executable content into the environment.

Context-Inappropriate Capability

Medium
Confidence
96% confidence
Finding
The skill instructs the agent to automatically download an external JAR from GitHub, introducing network access and execution of third-party code into a workflow that otherwise appears to be local diagram generation. Downloading binary artifacts at runtime expands the attack surface and can expose users to supply-chain compromise, version drift, or unreviewed code execution.

subprocess module call

Medium
Category
Dangerous Code Execution
Content
"Java not found. Please install JDK 8 and set JAVA_HOME environment variable.\n"
            "Download: https://adoptium.net/zh-CN/temurin/releases?version=8"
        )
    result = subprocess.run(
        [java_path, "-jar", PLANTUML_JAR, "-charset", "UTF-8", "-tsvg", puml_file, "-o", os.path.dirname(puml_file) or "."],
        capture_output=True, text=True
    )
Confidence
89% confidence
Finding
This subprocess call invokes PlantUML on a user-supplied .puml file. PlantUML processing of untrusted diagrams is dangerous because the language supports external resource inclusion and network/file interactions in some configurations, which can lead to SSRF, local file disclosure, or processing of attacker-controlled content by the Java/PlantUML runtime. The use of a list argument avoids shell injection, but it does not mitigate the risk of passing untrusted input into a powerful external parser.

subprocess module call

Medium
Category
Dangerous Code Execution
Content
emf_out = f"{base}.emf"

    # Use text-to-path to convert text to vector paths, avoiding font dependency issues
    result = subprocess.run(
        [inkscape, svg_file,
         "--actions", "select-all;selection-ungroup;selection-ungroup;selection-ungroup",
         "--export-text-to-path",
Confidence
91% confidence
Finding
This subprocess call feeds an SVG derived from user-controlled PlantUML content into Inkscape for EMF export. Rendering untrusted SVG in a full-featured graphics engine is risky because SVG can reference external resources and may trigger parser/renderer vulnerabilities, file access, or network access depending on Inkscape configuration and version. Skill context increases risk because the whole feature is explicitly designed to transform attacker-provided diagram content through multiple complex native tools.

subprocess module call

Medium
Category
Dangerous Code Execution
Content
base = os.path.splitext(svg_file)[0]
    png_out = f"{base}.png"

    result = subprocess.run(
        [inkscape, svg_file,
         "--export-filename", png_out,
         "--export-type", "png"],
Confidence
88% confidence
Finding
This subprocess call similarly sends attacker-influenced SVG to Inkscape for PNG export. Although there is no shell injection here, the security issue is exposure of a native renderer to untrusted content, which can enable denial of service, external resource fetching, or exploitation of parser bugs. Because the tool's purpose is automated conversion of natural-language-generated UML, untrusted content is a core input path rather than an edge case.

Unpinned Dependencies

Low
Category
Supply Chain
Content
pillow>=12.0.0
python-pptx>=1.0.0
Confidence
93% confidence
Finding
The dependency specification uses a lower-bound constraint only (pillow>=12.0.0), which makes builds non-reproducible and allows future package releases to be pulled in without review. In a package-processing skill that handles diagram/image export, this increases supply-chain risk and can unexpectedly introduce vulnerable or breaking versions into production.

Unverifiable Dependency: pillow has 16 known advisory(ies) (CVE-2016-2533 (Pillow buffer overflow in ImagingPcdDecode); CVE-2023-50447 (Arbitrary Code Execution in Pillow); CVE-2021-27922 (Pillow Uncontrolled Resource Consumption) +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
90% confidence
Finding
Pillow has a history of security advisories, including issues such as resource exhaustion and potential code-execution bugs in image parsing paths. Because the manifest does not pin a specific version, there is no assurance that deployments will avoid affected releases; in this skill's context, image/UML export functionality makes Pillow a directly relevant attack surface if untrusted input is processed.

Unpinned Dependencies

Low
Category
Supply Chain
Content
pillow>=12.0.0
python-pptx>=1.0.0
Confidence
91% confidence
Finding
The dependency python-pptx>=1.0.0 is unpinned, so installations may resolve to different versions over time. This weakens build integrity and can expose the skill to accidental adoption of vulnerable or incompatible upstream releases, especially relevant for document-generation code paths that process user-controlled content.

Static analysis

No suspicious patterns detected.