Back to skill

Security audit

LEGO Pixel Art Generator

Security checks for vulnerabilities and agentic risk

Overview

This is a local LEGO pixel-art web tool with minor scoping and reliability issues, but no evidence of hidden data access, network exfiltration, persistence, or destructive behavior.

Before installing, note that this is a browser-based image tool: use it for LEGO-style pixel art, expect local image upload and PNG/TXT downloads, and avoid entering oversized dimensions until the input clamping issue is fixed.

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
assets/pixel-lego.html:630
Finding

Unvalidated Canvas Dimensions Allow Client-Side Resource Exhaustion

Content
View full analysis
$(id).addEventListener('input', () => { const w = parseInt($('widthNum').value); $('widthRange').value = w; if (lockedRatio && sourceImage) { const h = Math.round(w / aspectRatio); $('heightNum').value = h; $('heightRange').value = h; clampHeight(); } generate(); })); ['heightRange', 'heightNum'].forEach(id => $(id).addEventListener('input', () => { const h = parseInt($('heightNum').value); $('heightRange').value = h; if (lockedRatio && sourceImage) { const w = Math.round(h * aspectRatio); $('widthNum').value = w; $('widthRange').value = w; } generate(); })); function generate() { if (!sourceImage) return; const w = parseInt($('widthNum').value); const h = parseInt($('heightNum').value); const precision = getPrecision(); // Create offscreen canvas to sample pixels const oc = document.createElement('canvas'); oc.width = w; oc.height = h; const ctx = oc.getContext('2d'); ctx.drawImage(sourceImage, 0, 0, w, h); const imgData = ctx.getImageData(0, 0, w, h); // Build grid: for each pixel, find nearest LEGO color const grid = []; const colorCount = new Map(); for (let y = 0; y < h; y++) { const row = []; for (let x = 0; x < w; x++) { const idx = (y * w + x) * 4; const rgb = { r: imgData.data[idx], g: imgData.data[idx + 1], b: imgData.data[idx + 2] }; const ci = nearestLego(rgb); row.push(ci); colorCount.set(ci, (colorCount.get(ci) || 0) + 1); } grid.push(row); } ``` ### Technical Analysis The interface documents and declares a valid dimension range of 10–200 studs, but the number-input values are parsed and passed to `generate()` ...[truncated 2159 chars]
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
Findings (6)

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
2. Open the built-in tool `assets/pixel-lego.html`

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
2. Open the built-in tool `assets/pixel-lego.html`

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The trigger phrase set includes very generic terms such as "pixelate," which can match ordinary image-editing requests unrelated to LEGO art. This can cause the skill to activate unexpectedly, potentially hijacking user intent and routing users into an unrelated embedded tool, which is a real security and safety concern in agent orchestration even without malicious content.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

The manifest says the skill supports 'color precision adjustment', and the UI exposes a Precision control, but the computed precision value is never applied during generation. In generate(), every pixel is directly mapped to the nearest LEGO color with no logic that changes behavior based on the selected precision, so the advertised capability does not match the implemented behavior.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
90% confidence
Finding

The document explicitly sets the page language to English via the HTML lang attribute, and all visible UI strings are in English. Under the policy rule, forcing a specific language without opt-in or documented justification can be a locale-policy issue.

Content

No source excerpt is available for this finding.

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
83% confidence
Finding

This HTML code handles user-selected image files and later triggers local file downloads, but the interface text around upload/export does not disclose that the image will be processed in-browser or that export buttons will save files to the user's device. While these are expected features of the tool, the rule asks for user disclosure for file-affecting operations when no warning or explanatory text is present.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.