Back to skill

Security audit

Visualization

Security checks for vulnerabilities and agentic risk

Overview

This financial visualization skill mostly matches its purpose, but it has under-disclosed export, cloud-sharing, remote-code, and local file-access risks that users should review before installing.

Install only if you are comfortable with financial chart data being written to the workspace and with reviewing generated HTML/notebooks before opening or running them. Avoid using the cloud-storage, REST API, custom-template, and generated-notebook features until the publisher documents the destinations, pins or bundles dependencies, removes automatic pip installs, and validates file paths and API keys properly.

Vulnerability Patterns
  • Unauthorized Access and Privilege EscalationObtains permissions beyond the task's legitimate needs
  • 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
Findings (6)

T05 · Unauthorized Access and Privilege Escalation

Error
Location
integration/api.js:27
Finding

Trivially Forgeable API Key Authentication

Content
View full analysis
20; } ``` ### Technical Analysis The API accepts any value that starts with `viz_` and is longer than 20 characters. It does not verify that the key was issued by the application, exists in a trusted key store, has not been revoked, or possesses permission for the requested operation. Although `security/auth.js` contains a stronger key-generation and lookup mechanism, the REST API does not use it. Consequently, the authentication middleware provides only format validation rather than proof of identity. The API also accepts credentials through the `api_key` query parameter. Query strings are commonly retained in browser history, reverse-proxy access logs, analytics systems, and monitoring products, increasing the risk of credential disclosure if real key validation is later introduced without changing this behavior. ### Attack Path 1. An attacker creates an arbitrary value satisfying the format check, such as `viz_aaaaaaaaaaaaaaaaaaaaa`. 2. The attacker submits the value through the `x-api-key` header or `api_key` query parameter. 3. `isValidAPIKey()` returns `true` based only on the prefix and length. 4. The middleware assigns the forged value to `req.apiKey` and invokes `next()` ...[truncated 642 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Error
Location
ui/config_ui.js:209
Finding

Path Traversal in User Preference Storage

Content
View full analysis
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Error
Location
templates/custom_template.js:17
Finding

Path Traversal in Custom Template Storage

Content
View full analysis
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Error
Location
security/auth.js:80
Finding

Unauthenticated and Incorrect Configuration Encryption

Content
View full analysis
Remediation
View remediation

T08 · Insecure Dependencies

Warning
Location
main.js:339
Finding

Execution of Unpinned Remote JavaScript During Chart Rendering

Content
View full analysis
Visualization ``` The same dependency-loading pattern is also used in custom-template previews and Jupyter HTML output: ```html <script src="https://cdn.jsdelivr.net/npm/chart.js"></script> ``` ### Technical Analysis Generated HTML executes Chart.js directly from jsDelivr using an unversioned package URL. The effective JavaScript can change after the Skill has been reviewed because no exact package version is selected. The page also provides no Subresource Integrity hash to verify the downloaded content. In the primary rendering path, the generated HTML is written to the local workspace and opened through the canvas tool with a `file://` URL. This causes remotely supplied JavaScript to execute inside a document associated with a local file context. The exact filesystem access available to that script depends on the browser and canvas sandbox, but loading mutable remote code into this context unnecessarily expands the trust boundary. ### Attack Path 1. A user requests a visualization, custom-template preview, or interactive Jupyter output. 2. The generated document includes the unversioned jsDelivr URL. 3. When the document is rendered, the browser or notebook fetches the current upstream `chart.js` resource. 4. If the CDN, package publication, DNS path, or mutable package resolution is compromised, attacker-controlled JavaScript is returned. 5. The rendering environment executes that JavaScript with the privileges available to the generated document. 6. The script can manipulate chart output, ...[truncated 592 chars]
Remediation
View remediation

T08 · Insecure Dependencies

Warning
Location
integration/jupyter.js:108
Finding

Generated Notebook Installs an Unpinned and Unverified Python Package

Content
View full analysis
Remediation
View remediation
Vulnerability Patterns
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
Findings (46)

Tp4

High
Category
MCP Tool Poisoning
Confidence
96% confidence
Finding

The declared description emphasizes a user-facing AI visualization tool for financial analysis, specifically chart creation, portfolio dashboards, and industry comparisons via natural language. The supplied code instead is a backend data-access module that calls the Alpha Vantage API to retrieve daily, intraday, and technical indicator stock data and parse it into structured objects. While fetching stock data could support a visualization product, this chunk’s actual behavior is materially narrower and different from the declared primary purpose: it is data retrieval/parsing rather than visualization or AI-driven analysis. It also uses an external API despite no declared permissions. This is a meaningful description-behavior mismatch, not merely an implementation detail, because the core advertised capabilities are absent from the code shown.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding

The core behavior aligns with the declared visualization purpose: parsing natural-language prompts, building chart configurations, generating insights, and rendering stock/portfolio/industry visualizations. However, the implementation includes materially undeclared capabilities and resource access. It can call an external stock-data provider (Alpha Vantage), export files to local disk, generate PDF/HTML artifacts, and upload outputs to cloud storage (AWS/Google/Azure-like providers via the CloudStorage wrapper). These are not reflected in the declared permissions, which are empty. The code also supports macroeconomics, crypto, and custom templates, extending beyond the narrower declared description. Because the skill performs external data access and cloud/file export behaviors not disclosed in the description/permissions, this is a mismatch.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding

The declared description centers on an AI-powered financial data visualization skill that can generate stock charts, dashboards, and comparisons from natural language. The supplied code instead implements only a standalone PDF export stub. It creates a canvas, draws placeholder text, logs a destination path, and returns a mock object indicating a PDF was exported. There is no evidence of AI processing, natural-language handling, financial-domain logic, portfolio/industry comparison generation, or real chart rendering. Additionally, the code introduces an output-to-path/file export behavior that is not reflected in the declared permissions or purpose. This is a material description-behavior mismatch rather than a mere supporting detail.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding

The declared description is about financial data visualization functionality, but the supplied code chunk does not implement charting, portfolio dashboards, industry comparisons, natural-language handling, or any financial analysis behavior. Instead, it provides backend security infrastructure for API access and configuration protection. While security can be a supporting detail for a visualization product, this specific chunk’s actual purpose is materially different from the declared purpose and introduces undeclared capabilities related to authentication, rate limiting, encryption, and audit logging.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
94% confidence
Finding

The code’s primary function is to build chart configurations for cryptocurrency analysis (BTC, ETH, SOL, etc.) using generated mock datasets and a simple correlation matrix. This does relate broadly to financial visualization, but it materially differs from the declared description, which emphasizes stock charts, portfolio dashboards, and industry comparisons via natural language. There is no natural language handling, portfolio functionality, stock-specific logic, or industry comparison behavior in this code chunk. No suspicious external access or undeclared permissions are present, but the implemented capability is still a meaningful mismatch from the declared purpose.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
94% confidence
Finding

The code does relate loosely to visualization, but it does not implement the declared primary purpose of AI-driven financial analysis visualizations via natural language. Instead, it provides generic template storage and preview functionality using local filesystem access. Those file management capabilities are undeclared, and the behavior is materially narrower/different than creating stock charts, portfolio dashboards, or industry comparisons from user language input.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
87% confidence
Finding

The code is related to visualization, but its primary purpose is materially different from the declared description. Instead of creating stock charts, portfolio dashboards, or industry comparisons from natural language, it builds a static macroeconomic indicators dashboard using preset country data and configurable indicator/country lists. There is no evidence of natural language handling, stock-specific analysis, portfolio analysis, or industry comparison logic. This is a description-behavior mismatch in primary function, even though both involve charts.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding

The code is related to financial visualization configuration, so it partially aligns with the declared domain. However, the declared description emphasizes AI-driven natural-language visualization creation, while this code only generates a parameter form and static suggestion logic; it does not implement natural-language processing or actual visualization generation. More importantly, it includes undeclared local filesystem access to save and load user preferences under /home/admin/.openclaw/workspace/user_preferences/, which is a meaningful capability not represented by the declared permissions or description. The code also supports macroeconomic and cryptocurrency analysis presets, whereas the description mentions stock, portfolio, and industry comparisons. Overall, this is a description-behavior mismatch due to undeclared persistence/file access and materially different implemented behavior.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

High
Category
Not specified by scanner
Confidence
95% confidence
Finding

The code supports uploading generated artifacts to external cloud providers based on prompt-derived parameters, which can exfiltrate potentially sensitive financial visualizations outside the local environment. Because this behavior is not core to basic visualization and is triggered from user text parsing, it materially expands the data exposure surface.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The roadmap explicitly states '英文界面(默认)' while also listing automatic language detection based on user settings. Forcing a default language can violate language/locale policy when the user is not clearly given a choice or explicit opt-in, especially since the current interface is Chinese.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
70% confidence
Finding

Without declared permissions the skill's intent is opaque and cannot be validated.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The skill states that outputs are auto-saved to the workspace with timestamped filenames but does not warn users up front or describe write scope/retention. In a financial-analysis context, generated charts and dashboards may contain sensitive portfolio or watchlist information, so silent persistence increases the risk of unintended data exposure or cluttering trusted workspace locations.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
89% confidence
Finding

The manifest describes a skill for creating financial visualizations via natural language, but this file also implements a CloudStorage class that uploads charts to AWS, Google Cloud, or Azure and generates shareable links. Persisting artifacts to external cloud storage and distributing them is a broader capability than simply generating charts or dashboards.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
84% confidence
Finding

A visualization skill may reasonably render charts, but code that supports uploading outputs to S3, Google Cloud Storage, and Azure Blob Storage adds an external distribution/persistence capability not stated in the manifest. This is especially true because the manifest does not mention storage, publishing, or cross-cloud integration.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The file’s title and core instruction are entirely in Chinese, which implies a fixed language requirement for use of the skill. Under the policy, forcing a specific language without user opt-in is a natural-language policy violation unless the locale constraint is clearly documented and justified.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The example content is entirely in Chinese and implicitly requires Chinese-language interaction without offering a language-neutral alternative or opt-in. This is not a direct security exploit, but it can coerce user interaction into an unintended language, increasing the risk of misunderstanding financial instructions or outputs in a sensitive domain like portfolio analysis.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · integration/api.js (reported line 110)May include surrounding context.

js
// This would integrate with the main visualization logic
    // For now, return mock success
    return {
      url: `https://api.visualization.ai/results/${Date.now()}.png`,
      format: context.format,
      template: context.template
    };

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

The HTML output injects a remote <script> tag loading Chart.js from a third-party CDN into Jupyter output. This creates a supply-chain and script-execution risk: if the CDN, dependency, or transport context is compromised, arbitrary JavaScript can run in the notebook frontend, and there is no warning or integrity control for the user.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The generated notebook template includes a shell-style !pip install visualization-skill step, which causes network access and package installation when a user runs the notebook. For a visualization helper, this expands behavior beyond rendering output and can expose users to supply-chain risk, unexpected code execution during install, and environment modification inside Jupyter.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

Embedding package installation directly in a generated notebook gives the skill an unjustified capability to fetch and execute code from the network in the user's environment. In Jupyter, users commonly execute cells verbatim, so this can silently turn a visualization template into an installer and increase supply-chain and environment-compromise risk.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
79% confidence
Finding

The manifest describes generating financial visualizations, but the code also supports loading arbitrary custom templates through a template manager. That introduces an additional content-loading capability not clearly justified by the stated purpose and may allow behavior changes driven by external template files.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The skill writes visualization outputs to a local workspace and can additionally upload them to cloud storage, which goes beyond a narrow 'render a chart' behavior and creates data-handling side effects. In a financial-analysis context, generated charts and embedded data may contain sensitive portfolio or market analysis information, so exporting and transmitting them without strong scoping or consent increases confidentiality risk.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The skill performs local file writes and optional cloud uploads without any visible disclosure or confirmation in this code path. Silent persistence and transmission are risky in a financial visualization tool because users may reasonably expect ephemeral rendering rather than storage or external sharing of their data.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
89% confidence
Finding

The renderer loads Chart.js from an external CDN inside a locally generated HTML file, introducing an unexpected outbound network dependency and a supply-chain trust risk. If the CDN resource is tampered with, blocked, or replaced, the rendering environment could execute untrusted JavaScript during chart generation.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The renderer saves a generated HTML file containing chart data and possibly insights/metrics to disk without user disclosure. Persisting this intermediate artifact can leave sensitive financial information on the host filesystem longer than expected and may expose it to other local processes or users.

Content

No source excerpt is available for this finding.