Skip to main content

Penpot EUVDEUVD-2026-92713

| CVE-2026-105694 MEDIUM
Cross-site Scripting (XSS) (CWE-79)
2026-10-05 GitHub_M
5.4
CVSS 3.1 · Vendor: GitHub_M
View

Attack ChainAIDerived

Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain

  1. Access
    Authenticate with file-edit permission
  2. Delivery
    Upload SVG with embedded script payload
  3. Exploit
    Payload stored unsanitized, served as image/svg+xml
  4. Execution
    Victim navigates to asset URL
  5. Persist
    Script executes in Penpot origin
  6. Impact
    Access data with victim's session authority

Vulnerability Assessment

Weakness
CWE
OWASP Top 10:2025
A05:2025 - Injection
ASVS 5.0
V1 - Encoding and Sanitization Output encoding, context-aware escaping
MITRE ATT&CK

2 techniques across 2 tactics: Initial Access, Execution

The technique list with ATT&CK links and the kill-chain view is part of the Basic plan and up.

Exploitation Conditions

Requires an authenticated account with file-edit permission on a Penpot file/team, so an attacker must already be a trusted collaborator or have compromised such an account - this limits exploitation to multi-user or externally-shared Penpot instances. The attacker must upload an SVG whose <script>, event-handler attributes, or <foreignObject> elements survive unsanitized storage and are served as image/svg+xml from the Penpot origin. Exploitation additionally depends on a victim navigating directly to the stored asset URL (UI:R), not merely viewing it in a sanitizing context. These conditions - required authenticated privilege and required victim navigation - meaningfully reduce real-world risk below what a raw network-vector CVSS might suggest; single-user or tightly-trusted deployments face little exposure.

Impact

This is a moderate-severity stored XSS (CWE-79) with a realistic but constrained risk profile. The provided CVSS 3.1 vector (AV:N/AC:L/PR:L/UI:R/S:C/C:L/I:L/A:N, base 5.4) tells a coherent story: network-reachable, low attack complexity, but it requires an authenticated attacker holding file-edit permission (PR:L) AND a victim who navigates to the malicious asset URL (UI:R). The scope change (S:C) is well-justified - attacker-controlled JavaScript executes in the Penpot origin under the victim's session authority, crossing the trust boundary from the uploaded object to the authenticated application context. Impact is capped at Low/Low for confidentiality and integrity (session-scoped requests and data access, not full account takeover or availability loss). No EPSS score, KEV listing, SSVC decision, or public exploit code was provided; the GitHub references are vendor security advisories, patch PRs, and the fix commit/release, not weaponized exploits. There is therefore no evidence of active exploitation or automatability - the signals are internally consistent (not conflicting), and this is best treated as a priority patch for Penpot operators who host untrusted or multi-user teams, rather than a mass-exploitation emergency. EPSS is absent, so exploitation probability cannot be quantified from the input.

Exploit ScenarioDerived

An authenticated user with file-edit rights on a shared Penpot team uploads an SVG containing a malicious <script> or event-handler payload, which the backend stores unsanitized and serves as image/svg+xml from the Penpot origin. When a co-worker opens or navigates directly to that asset URL, the attacker's JavaScript runs in the victim's authenticated Penpot session and issues API requests or reads data with the victim's authority. No public exploit code was identified, though the fix (serving non-public buckets with Content-Disposition: attachment) is documented in the patch PRs.

This Month Plan within 30 days. Why: MEDIUM severity (CVSS 4.0-6.9).
Patch available 0.2% exploitation probability (EPSS)

Get an e-mail when this CVE is exploited, patched or re-scored. Free account.

Alert me

AnalysisAIv1 – Oct 05, 2026

Stored cross-site scripting in Penpot before 2.18.0 allows an authenticated user holding file-edit permission to upload SVG media whose <script> blocks, event-handler attributes, and <foreignObject> elements are persisted without sanitization and later served as image/svg+xml from the Penpot origin; any victim who directly navigates to the stored asset URL executes attacker-controlled JavaScript in that origin and can issue requests and read data with the victim's Penpot session authority. Exploitation requires both a privileged authenticated account (PR:L, effectively a trusted collaborator or a compromised one) and victim navigation to the asset URL (UI:R), which confines realistic exposure to multi-user or externally shared Penpot instances rather than single-user deployments. No public exploit code was identified at time of analysis and the issue is not listed in CISA KEV; the vendor-released fix is version 2.18.0.

RemediationAI

Vendor-released patch: upgrade to Penpot 2.18.0 (https://github.com/penpot/penpot/releases/tag/2.18.0), which corresponds to the fix in commit c4dd04353fcf06c3e10a64e3d8e43945508ae98c delivered via PRs https://github.com/penpot/penpot/pull/10989 and https://github.com/penpot/penpot/pull/11044; consult the vendor advisories GHSA-xg6f-5v5x-g4w2 and GHSA-wrcr-m7p8-m2c4 for the full statement. Be aware that the upstream fix works by signing content-disposition: attachment into presigned URLs for non-public buckets, so it changes direct-navigation behavior for profile, tempfile, file-data, file-thumbnail, and file-change assets (users will download rather than preview them) while objects in public buckets such as file-media-object and file-object-thumbnail continue to be served inline - if your workflow requires inline SVG rendering from a public bucket, that path is not neutralized by the patch and should be paired with server-side SVG sanitization or rejection of active content at upload time. Until the upgrade is deployed, the most effective compensating controls are: restrict file-edit permission to genuinely trusted collaborators and audit/reduce external team sharing (this removes the PR:L precondition but does not help if a collaborator account is compromised); disable SVG uploads or run uploaded SVGs through a sanitizer that strips <script>, on* attributes, and <foreignObject> before storage (viable but breaks legitimate interactive SVG designs); and serve user-uploaded assets from a separate domain or origin distinct from the Penpot application, so any script that does execute cannot reach session-authenticated endpoints (technically the cleanest break of the same-origin chain, at the cost of reconfiguring storage/CDN and possibly affecting asset embedding). Adding a Content-Security-Policy with script-src 'none' on asset responses provides defense in depth but can interfere with legitimate Penpot preview features and should be tested before rollout.

Affected VersionsENISA

penpot < 2.18.0

Affected Packages

euvd penpot fix: 2.18.0

Source: OSV (Open Source Vulnerabilities)

Affects your stack

Affects 1 package in euvd

Checking this CVE against your own stacks and servers is part of the Basic plan and up.

Technical ContextAI · show details

The root cause is CWE-79 (Improper Neutralization of Input During Web Page Generation), specifically a stored/persistent XSS reachable through the asset-serving path of the Penpot design platform, which is implemented in Clojure on the backend. Penpot stores user-uploaded files in object storage buckets, and its objects handler returns a redirect to a presigned object-store URL for the requested asset ID; because the response Content-Type for SVG media resolves to image/svg+xml, a browser that navigates directly to that URL renders the document in the Penpot origin rather than treating it as inert data. SVG is an XML dialect that supports ECMAScript via <script> elements, inline event-handler attributes, and <foreignObject> embedding of HTML, so any of these constructs surviving storage unsanitized yields script execution in the context of the Penpot origin - and because the vulnerable path is served cross-origin-aware (S:C in the assessed vector), the compromise can also affect resources beyond the immediate page. The upstream fix (commit c4dd04353fcf06c3e10a64e3d8e43945508ae98c, developed through PRs 10989 and 11044) does not strip script from the SVG payload; instead it signs a content-disposition: attachment parameter into the presigned URL for objects in non-public buckets (profile, tempfile, file-data, file-thumbnail, file-change), forcing a download instead of inline rendering on direct navigation. Bypassed paths retain inline serving for public buckets such as file-media-object, file-object-thumbnail, team-font-variant, file-data-fragment, and organization, because those are consumed inline by the viewer and outgoing mail.

Know when Penpot gets its next vulnerability

  • Watch products and get an email when something new is published
  • Check this CVE against your own stack and servers
  • Exploit and PoC references, threat intelligence from 22 sources

No credit card · 7-day full trial

Severity by source

Vendor (GitHub_M) PRIMARY 5.4 MEDIUM
AV:N/AC:L/PR:L/UI:R/S:C/C:L/I:L/A:N
vuln.today AI 5.4 MEDIUM

Authenticated file-edit attacker (PR:L) and victim must navigate to the asset (UI:R); script runs in the Penpot origin across a trust boundary (S:C) with session-scoped read/write but no availability impact.

3.1 AV:N/AC:L/PR:L/UI:R/S:C/C:L/I:L/A:N
4.0 AV:N/AC:L/AT:N/PR:L/UI:A/VC:L/VI:L/VA:N/SC:L/SI:L/SA:N

Primary rating from Vendor (GitHub_M).

CVSS VectorVendor: GitHub_M

Attack Vector
Network
Attack Complexity
Low
Privileges Required
Low
User Interaction
Required
Scope
Changed
Confidentiality
Low
Integrity
Low
Availability
None

Lifecycle Timeline

1
Patch available
Oct 05, 2026 - 21:02 EUVD

DescriptionCVE.org

Penpot is an open-source design and prototyping platform. Prior to 2.18.0, authenticated users with file-edit permission can upload SVG media whose scripts, event-handler attributes, and foreignObject elements are stored without sanitization and served as image/svg+xml from the Penpot origin. A victim who navigates to the asset URL executes attacker-controlled JavaScript in that origin, allowing requests and data access with the victim's Penpot session authority. This issue is fixed in version 2.18.0.

Threat Intelligence Overview

EPSS Score
0.2%
Top 93% exploitable
Prevalence
Low
niche self-hosted open-source design tool, limited production footprint
Data Quality
5 sources
Confidence: Medium

How this decision was reached

The engine reads each signal below and applies a fixed list of rules from top to bottom. The first rule that matches sets the recommended action – like a statement, every line is shown.

SignalValue
Severity MEDIUM
CISA KEV No
Public POC No
EPSS 0.2%
Patch available Yes
Active threat No
Deciding rule
MEDIUM severity (CVSS 4.0-6.9)
What every action level means
Emergency Immediate action required. Criteria: CRITICAL + in CISA KEV (actively exploited) without patch, OR CRITICAL + EPSS > 30% without patch, OR CRITICAL + active threat signals without patch.
Act Now Prioritize within 24-48h. Criteria: in KEV with patch available, OR CRITICAL + public POC, OR HIGH + EPSS > 10%, OR CRITICAL + active threat, OR any CRITICAL severity.
This Week Schedule remediation this week. Criteria: HIGH severity (CVSS 7.0-8.9). Patch within normal change window.
This Month Plan within 30 days. Criteria: MEDIUM severity (CVSS 4.0-6.9), lower exploitation probability. Include in regular patch cycle.
Monitor Track and reassess. Criteria: LOW severity (CVSS 0.1-3.9), minimal exploitation risk. No immediate action needed.

SSVC AssessmentENISA

SSVC Decision· derived
Scheduled
Exploitation
Poc
System Exposure· derived
Open
Automatable
No
Human Impact· derived
Medium
Technical Impact
Partial

Priority Score

27
Low Medium High Critical
KEV: 0
EPSS: 0
CVSS: +27
PoC: 0
Weaponized: 0
Threat intel: 0
Gov advisory: 0

Attack Technique

Cross-Site Scripting occurs when an application accepts untrusted data and sends it to a web browser without proper validation or encoding.

More in Penpot

View all
CVE-2026-26202 HIGH POC
7.5 Feb 19

Penpot before version 2.13.2 contains a path traversal vulnerability in the font creation endpoint that allows authentic

CVE-2026-105691 CRITICAL
9.9 Oct 05

Authenticated command injection in the Penpot SVG exporter prior to 2.18.0 allows a user with edit rights on a design fi

CVE-2026-44986 CRITICAL
9.9 Jul 15

Account takeover in Penpot before 2.14.5 allows an authenticated registered user to hijack any non-blocked profile witho

CVE-2026-45806 HIGH
7.7 Jul 15

Server-side request forgery in Penpot before 2.15.0 lets an authenticated file editor coerce the backend into fetching a

CVE-2026-17613 HIGH
7.5 Aug 05

Missing authorization on Penpot's ::import-binfile RPC command allows any authenticated user to overwrite arbitrary file

CVE-2026-105688 MEDIUM
6.7 Oct 05

Privilege escalation in Penpot before 2.18.0 lets a non-owner team administrator promote themselves to team owner by cre

CVE-2026-105696 MEDIUM
6.5 Oct 05

Missing authorization checks in Penpot prior to 2.18.0 let a holder of a valid share link read design and shape data fro

CVE-2026-105689 MEDIUM
6.0 Oct 05

Server-side request forgery in Penpot before 2.18.0 allows an authenticated user who controls a media-import URL, or an

CVE-2026-105695 MEDIUM
5.9 Oct 05

Penpot versions prior to 2.18.0 leak the contents of other users' in-progress uploads because the backend assemble-chunk

CVE-2026-105690 MEDIUM
5.9 Oct 05

Logout in Penpot versions prior to 2.18.0 clears the browser's auth-token cookie but leaves the matching server-side ses

CVE-2026-105692 MEDIUM
5.4 Oct 05

Authenticated editors on a Penpot file (prior to version 2.18.0) can delete share links that were created by other users

CVE-2026-105686 MEDIUM
5.3 Oct 05

Authenticated users of Penpot prior to 2.18.0 can exhaust server-side temporary storage by repeatedly re-uploading a val

This site uses cookies essential for authentication and security. No tracking or analytics cookies are used. Privacy Policy