Back to skill

Security audit

Figma Studio Free

Security checks for vulnerabilities and agentic risk

Overview

This Figma API template skill is mostly aligned with its purpose, but it needs Review because it advertises read-only free behavior while also documenting write-capable Figma comment posting.

Review before installing. Use it only for explicit Figma work, keep Figma tokens in a proper secret store or environment variables, require confirmation before any comment or other remote write, and fix the OAuth state handling and dependency pinning before using the templates in a real app.

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 (2)

T09 · Insecure Skill Coding Practices

Warning
Location
SKILL.md:130
Finding

Static OAuth State Enables Login CSRF and Session Misbinding

Content
View full analysis
dict: resp = requests.post('https://api.figma.com/v1/oauth/token', data={ 'client_id': CLIENT_ID, 'client_secret': CLIENT_SECRET, 'redirect_uri': REDIRECT_URI, 'code': auth_code, 'grant_type': 'authorization_code' }, timeout=30) resp.raise_for_status() return resp.json() ``` ### Technical Analysis The OAuth authorization URL uses the constant value `random_state_string` for the `state` parameter. The template does not generate a cryptographically random state value, associate it with the initiating user session, or demonstrate validation of the returned state before exchanging the authorization code. OAuth state is intended to bind an authorization response to the browser session that initiated the flow. A fixed, publicly known value provides no meaningful request correlation or CSRF protection. If an application follows this template, its callback may process an unsolicited authorization response and associate the resulting Figma identity with the wrong application session. The flagged token exchange request sends an authorization code and client secret to the official Figma HTTPS API. That transmission is necessary for the declared OAuth functionality and is not evidence of unrelated exfiltration. The vulnerability is the missing secure state lifecycle around the request. ### Attack Path 1. An attacker begins the Figma OAuth authorization flow using the target application's client identifier and ...[truncated 1491 chars]
Remediation
View remediation

T08 · Insecure Dependencies

Note
Location
SKILL.md:328
Finding

Unpinned Third-Party Dependency Installation

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
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • Behavioral ASTexec() Call, eval() Call, Dynamic Import
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
Findings (13)

Vague Triggers

High
Category
Not specified by scanner
Confidence
97% confidence
Finding

The activation condition is overly broad, covering generic design and creative activities rather than narrowly scoping to explicit Figma API tasks. Over-broad triggering increases the chance the skill is invoked in contexts where users did not intend external API access, credential use, or file/export side effects.

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 118)May include surrounding context.

md
| 认证方式 | 适用场景 | Token有效期 | 获取方式 |
|:-----|:-----|:-----|:-----|
| Personal Access Token | 个人开发 | 长期 | Figma设置页手动生成 |
| OAuth2 Access Token | 团队应用 | 短期(需刷新) | OAuth2授权码流程 |

**OAuth2授权码流程**:

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 119)May include surrounding context.

md
| 认证方式 | 适用场景 | Token有效期 | 获取方式 |
|:-----|:-----|:-----|:-----|
| Personal Access Token | 个人开发 | 长期 | Figma设置页手动生成 |
| OAuth2 Access Token | 团队应用 | 短期(需刷新) | OAuth2授权码流程 |

**OAuth2授权码流程**:

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 · SKILL.md (reported line 59)May include surrounding context.

md
# ...
# 1. 从环境变量读取OAuth Token(安全红线:禁止硬编码)
FIGMA_TOKEN = os.environ.get('FIGMA_ACCESS_TOKEN', '')
FIGMA_BASE = 'https://api.figma.com/v1'
# ...
# 2. 读取文件JSON
headers = {'X-Figma-Token': FIGMA_TOKEN}

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 · SKILL.md (reported line 142)May include surrounding context.

md
# ...
# 1. 从环境变量读取OAuth Token(安全红线:禁止硬编码)
FIGMA_TOKEN = os.environ.get('FIGMA_ACCESS_TOKEN', '')
FIGMA_BASE = 'https://api.figma.com/v1'
# ...
# 2. 读取文件JSON
headers = {'X-Figma-Token': FIGMA_TOKEN}

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 · SKILL.md (reported line 154)May include surrounding context.

md
# ...
# 1. 从环境变量读取OAuth Token(安全红线:禁止硬编码)
FIGMA_TOKEN = os.environ.get('FIGMA_ACCESS_TOKEN', '')
FIGMA_BASE = 'https://api.figma.com/v1'
# ...
# 2. 读取文件JSON
headers = {'X-Figma-Token': FIGMA_TOKEN}

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 · SKILL.md (reported line 142)May include surrounding context.

md
# ...
# 2. 用授权码换Token(callback中执行)
def exchange_token(auth_code: str) -> dict:
    resp = requests.post('https://api.figma.com/v1/oauth/token', data={
        'client_id': CLIENT_ID,
        'client_secret': CLIENT_SECRET,
        'redirect_uri': REDIRECT_URI,

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 · SKILL.md (reported line 154)May include surrounding context.

md
# ...
# 2. 用授权码换Token(callback中执行)
def exchange_token(auth_code: str) -> dict:
    resp = requests.post('https://api.figma.com/v1/oauth/token', data={
        'client_id': CLIENT_ID,
        'client_secret': CLIENT_SECRET,
        'redirect_uri': REDIRECT_URI,

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The skill claims the free edition is read-focused and later even describes it as offering read-only capabilities, yet it includes a concrete post_comment implementation that performs a remote write to Figma. This mismatch can cause an agent or user to authorize the skill under a lower-risk assumption, leading to unintended modification of third-party design assets.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
81% confidence
Finding

Posting comments transmits user-provided content to a remote third-party service and modifies external state. In this skill, the danger is increased by contradictory claims that the free edition is read-only, which can lead to remote writes occurring under misleading assumptions about the skill's behavior.

Content

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

md
payload = {'message': message}
    if node_id:
        payload['client_meta'] = {'node_id': node_id, 'node_offset': {'x': x, 'y': y}}
    resp = requests.post(f'{FIGMA_BASE}/files/{file_key}/comments', 
                         headers={**headers, 'Content-Type': 'application/json'},
                         json=payload, timeout=30)
    resp.raise_for_status()

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The skill describes automatic image export and local download behavior without a clear warning that files will be written to local storage. Undisclosed filesystem side effects can surprise users, overwrite files, or violate execution-environment expectations, especially in agentic workflows with write and exec enabled.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

The FAQ states the free edition provides only read-only functions, but earlier sections document comment posting, which modifies remote Figma files. This inconsistent safety signaling can mislead downstream agents, reviewers, or users into permitting a skill that has broader side effects than advertised.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
87% confidence
Finding

The license section explicitly lists "完全中文化表达" as part of the skill's redesign, and the document is written to enforce a Chinese-language presentation without offering any language choice. This can violate language or locale policy where users should be able to opt into a preferred language rather than having one forced by the skill.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.