Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessAuthenticate with file-edit permission
-
DeliveryUpload SVG with embedded script payload
-
ExploitPayload stored unsanitized, served as image/svg+xml
-
ExecutionVictim navigates to asset URL
-
PersistScript executes in Penpot origin
-
ImpactAccess 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. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – 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
Affected Packages
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
AV:N/AC:L/PR:L/UI:R/S:C/C:L/I:L/A:N
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.
Primary rating from Vendor (GitHub_M).
CVSS VectorVendor: GitHub_M
Lifecycle Timeline
1DescriptionCVE.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
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.
What every action level means
SSVC AssessmentENISA
Priority Score
Attack Technique
Cross-Site Scripting occurs when an application accepts untrusted data and sends it to a web browser without proper validation or encoding.
Penpot before version 2.13.2 contains a path traversal vulnerability in the font creation endpoint that allows authentic
Authenticated command injection in the Penpot SVG exporter prior to 2.18.0 allows a user with edit rights on a design fi
Account takeover in Penpot before 2.14.5 allows an authenticated registered user to hijack any non-blocked profile witho
Server-side request forgery in Penpot before 2.15.0 lets an authenticated file editor coerce the backend into fetching a
Missing authorization on Penpot's ::import-binfile RPC command allows any authenticated user to overwrite arbitrary file
Privilege escalation in Penpot before 2.18.0 lets a non-owner team administrator promote themselves to team owner by cre
Missing authorization checks in Penpot prior to 2.18.0 let a holder of a valid share link read design and shape data fro
Server-side request forgery in Penpot before 2.18.0 allows an authenticated user who controls a media-import URL, or an
Penpot versions prior to 2.18.0 leak the contents of other users' in-progress uploads because the backend assemble-chunk
Logout in Penpot versions prior to 2.18.0 clears the browser's auth-token cookie but leaves the matching server-side ses
Authenticated editors on a Penpot file (prior to version 2.18.0) can delete share links that were created by other users
Authenticated users of Penpot prior to 2.18.0 can exhaust server-side temporary storage by repeatedly re-uploading a val
EUVD-2026-92713
NVD
CVE.org
EPSS
Vulnrichment
GitHub
Exploit-DB