Back to skill

Security audit

archviz-skills

Security checks for vulnerabilities and agentic risk

Overview

This visualization skill mostly matches its purpose, but it needs review because it can guide agents toward remote code execution in generated HTML and self-modifying skill-maintenance workflows without tight safeguards.

Install only if you are comfortable reviewing generated HTML before opening or hosting it, especially files that load scripts from jsDelivr. Prefer explicit invocation, use a dedicated virtual environment for Python dependencies, pin or vendor dependencies where possible, and do not allow the self-evolution workflow to edit installed skill files unless you intentionally requested maintenance work.

Vulnerability Patterns
  • Remote Payload Retrieval and ExecutionFetches external code whose behavior can change after review
  • 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
  • Embedded Malicious CodeShips malicious scripts inside the skill and executes them locally
Findings (2)

T08 · Insecure Dependencies

Warning
Location
requirements.txt:2
Finding

Unbounded Python Dependencies Permit Unreviewed Package Code Execution

Content
View full analysis
=0.7 # Data visualization (interactive HTML export) plotly>=5.0 # Static charts (SVG/PNG/PDF export) matplotlib>=3.7 # Statistical visualization seaborn>=0.12 # Numerical computing (for box plots, distributions) numpy>=1.24 ``` The Skill also directly recommends installing an unpinned package: ```markdown **Primary: termaid** (`pip install termaid`) ``` ### Technical Analysis Every dependency is specified using only a minimum version constraint. Consequently, future installations can resolve to package releases that did not exist when the Skill was audited. The direct `pip install termaid` instruction has the same issue and does not constrain the package to a reviewed version. Python package installation can process package metadata, build source distributions, install executable entry points, and place importable code in the active environment. The installed libraries are subsequently imported or executed by visualization workflows. A compromised upstream account, malicious future release, or dependency-chain compromise could therefore introduce code that is not represented in this repository. No evidence indicates that the currently named packages are malicious. The vulnerability is the absence of version locking and artifact verification. ### Attack Path 1. An attacker compromises a listed package, one of its transitive dependencies, or its package-publishing account. 2. The attacker publishes a malicious version satisfying the broad lower-bound constraint. 3. A user or Agent follows the documented `pip install -r requirements.txt` or `pip install termaid` instruct ...[truncated 992 chars]
Remediation
View remediation
matplotlib== seaborn== numpy== ``` 2. Generate a lock file containing resolved transitive dependencies. 3. Record package hashes and install with: ```bash python -m pip install --require-hashes -r requirements-lock.txt ``` 4. Replace `pip install termaid` in `SKILL.md` with installation from the locked dependency set. 5. Require installation inside a dedicated virtual environment with no administrator privileges. 6. Periodically update dependencies through a controlled review process that includes vulnerability scanning and verification of package provenance. 7. Prefer binary wheels from trusted indexes and disable unexpected source builds where operationally practical. ]]>

T03 · Remote Payload Retrieval and Execution

Warning
Location
templates/html/heatmap.html:6
Finding

Generated HTML Executes Mutable Remote Chart.js Payloads

Content
View full analysis
``` `templates/html/line-chart.html:6`: ```html ``` `templates/html/self-contained-html-viz.txt:12`: ```html ``` ### Technical Analysis These templates load Chart.js without an explicit version. The effective JavaScript payload is selected by the CDN when the generated document is opened, rather than being fixed at Skill review time. The templates also omit Subresource Integrity metadata, so the browser has no expected cryptographic digest against which to validate the downloaded script. A classic external script executes with the security context of the document that includes it. If the resolved package, publishing account, or CDN delivery path is compromised, the returned script can read and alter the visualization DOM, inspect data embedded in the page, initiate network requests, and access browser storage available to the page’s origin. This is particularly inconsistent with the templates’ description as self-contained HTML: opening them requires network access and executes code that is not contained in the audited artifact. ### Attack Path 1. An attacker compromises a Chart.js publishing account, an eligible upstream release, or the CDN delivery path. 2. The unversioned `chart.js` URL begins returning attacker-controlled JavaScript. 3. The Skill generates or copies one of the affected HTML templates. 4. A user opens the HTML while network access is available. 5. The browser retrieves a ...[truncated 829 chars]
Remediation
View remediation
/dist/chart.umd.min.js" integrity="sha384-" crossorigin="anonymous"> ``` 2. Generate the integrity digest from the exact production artifact and verify it during release. 3. Prefer vendoring the reviewed JavaScript asset locally so that the HTML is genuinely self-contained. 4. Apply the same correction to all three affected templates. 5. Add a restrictive Content Security Policy appropriate to the generated document, such as limiting scripts to the local document or the explicitly approved CDN. 6. Document that generated HTML must not be hosted on origins containing sensitive authenticated applications unless third-party script execution has been eliminated. 7. Add an automated test that rejects unversioned CDN package URLs and external scripts without integrity metadata. ]]>
Vulnerability Patterns
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
Findings (42)

Hidden Instructions

High
Category
Prompt Injection
Confidence
70% confidence
Finding

Hidden instructions were detected in comments or invisible text. These could contain malicious directives. Manual review is recommended.

Content

Scanner excerpt · templates/html/_archviz-deps.html (reported line 1)May include surrounding context.

html
<!--
  archviz-skills 3D CDN Dependencies Reference
  Copy this importmap block into any self-contained 3D HTML template.
  Verified: 2026-06-11

Hidden Instructions

High
Category
Prompt Injection
Confidence
70% confidence
Finding

Hidden instructions were detected in comments or invisible text. These could contain malicious directives. Manual review is recommended.

Content

Scanner excerpt · templates/html/bullet-graph.html (reported line 4)May include surrounding context.

html
<!DOCTYPE html>
<html><head><meta charset="utf-8"><title>Bullet Graph</title></head>
<body style="margin:0;background:#f5f0eb;font-family:system-ui">
<!-- Bullet Graph — archviz-skills (Few recommended) -->
<!-- Use for: KPI vs target, performance tracking, single metric comparison -->
<canvas id="c" width="600" height="200"></canvas>
<script>

Hidden Instructions

High
Category
Prompt Injection
Confidence
70% confidence
Finding

Hidden instructions were detected in comments or invisible text. These could contain malicious directives. Manual review is recommended.

Content

Scanner excerpt · templates/html/treemap.html (reported line 4)May include surrounding context.

html
<!DOCTYPE html>
<html><head><meta charset="utf-8"><title>Treemap</title></head>
<body style="margin:0;background:#f5f0eb;font-family:system-ui">
<!-- Treemap — archviz-skills (self-contained, no deps) -->
<!-- Use for: part-to-whole, hierarchical composition, budget allocation -->
<!-- Env: Obsidian (iframe/HTML block) or browser -->
<canvas id="c" width="800" height="500"></canvas>

Hidden Instructions

High
Category
Prompt Injection
Confidence
70% confidence
Finding

Hidden instructions were detected in comments or invisible text. These could contain malicious directives. Manual review is recommended.

Content

Scanner excerpt · templates/html/waterfall.html (reported line 4)May include surrounding context.

html
<!DOCTYPE html>
<html><head><meta charset="utf-8"><title>Waterfall Chart</title></head>
<body style="margin:0;background:#f5f0eb;font-family:system-ui">
<!-- Waterfall Chart — archviz-skills -->
<!-- Use for: cumulative effect of sequential changes (revenue breakdown, budget flow) -->
<canvas id="c" width="700" height="400"></canvas>
<script>

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

This markdown changelog records a trigger list including very common terms like "3d", "building", and "floorplan". In a markdown file, documenting broad activation phrases without negative examples or constraints can contribute to unintended skill invocation because the phrases overlap with ordinary user requests.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

This entry explicitly says routers can auto-activate the skill on generic trigger terms without a full path or exact name. Broad auto-activation increases the chance that an agent invokes this skill in marginal contexts, potentially overriding more appropriate safeguards or causing prompt-scope confusion, especially because the skill supports multiple output modes including HTML, Python, and 3D rendering guidance.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The design rules state 'One language per diagram — never mix Chinese and English labels in the same diagram,' which is a natural-language policy constraint affecting user output. This forces a locale/language behavior without offering user choice or documenting a justified regional compliance need.

Content

No source excerpt is available for this finding.

Skill Enumeration

Medium
Category
Agent Snooping
Confidence
85% confidence
Finding

Skill enumerates or reads other installed skills. Access to other skills' SKILL.md files or the skills directory reveals prompt instructions, capabilities, and secrets that should be invisible to peer skills.

Content

Scanner excerpt · README.md (reported line 54)May include surrounding context.

bash
git clone https://github.com/archsueh/archviz-skills.git
# Claude Code / Codex
cp -r archviz-skills ~/.claude/skills/
# Hermes Agent
cp -r archviz-skills ~/.hermes/skills/creative/archviz-skills

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The description advertises a wide set of trigger phrases across multiple languages and modalities without strong activation boundaries. In an agent setting, broad natural-language matching can cause accidental invocation and expose users to behaviors like remote CDN use, extra tooling guidance, or unrelated workflow expansion.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The manifest labels the skill as 'safe' while the documentation explicitly directs use of external CDN imports and even suggests live network verification via curl. That mismatch can mislead downstream agents or reviewers into treating a network-dependent skill as offline/self-contained, increasing the chance of unreviewed remote dependency use and supply-chain exposure.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The trigger list includes very broad terms such as '3d', 'building', and related generic concepts, which can cause the skill to activate in contexts far beyond restrained diagram generation. Over-broad activation increases the chance that agents follow the skill's network-dependent or self-modifying instructions in situations where the user did not intend to invoke this capability.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The self-evolution section instructs the agent to run evaluation tooling on the skill itself, apply search/replace changes, and update files for future releases. This extends the skill from visualization generation into self-modifying behavior, which can cause unauthorized repository changes or prompt an agent to alter its own instructions without separate approval.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
89% confidence
Finding

The manifest defines activation text around "$archviz-skills" and a general request to "create a restrained visualization from this brief," but it does not specify when the skill should or should not activate, nor provide exclusion conditions. In a manifest with implicit invocation enabled, this broad description can increase the chance of unintended triggering for ordinary visualization requests.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
88% confidence
Finding

The guidance requires 'only ultra-short identifiers' and a 'clean ASCII Gantt version,' explicitly contrasting this with 'Chinese or long English' labels that should be refactored. This is a natural-language locale constraint that effectively forces ASCII/English-style labeling without offering user opt-in or documenting a justified regional/compliance reason.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
89% confidence
Finding

Line L08 states label limits as '≤6 words English / ≤8 Chinese chars' and requires a consistent language, which imposes specific language/locale handling in the skill guidance. The file does not indicate that users can opt into a language choice or that the constraint is limited to a justified region-specific use case.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The template explicitly presents itself as self-contained, but it fetches Chart.js from a remote CDN at runtime. This creates a supply-chain and privacy risk: rendered output depends on third-party infrastructure, can leak user IP/referrer metadata, and could execute altered JavaScript if the CDN resource is compromised or changed.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The documentation says the output renders 'without external deps' and is 'One file,' but the actual HTML relies on a remote script. That mismatch is security-relevant because users may open the file in trusted or offline contexts believing it has no network behavior, when it can unexpectedly contact a third party and execute remote code.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The template loads a third-party CDN script without any user-facing disclosure or consent warning. In the context of an agent skill that generates artifacts for users to paste into Obsidian or open in a browser, this can silently introduce network access and third-party script execution into environments where users may expect local-only preview behavior.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The document declares lang="zh-CN" and presents the visible UI text only in Chinese, which imposes a specific language/locale on users. There is no indication that the skill offers a language choice or that the Chinese-only presentation is required for a region-specific purpose.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The template imports executable JavaScript modules directly from third-party CDNs while presenting itself as a self-contained HTML artifact. This creates a supply-chain and integrity risk: if the CDN content changes, is compromised, or is blocked, the rendered output can execute unexpected code or fail unpredictably in the agent/user environment.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The template explicitly advertises itself as self-contained, but it loads Three.js and animejs from external CDNs at runtime via an import map. That creates a supply-chain and availability risk: a compromised CDN, malicious package update, or blocked network environment can alter behavior or execute attacker-controlled code in any consumer that opens the HTML.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The document sets lang="zh-CN" and the visible UI text throughout the page is Chinese, which imposes a specific language/locale on users. The file does not provide any opt-in, language selection, or explanation that this is a region-specific skill, so it matches the policy concern for forced locale.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
93% confidence
Finding

The phrase "越大越细 hierarchy" introduces a non-English language requirement or convention in the skill documentation without user opt-in or an explicit justification for the locale choice. This can conflict with organizational language/locale policies that require consistent language or user choice.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Low
Category
Not specified by scanner
Confidence
80% confidence
Finding

The manifest focuses on text-first, preview-compatible visualization outputs and draw.io guidance, but the body goes further by describing editable draw.io source generation and optional PNG/SVG/PDF export handoff. While adjacent to visualization, this broadens the capability from guidance into production-oriented artifact generation/export workflow not clearly stated in the manifest description.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
91% confidence
Finding

The document declares lang="zh-CN", and the visible UI text is also presented in Chinese, which indicates a fixed language choice. The file does not provide an opt-in, alternative locale, or explanation that this is intentionally limited to a China-specific context.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.