Back to skill

Security audit

Table2Image

Security checks for vulnerabilities and agentic risk

Overview

This table-to-image skill is purpose-aligned, but it needs review because its browser renderer accepts unvalidated styling that can trigger network requests and its install flow runs automatic Playwright setup.

Review before installing if you will render tables or style options influenced by untrusted users. Prefer a version-pinned install, avoid exposing custom theme/style fields to untrusted input, and run the renderer in an environment where Chromium cannot reach sensitive internal network services.

Vulnerability Patterns
  • 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
  • Embedded Malicious CodeShips malicious scripts inside the skill and executes them locally
Findings (1)

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/index.js:300
Finding

Unsanitized Theme and Cell Style Values Permit HTML/CSS Injection and Browser-Initiated Requests

Content
View full analysis
= 600) style += 'font-weight: 600;'; } return `${escapeHtml(formatted)}`; ``` ```javascript // Set content await page.setContent(html, { waitUntil: 'networkidle' }); ``` ### Technical Analysis The renderer accepts custom theme properties and column style values and directly interpolates them into a generated HTML document. These values are not restricted to valid color syntax and are not escaped for their CSS or HTML attribute contexts. The table's textual content is processed by `escapeHtml()`, but that protection does not apply to values such as: - `themeColors.background` - `themeColors.text` - Other custom theme color properties used in generated CSS - `cellStyle.color` A malicious theme value can terminate the intended CSS declaration and introduce another declaration containing `url(...)`. A malicious `cellStyle.color` value can additionally terminate the quoted `style` attribute and inject new HTML elements. The generated document is subsequently loaded into Chromium using `page.setContent()`. No request interception or outbound network restriction ...[truncated 2295 chars]
Remediation
View remediation
route.abort()); await page.setContent(html, { waitUntil: 'domcontentloaded' }); ``` If external resources are later required, implement an explicit allowlist of schemes, hosts, ports, and resource types. Block loopback, link-local, private, multicast, and cloud metadata address ranges after DNS resolution, and account for redirects and DNS rebinding. 4. **Add a restrictive Content Security Policy** Include a CSP that prevents resource retrieval and script execution, for example: ```html ``` Network interception should remain ...[truncated 587 chars]
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
Findings (12)

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
See `references/examples.md` for common use cases and code samples.

Rp1

Medium
Category
MCP Rug Pull
Confidence
95% confidence
Finding

The install block invokes npx playwright install chromium without pinning the Playwright package version. npx may resolve and execute whatever Playwright version is available at install time, which can introduce supply-chain risk and make builds non-reproducible if an unexpected or compromised release is fetched.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
94% confidence
Finding

The documentation repeats an unpinned npx playwright install chromium command, encouraging users to execute a network-fetched tool without a fixed version. Even though this is in docs rather than executable code, users commonly copy-paste such commands, so it still creates a real supply-chain exposure and version drift risk.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
94% confidence
Finding

The install instructions invoke npx playwright install chromium without pinning a specific Playwright version. npx may resolve and execute whatever version is current in the environment or fetched from the registry, which weakens supply-chain integrity and can lead to unexpected or malicious code execution during setup. In this skill, that risk is amplified because the command is presented as a standard installation step users are likely to run verbatim.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
87% confidence
Finding

The file presents the skill content in Chinese and labels it as the Chinese variant, but does not state that language selection is user-driven within this skill description. Under the policy, forcing a specific language without user opt-in can be a natural-language policy violation unless the locale constraint is explicitly justified.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
94% confidence
Finding

The documentation repeats an unpinned npx playwright install chromium command in the installation section. Repetition increases the chance that operators will execute it directly, inheriting the same supply-chain risk of running an unintended Playwright version or registry-provided package at install time. Because this skill requires browser tooling, users may be less suspicious of a networked install step, making the pattern more dangerous in context.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
90% confidence
Finding

The postinstall script executes npx playwright install chromium, which relies on resolving and running a package via npx at install time rather than invoking a fully pinned local binary. Install-time execution expands supply-chain risk because dependency resolution or package substitution can cause unexpected code to run automatically on user systems during installation.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
86% confidence
Finding

This markdown example shows userMessage content being auto-converted and then sent via message.send, which is a network/external transmission of user-provided content. The surrounding documentation does not warn that message contents may be forwarded to Discord or otherwise transmitted externally.

Content

No source excerpt is available for this finding.

Vague Triggers

Low
Category
Not specified by scanner
Confidence
82% confidence
Finding

This is a manifest file, so vague-trigger review applies. The description states a broad capability ('Convert markdown tables and JSON data to PNG images') but provides no explicit trigger phrases, invocation constraints, or exclusion conditions, leaving unclear when the skill should activate versus not activate.

Content

No source excerpt is available for this finding.

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
83% confidence
Finding

The dependency playwright is specified with a caret range (^1.58.2), allowing newer minor/patch releases to be pulled in automatically. While common practice, this weakens reproducibility and slightly increases supply-chain exposure if an upstream release is compromised or introduces unsafe behavior, especially because this package also runs install-time setup.

Content

Scanner excerpt · package.json (reported line 27)May include surrounding context.

json
"author": "umr",
  "license": "MIT",
  "dependencies": {
    "playwright": "^1.58.2"
  }
}

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
81% confidence
Finding

This example uses Chinese fund names and Chinese UI labels such as 基金, 净值, 涨跌, and 市值 with no note that the example is locale-specific or optional. That can conflict with a language/locale policy requiring user choice or explicit justification for non-default locale behavior.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
89% confidence
Finding

This code file contains user-facing natural-language strings such as comments and console output exclusively in Chinese. Under the stated policy, forcing a specific language without user opt-in can be a natural-language policy violation unless the locale restriction is documented and justified, which is not evident in this file.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.