Back to skill

Security audit

Craw Figma

Security checks for vulnerabilities and agentic risk

Overview

This Figma skill is broadly purpose-aligned, but it gives an unauthenticated local connector powerful control over live Figma files, including deletion and export.

Install only if you trust the local connector code you will run, and use it only on Figma files where automated modification and export are acceptable. Protect the Figma token, avoid running unpinned npx workflows, stop the connector when not in use, and require explicit review before delete, bulk-edit, import, or export commands.

Vulnerability Patterns
  • 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
  • Remote Payload Retrieval and ExecutionFetches external code whose behavior can change after review
Findings (3)

T09 · Insecure Skill Coding Practices

Error
Location
plugin/ui.html:135
Finding

DOM XSS Through Unescaped Figma Node Names

Content
View full analysis
0) { var h = ''; msg.nodes.forEach(function(n) { h += '' + n.name + ' ' + n.type + ''; }); selectionInfo.innerHTML = h; } else { selectionInfo.innerHTML = 'None'; } return; } ``` The attacker-controlled node name originates from the active Figma selection: ```javascript var selArray = figma.currentPage.selection.map(function(n) { var r = {}; r.id = n.id; r.name = n.name; r.type = n.type; r.x = n.x; r.y = n.y; r.width = n.width; r.height = n.height; return r; }); var selMsg = {}; selMsg.nodes = selArray; postUI("selection-update", selMsg); ``` ### Technical Analysis The plugin concatenates `n.name` and `n.type` into an HTML string and assigns it to `selectionInfo.innerHTML`. Figma node names can be influenced by document collaborators or imported content. No HTML escaping, sanitization, or trusted-type enforcement is applied before the value reaches the DOM sink. If active HTML content or an event-handler payload is accepted by the plugin UI runtime, selecting a maliciously named node can execute JavaScript in the plugin UI context. The message listener also accepts `event.data` without checking `event.source`, further weakening the UI trust boundary. Code executing in this UI can access the existing `parent.postMessage` bridge: ``` ...[truncated 1555 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Error
Location
plugin/ui.html:120
Finding

Unauthenticated Localhost Channel Accepts Destructive Figma Commands

Content
View full analysis
Remediation
View remediation

T08 · Insecure Dependencies

Warning
Location
README.md:148
Finding

Unpinned Third-Party Package Execution in Documented Build Workflow

Content
View full analysis
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
Findings (21)

Tp4

High
Category
MCP Tool Poisoning
Confidence
96% confidence
Finding

The code clearly supports substantial bidirectional interaction within Figma Desktop through the plugin UI bridge: it polls for commands, executes many create/modify/delete/export actions, and posts results, selection, and page info back to the UI. That aligns partially with the declared write/export aspects. However, several prominent declared capabilities are not represented in this chunk: there is no REST API access for reading Figma files, no WebSocket usage, no accessibility audit logic, and no design-token extraction. The actual communication model here is UI message passing plus polling, not a local WebSocket connector. Therefore the description overstates and mischaracterizes major capabilities relative to the supplied code.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding

The description significantly overstates and mischaracterizes the code's functionality. The supplied script only performs a narrow subset of Figma write actions: it constructs shape-creation payloads and sends them over HTTP to a local connector endpoint (/send-command on localhost:9199). While this loosely aligns with 'create' operations in Figma, it does not demonstrate the broader declared capabilities. There is no REST API access to Figma files, no reading from Figma, no layer modification or deletion logic, no accessibility analysis, no token extraction from existing designs, and no asset export. The connector mechanism is also HTTP-based in this chunk, not WebSocket-based as declared. Therefore the declared description does not accurately represent the actual behavior of this code chunk.

Content

No source excerpt is available for this finding.

Credential Access

High
Category
Privilege Escalation
Confidence
70% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

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

md
## Requirements

- **Figma Personal Access Token** → for REST API (read). Get it: Figma → Settings → Account → Personal Access Tokens
- **Figma Desktop** → required for write operations
- **Node.js 18+**

Credential Access

High
Category
Privilege Escalation
Confidence
70% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

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

md
## Requirements

- **Figma Personal Access Token** → for REST API (read). Get it: Figma → Settings → Account → Personal Access Tokens
- **Figma Desktop** → required for write operations
- **Node.js 18+**

Rp1

Medium
Category
MCP Rug Pull
Confidence
70% confidence
Finding

npx commands without a version suffix (e.g. @1.0.0) create a rug-pull risk if the upstream server is compromised and publishes a malicious update.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
70% confidence
Finding

npx commands without a version suffix (e.g. @1.0.0) create a rug-pull risk if the upstream server is compromised and publishes a malicious update.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The README explicitly promotes exporting Figma designs to /tmp/ for AI/vision analysis, but does not warn users that potentially sensitive design assets may be written to local disk and then processed by automated agents. In a design workflow, those exports can contain unreleased product UI, branding, or customer information, so silent local persistence and downstream AI ingestion meaningfully 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 README instructs users to supply FIGMA_ACCESS_TOKEN but gives no warning about protecting the token, avoiding source control leakage, or scoping its permissions. Figma access tokens grant API access to design data, so poor handling can expose sensitive files or account resources if the token is logged, committed, or reused insecurely.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
89% confidence
Finding

The skill exposes sensitive capabilities including environment-variable access and instructions to run local processes, but it does not declare an explicit tool/permission scope. That increases the chance an agent may overreach, especially when the skill also handles credentials and can perform live write actions against a local Figma instance.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The skill prominently enables create/modify/delete operations in a live Figma desktop session but provides no explicit warning to require confirmation before destructive actions. In an agent context, that omission raises the risk of accidental data loss or unintended design changes from ambiguous prompts.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The documentation instructs users to export a personal access token into the environment but does not warn against exposing, logging, echoing, or committing that credential. Because the skill relies on a high-value API token, poor handling guidance can lead to credential leakage and unauthorized access to Figma resources.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
85% confidence
Finding

Using npx style-dictionary build without pinning a version creates a supply-chain risk because it may fetch and execute whatever package version is current at runtime. If the upstream package or dependency tree is compromised, users could run attacker-controlled code on their machine.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The auto-setup instructions say the agent may run figma_connector.js if it has shell access, but they do not require an explicit user warning or consent for starting a local long-running process. In a local-agent setting, silently launching services expands attack surface and may surprise users by opening localhost endpoints and enabling live write control of Figma.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The plugin exposes a deleteNode command that immediately removes any node by ID with no confirmation, allowlist, or user-approval gate. In this skill’s context, commands are polled and executed automatically from an external UI/connector, so a mistaken, spoofed, or malicious command can cause irreversible design destruction at scale.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The exportNode flow can export node contents and forward the base64-encoded asset to the UI layer without any visible user consent or contextual warning. Because this skill is explicitly bidirectional and connected to external components, that behavior creates a realistic exfiltration path for sensitive design assets, including proprietary mockups or embedded secrets in designs.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The UI forwards command results and exported PNG data from the Figma plugin to a local HTTP connector on localhost without any visible consent, disclosure, authentication, or origin validation in this file. In this skill’s context, the data can include design contents and image exports from active Figma documents, so silent transmission to another process materially increases exfiltration risk and makes the behavior more dangerous than a typical localhost health check.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

This markdown file contains substantive instructional content in Italian across most sections, but it does not indicate that the language is intentionally region-specific or give the user any option to select another language. Under the policy, forcing a specific language without user opt-in is a natural-language policy violation.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
50% 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 · references/figma-api-reference.md (reported line 3)May include surrounding context.

md
# Figma REST API Reference

Base URL: `https://api.figma.com/v1`
Auth header: `X-Figma-Token: <token>`

## Endpoints

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

The CLI help and header describe 'generate' as a general single-shape creator, and the examples list multiple shape types such as polygon, star, heart, ellipse, frame, and text. However, the implementation parses the JSON and unconditionally calls rect(params), so a requested non-rectangle shape is silently converted into a rectangle.

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 sets lang="en", and all visible interface text is English-only, with no indication that users can choose another language or that English is required for a region-specific purpose. Under the stated policy, forcing a specific language without opt-in is a natural-language locale policy issue.

Content

No source excerpt is available for this finding.

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
82% confidence
Finding

This markdown file explicitly instructs use of an auth header containing a token, which is a sensitive credential. The document provides no accompanying warning about protecting the token, avoiding accidental sharing, or limiting exposure in logs/history.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.