Back to skill

Security audit

ECharts

Security checks for vulnerabilities and agentic risk

Overview

The skill is a coherent ECharts chart generator, but its generated chart pages automatically run mutable JavaScript from public CDNs, so it belongs in Review before installation.

Install only if you are comfortable with generated chart HTML contacting public CDNs and executing the returned ECharts script. For sensitive or offline data, use a reviewed local ECharts bundle via --cdn or avoid opening/rendering generated pages until the runtime source is pinned or bundled.

Vulnerability Patterns
  • Remote Payload Retrieval and ExecutionFetches external code whose behavior can change after review
  • 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
  • Unauthorized Access and Privilege EscalationObtains permissions beyond the task's legitimate needs
Findings (1)

T03 · Remote Payload Retrieval and Execution

Warning
Location
assets/standalone-chart.template.html:406
Finding

Generated chart pages retrieve and execute mutable remote JavaScript

Content
View full analysis
entry.trim()) .filter(Boolean); return Array.from(new Set([...configured, ...fallbackUrls])); } function loadScript(src) { return new Promise((resolve, reject) => { const script = document.createElement("script"); script.src = src; script.async = true; script.onload = () => resolve(window.echarts); script.onerror = () => { script.remove(); reject(new Error(`Could not load ${src}`)); }; document.head.appendChild(script); }); } ``` The related default URL is: ```javascript const DEFAULT_CDN = "https://cdn.jsdelivr.net/npm/echarts@5/dist/echarts.min.js"; ``` ### Technical Analysis Every generated `chart.html` dynamically creates a `script` element and executes JavaScript obtained from a public CDN. The default jsDelivr and unpkg URLs use the mutable major-version selector `echarts@5`, so the effective code can change after the Skill package has been reviewed. The template also provides automatic fallback across three external providers. No Subresource Integrity hash is assigned to the script, and the generated page does not enforce a restrictive Content Security Policy. Consequently, the browser cannot verify that the retrieved script is the exact artifact intended by the Skill author. The `--cdn` ...[truncated 2547 chars]
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
Findings (7)

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
- Use `--export-image png` or `--export-image svg` during `build.mjs` for one-step image output.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
85% confidence
Finding

The skill instructs the agent to run local Node/Bun scripts and references environment-dependent behavior such as browser auto-detection and ECHARTS_BROWSER_PATH, but it does not declare an explicit tool scope or allowed-tools boundary. That creates unnecessary ambiguity about what execution and environment access the skill expects, increasing the risk of over-privileged invocation or unintended access in hosts that infer permissions loosely.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The activation description is broad enough to match many ordinary requests involving charts, dashboards, exports, or structured data transformation. Over-broad routing can cause the skill to activate in contexts where code execution or file generation is unnecessary, expanding attack surface and increasing the chance that sensitive user data is processed by a more capable skill than intended.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The standalone artifact dynamically loads executable JavaScript from third-party CDNs at runtime, which expands trust beyond the local artifact itself. This creates supply-chain and privacy exposure: opening the generated HTML causes network requests to external domains and executes whatever script those hosts return, which is unsafe for an export artifact expected to be self-contained.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The page supports configurable external script sources and silently falls back to multiple public CDNs, giving generated artifacts unnecessary network-loading capability. In practice this means a local chart file can unexpectedly reach out to the internet and run remote code, which increases attack surface and can violate offline or restricted-environment expectations.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
87% confidence
Finding

When the HTML artifact is opened, the browser contacts external CDNs, disclosing client IP address, user agent, referrer/origin context, and timing metadata without an explicit warning in the artifact. While no sensitive chart data is directly sent in the request, this undisclosed network behavior is a meaningful privacy and policy risk for a tool positioned as artifact generation.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
93% confidence
Finding

The calendar configuration sets both day and month name maps to "en", which forces an English locale in generated output. This is a natural-language locale policy issue because the file does not offer a user choice or document a justified region-specific constraint.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.