Disclaimer: This content was generated using AI. While we strive for accuracy, please verify critical information with official sources.
Sources: National Vulnerability Database, CISA KEV, Exploit-DB
CVE-2026-105696 Overview
Penpot, an open-source design and prototyping platform, contains a missing authorization flaw [CWE-862] in its get-page and get-file-fragment Remote Procedure Call (RPC) handlers. Versions prior to 2.18.0 accept a share-link permission object granting blanket read access without verifying that the caller-supplied page-id belongs to the link's authorized pages set. An authenticated attacker holding a valid share link to one page can retrieve the full shape and design data of other pages in the same file when their identifiers are known. The related get-file-fragment RPC exhibits the same scope-check omission for file fragments. Penpot fixed the issue in version 2.18.0.
Critical Impact
Authenticated holders of a limited share link can read design data for non-shared pages in the same Penpot file, exposing confidential project content.
Affected Products
- Penpot versions prior to 2.18.0
- get-page RPC command in backend/src/app/rpc/commands/files.clj
- get-file-fragment RPC command in backend/src/app/rpc/commands/files.clj
Discovery Timeline
- 2026-10-05 - CVE-2026-105696 published to the National Vulnerability Database (NVD)
- 2026-10-06 - Last updated in NVD database
Technical Details for CVE-2026-105696
Vulnerability Analysis
Penpot share links allow a file owner to expose a specific subset of pages for external viewing. The get-page RPC command is marked as requiring authentication, so Penpot treats it as a privileged read path. However, when the caller presents a share-link permission object, the handler trusts the object's read scope and services whatever page-id the client supplies. The handler does not intersect the requested page-id with the pages explicitly whitelisted in the share link.
An attacker who possesses a legitimate share link to one page in a file, plus their own authenticated Penpot session, can enumerate or guess sibling page-id values and request those pages through get-page. The server returns the complete shape, layer, and design payload. The get-file-fragment RPC exhibits parallel behavior: share-link callers receive fragments without any check that the fragment belongs to an authorized page.
Root Cause
The root cause is a missing authorization check that constrains share-link callers to the link's authorized pages set. The permissions object was treated as a sufficient capability for file-level reads instead of being scoped to specific page identifiers. This is a classic broken access control pattern [CWE-862] where the resource identifier supplied by the client is not validated against the caller's actual grant.
Attack Vector
Exploitation requires network access to a Penpot instance, an authenticated attacker account, and a valid share link to any page within the target file. The attacker also needs the target page-id or fragment-id, which can be obtained through prior access, enumeration of UUID patterns in referenced resources, or leakage via collaborator channels. No user interaction from the victim is required.
;; Patch excerpt from backend/src/app/rpc/commands/files.clj
;; Enforces that share-link callers cannot reach get-file-fragment
[cfg {:keys [::rpc/profile-id file-id fragment-id share-id]}]
(db/run! cfg (fn [cfg]
(let [perms (perms/get-file-read-permissions cfg profile-id file-id share-id)]
(when (= :share-link (:type perms))
(ex/raise :type :not-found
:code :object-not-found
:hint "object not found"))
(check-read-permissions! perms)
(-> (get-file-fragment cfg file-id fragment-id)
(rph/with-http-cache long-cache-duration))))))
Source: Penpot commit 52573be
Detect Identity Attacks the Moment Authentication Fails
Singularity™ Identity surfaces credential misuse, lateral movement, and privilege escalation in real time, so you can contain the breach before it spreads.
Stop Identity AttacksDetection Methods for CVE-2026-105696
Indicators of Compromise
- Repeated get-page RPC calls from a single authenticated session targeting multiple page-id values within the same file-id.
- get-file-fragment requests originating from sessions whose permission type resolves to share-link.
- Access patterns where the requested page-id does not match any identifier in the share link's authorized pages set.
Detection Strategies
- Correlate Penpot application logs with session identifiers to flag share-link sessions issuing RPCs for page-id values outside the link's declared scope.
- Baseline typical share-link viewer behavior (single page, bounded fragment count) and alert on deviations.
- Review audit records for enumeration bursts against the get-page and get-file-fragment endpoints.
Monitoring Recommendations
- Forward Penpot backend RPC logs to a centralized log platform and retain profile-id, share-id, file-id, and page-id fields.
- Alert on HTTP 200 responses from get-file-fragment where the caller's permission type is share-link after upgrading, as the patch should return object-not-found.
- Monitor outbound bandwidth from the Penpot backend for anomalous payload sizes tied to share-link sessions.
How to Mitigate CVE-2026-105696
Immediate Actions Required
- Upgrade all Penpot instances to version 2.18.0 or later, which enforces share-link page scope in both affected RPCs.
- Rotate or revoke existing share links for files containing sensitive pages that may have been exposed to share-link holders.
- Audit recent get-page and get-file-fragment activity to identify potential cross-page access by share-link callers.
Patch Information
The fix is delivered in Penpot 2.18.0 via commit 52573be07472987703b2ce715c4c10919f4e153e. The patch rejects get-file-fragment requests from share-link callers with :object-not-found and constrains get-page to the share link's authorized pages set. See the Penpot 2.18.0 release notes and the GHSA-x9xg-qphx-8grr advisory for full details.
Workarounds
- Disable share links for files containing confidential or non-public pages until the upgrade is applied.
- Restrict Penpot account registration to trusted users, since exploitation requires an authenticated attacker session.
- Place the Penpot backend behind a reverse proxy that rate-limits get-page and get-file-fragment RPC calls to curb enumeration.
# Verify the running Penpot backend version after upgrade
docker exec -it penpot-backend sh -c 'cat /opt/penpot/backend/version.txt'
# Expected output should be 2.18.0 or later
Disclaimer: This content was generated using AI. While we strive for accuracy, please verify critical information with official sources.
Sources: National Vulnerability Database, CISA KEV, Exploit-DB

