{"id":66260,"date":"2026-06-26T12:42:47","date_gmt":"2026-06-26T12:42:47","guid":{"rendered":"https:\/\/zero.redgem.net\/?p=66260"},"modified":"2026-06-26T12:42:47","modified_gmt":"2026-06-26T12:42:47","slug":"penpot-server-side-request-forgery","status":"publish","type":"post","link":"https:\/\/zero.redgem.net\/?p=66260","title":{"rendered":"\ud83d\udcc4 Penpot Server-Side Request Forgery_PACKETSTORM:224373"},"content":{"rendered":"<p>{&#8220;lastseen&#8221;:&#8221;2026-06-26T17:26:01&#8243;,&#8221;description&#8221;:&#8221;Penpot&#8217;s remote image import let an authenticated file editor turn a normal media convenience feature into backend-origin server-side request forgery because attacker-controlled URLs crossed into a redirect-following server fetch path without&#8230;&#8221;,&#8221;published&#8221;:&#8221;2026-06-26T00:00:00&#8243;,&#8221;modified&#8221;:&#8221;2026-06-26T00:00:00&#8243;,&#8221;type&#8221;:&#8221;packetstorm&#8221;,&#8221;title&#8221;:&#8221;\ud83d\udcc4 Penpot Server-Side Request Forgery&#8221;,&#8221;source&#8221;:&#8221;&#8221;,&#8221;references&#8221;:&#8221;&#8221;,&#8221;id&#8221;:&#8221;PACKETSTORM:224373&#8243;,&#8221;bulletinFamily&#8221;:&#8221;exploit&#8221;,&#8221;cwe&#8221;:null,&#8221;cvelist&#8221;:[&#8220;CVE-2026-45806&#8243;],&#8221;sourceData&#8221;:&#8221;# CVE-2026-45806\\n    Penpot&#8217;s remote image import let an authenticated file editor turn a normal media convenience feature into backend-origin SSRF because attacker-controlled URLs crossed into a redirect-following server fetch path without destination filtering.\\n    ## Intro\\n    \\n    I found this issue while reviewing **Penpot**, the open-source design and code collaboration platform, with a very specific question in mind:\\n    \\n    **What happens when a collaborative design tool lets one user hand the backend a remote image URL to fetch?**\\n    \\n    In this case, that question led to a real bug.\\n    \\n    Penpot&#8217;s remote image import flow accepted a user-controlled URL and caused the backend to fetch it from the server network context without enforcing destination restrictions for loopback or private-network targets. The shared HTTP client also followed redirects automatically.\\n    \\n    That turned a normal media convenience feature into an authenticated backend-origin SSRF primitive and ultimately became **CVE-2026-45806**.\\n    \\n    **Penpot:** [Penpot on GitHub](https:\/\/github.com\/penpot\/penpot)  \\n    **CVE:** CVE-2026-45806  \\n    **CVSS:** `CVSS:3.1\/AV:N\/AC:L\/PR:L\/UI:N\/S:C\/C:H\/I:N\/A:N`\\n    \\n    This affected **Penpot**. On its official site and media kit, Penpot presents itself as having a **+1M growing user base** and says that **tens of thousands of organizations** use it, including **Blender**, **Mozilla**, **Fedora**, **NTT Data**, **MIT**, **Soci\u00e9t\u00e9 G\u00e9n\u00e9rale**, **Cisco**, **Fujitsu**, **Indra**, and **ByteDance**.\\n    \\n    \\u003cimg width=\\&#8221;840\\&#8221; height=\\&#8221;560\\&#8221; alt=\\&#8221;photo0\\&#8221; src=\\&#8221;https:\/\/github.com\/user-attachments\/assets\/57e14d6a-a6f1-41ba-982e-c87ac90a2a26\\&#8221; \/\\u003e\\n    \\n    &#8212;\\n    \\n    ## Attack Chain\\n    \\n    `authenticated file editor -\\u003e attacker-controlled remote image URL -\\u003e create-file-media-object-from-url -\\u003e backend download-image fetch with redirects enabled -\\u003e final request lands on internal-only image endpoint -\\u003e backend-origin SSRF \/ internal reachability`\\n    \\n    &#8212;\\n    \\n    ## What Penpot Does\\n    \\n    **Penpot** is an open-source design and code collaboration platform.\\n    \\n    It handles things like:\\n    &#8211; collaborative file editing\\n    &#8211; team and project workflows\\n    &#8211; uploaded media and assets\\n    &#8211; rendering and preview paths\\n    &#8211; browser-based design operations backed by server-side processing\\n    \\n    That means its media import path sits on a real trust boundary.\\n    \\n    The important question here was not whether Penpot supports importing remote images.\\n    \\n    The real question was:\\n    \\n    **Does Penpot restrict where the backend is allowed to connect when a user imports a remote image?**\\n    \\n    In this case, it did not.\\n    \\n    &#8212;\\n    \\n    ## Why This Bug Was Worth Looking At\\n    \\n    A lot of people underestimate remote import features.\\n    \\n    That is a mistake.\\n    \\n    The moment an application:\\n    &#8211; accepts an attacker-controlled URL,\\n    &#8211; makes the request from the backend,\\n    &#8211; and turns that request into a normal product workflow,\\n    \\n    it creates a real outbound trust boundary.\\n    \\n    That was the issue here.\\n    \\n    This bug was not in image rendering.\\n    It was not in file storage.\\n    It was not in ordinary permission checks for editing a file.\\n    \\n    It was a classic **server-side trust failure**:\\n    &#8211; an attacker-controlled URL entered the system,\\n    &#8211; the backend fetched it directly,\\n    &#8211; redirects were allowed,\\n    &#8211; and no destination controls were visible in the reviewed path.\\n    \\n    That is enough to create a real vulnerability.\\n    \\n    &#8212;\\n    \\n    ## The Boundary I Focused On\\n    \\n    I did not approach Penpot by blindly fuzzing random RPC methods or looking for crashes first.\\n    \\n    The stronger approach was to identify the most promising security boundary.\\n    \\n    For Penpot, that was **remote media import**.\\n    \\n    Why?\\n    \\n    Because this feature combines:\\n    &#8211; attacker-controlled URL input\\n    &#8211; backend-origin outbound requests\\n    &#8211; content validation that happens only after the request is made\\n    &#8211; a design workflow where successful fetches are treated as normal media operations\\n    \\n    That was the right boundary to inspect.\\n    \\n    And it was exactly where the bug lived.\\n    \\n    &#8212;\\n    \\n    ## Root Cause\\n    \\n    The bug reduces to a small trust chain.\\n    \\n    In the frontend:\\n    \\n    &#8220;`clojure\\n    (defn upload-media-url\\n      [name file-id url]\\n      (rp\/cmd!\\n       :create-file-media-object-from-url\\n       {:name name\\n        :file-id file-id\\n        :url url\\n        :is-local true}))\\n    &#8220;`\\n    \\n    the user-controlled `url` is sent directly into the RPC call.\\n    \\n    Then in the backend:\\n    \\n    &#8220;`clojure\\n    (sv\/defmethod ::create-file-media-object-from-url\\n      &#8230;\\n      [{:keys [::db\/pool] :as cfg} {:keys [::rpc\/profile-id file-id] :as params}]\\n      (files\/check-edition-permissions! pool profile-id file-id)\\n      &#8230;\\n      (let [_    (files\/get-minimal-file cfg file-id)\\n            mobj (create-file-media-object-from-url cfg (assoc params :profile-id profile-id))])\\n    &#8220;`\\n    \\n    and:\\n    \\n    &#8220;`clojure\\n    (defn- create-file-media-object-from-url\\n      [cfg {:keys [url name] :as params}]\\n      (let [content (media\/download-image cfg url)\\n    &#8220;`\\n    \\n    the backend checks that the caller can edit the target file, then passes the attacker-controlled URL into `media\/download-image`.\\n    \\n    The fetch implementation is here:\\n    \\n    &#8220;`clojure\\n    (defn download-image\\n      \\&#8221;Download an image from the provided URI and return the media input object\\&#8221;\\n      [{:keys [::http\/client]} uri]\\n      &#8230;\\n      (http\/req! client\\n                 {:method :get :uri uri}\\n                 {:response-type :input-stream})\\n    &#8220;`\\n    \\n    And the shared HTTP client is configured as:\\n    \\n    &#8220;`clojure\\n    (http\/build-client {:connect-timeout 30000\\n                        :follow-redirects :always}))\\n    &#8220;`\\n    \\n    That is the whole vulnerability:\\n    \\n    &#8211; attacker controls the URL\\n    &#8211; backend performs the request\\n    &#8211; redirects are followed automatically\\n    &#8211; no destination filtering is applied before the request is made\\n    \\n    ### Why this is exploitable\\n    \\n    Because the attacker only needs:\\n    &#8211; a valid Penpot account\\n    &#8211; edit permission on one file\\n    &#8211; a target that returns accepted image content\\n    \\n    The attack chain is straightforward:\\n    \\n    &#8211; attacker supplies a URL\\n    &#8211; Penpot fetches it from the backend\\n    &#8211; the first hop can be public or apparently harmless\\n    &#8211; the redirect target can be internal\\n    &#8211; if the final response looks like an allowed image, the import completes\\n    \\n    That is the whole bug.\\n    \\n    &#8212;\\n    \\n    ## What Makes This a Security Issue, Not Just Normal Remote Import Behavior\\n    \\n    The important distinction is **where the request happens**.\\n    \\n    The question is not:\\n    \\n    \\u003e \\&#8221;Can Penpot import images from URLs?\\&#8221;\\n    \\n    The real question is:\\n    \\n    \\u003e \\&#8221;Can an authenticated user make the Penpot backend connect to internal destinations that the user should not be able to reach through the application?\\&#8221;\\n    \\n    In this case, the answer was yes.\\n    \\n    That matters because there is a real difference between:\\n    &#8211; a browser fetching a user-supplied URL, and\\n    &#8211; the backend fetching that URL from the server network position\\n    \\n    Image validation does not remove that difference.\\n    \\n    It narrows some direct exfiltration cases, but it does not remove the SSRF condition or the network boundary break.\\n    \\n    &#8212;\\n    \\n    ## PoC\\n    \\n    I validated this issue with a controlled local proof tied directly to the reviewed Penpot code path.\\n    \\n    The goal was not to hit third-party infrastructure.\\n    The goal was to prove the exact security property:\\n    \\n    &#8211; backend-style request execution\\n    &#8211; redirect following\\n    &#8211; successful pivot to an internal-only endpoint\\n    &#8211; completion under the same image-oriented constraints Penpot enforces\\n    \\n    I built a self-contained Java validator that mirrored the relevant behavior:\\n    &#8211; backend-side GET to a caller-controlled URI\\n    &#8211; automatic redirect following\\n    &#8211; image acceptance checks based on `content-type` and `content-length`\\n    \\n    I validated two cases.\\n    \\n    ### Case 1: direct internal fetch\\n    \\n    The validator requested:\\n    \\n    &#8220;`text\\n    http:\/\/127.0.0.1:7790\/internal.png\\n    &#8220;`\\n    \\n    Observed result:\\n    \\n    &#8211; requested URI: `http:\/\/127.0.0.1:7790\/internal.png`\\n    &#8211; final URI: `http:\/\/127.0.0.1:7790\/internal.png`\\n    &#8211; status: `200`\\n    &#8211; content type: `image\/png`\\n    &#8211; artifact written successfully\\n    \\n    That proved the import-style fetch logic accepted an internal-only image endpoint directly.\\n    \\n    &#8212;\\n    \\n    ### Case 2: redirect-assisted internal fetch\\n    \\n    The validator then requested:\\n    \\n    &#8220;`text\\n    http:\/\/localhost:7791\/redirect-to-internal\\n    &#8220;`\\n    \\n    That endpoint returned an HTTP redirect to:\\n    \\n    &#8220;`text\\n    http:\/\/127.0.0.1:7790\/internal.png\\n    &#8220;`\\n    \\n    Observed result:\\n    \\n    &#8211; requested URI: `http:\/\/localhost:7791\/redirect-to-internal`\\n    &#8211; final URI: `http:\/\/127.0.0.1:7790\/internal.png`\\n    &#8211; status: `200`\\n    &#8211; content type: `image\/png`\\n    &#8211; artifact written successfully\\n    \\n    The internal-only listener logged the redirected request.\\n    \\n    That proved the more important claim:\\n    &#8211; the initial attacker-controlled URL can differ from the final destination\\n    &#8211; redirects are followed automatically\\n    &#8211; the final backend fetch can land on an internal-only endpoint and still succeed\\n    \\n    &#8212;\\n    \\n    ## Why the PoC Was Built This Way\\n    \\n    The payload here was intentionally simple:\\n    \\n    &#8211; tiny valid PNG response\\n    &#8211; explicit redirect target\\n    &#8211; internal-only listener bound to loopback\\n    \\n    That mattered because Penpot does not just fetch arbitrary bytes and stop.\\n    It performs media-oriented validation after the request.\\n    \\n    So the right proof was not:\\n    \\u003e \\&#8221;the backend can try to connect somewhere\\&#8221;\\n    \\n    The stronger proof was:\\n    \\u003e \\&#8221;the backend can be made to connect somewhere internal and complete the request successfully under the same image-like constraints the feature expects\\&#8221;\\n    \\n    That is exactly what the validation demonstrated.\\n    \\n    &#8212;\\n    \\n    ## Why This Was Still Worth Reporting\\n    \\n    A common reaction to SSRF bugs like this is:\\n    \\n    \\u003e \\&#8221;the target still has to return an image\\&#8221;\\n    \\n    That observation is true but incomplete.\\n    \\n    It does not remove the vulnerability.\\n    \\n    It just tells you which internal targets are most directly useful.\\n    \\n    This issue still enables:\\n    &#8211; backend-origin internal reachability\\n    &#8211; redirect-assisted pivoting into loopback or private-network space\\n    &#8211; interaction with internal image-returning endpoints\\n    &#8211; network trust abuse from the Penpot server position\\n    \\n    That is still a real security boundary break.\\n    \\n    Especially in self-hosted environments, internal services often exist specifically behind that boundary.\\n    \\n    &#8212;\\n    \\n    ## Severity and Classification\\n    \\n    This issue was ultimately assigned a **High** severity CVSS:\\n    \\n    &#8211; **CWE-918**: Server-Side Request Forgery (SSRF)\\n    &#8211; **CVSS:**\\n    &#8220;`text\\n    CVSS:3.1\/AV:N\/AC:L\/PR:L\/UI:N\/S:C\/C:H\/I:N\/A:N\\n    &#8220;`\\n    \\n    That classification makes sense.\\n    \\n    The claim is not that an unauthenticated attacker can instantly compromise every Penpot deployment from nothing.\\n    \\n    The claim is that any normal authenticated file editor can turn Penpot into a backend request primitive against internal destinations, including redirect-assisted access to loopback and private-network targets.\\n    \\n    There was some severity discussion during disclosure, largely around:\\n    &#8211; internal services requiring authentication\\n    &#8211; the fetched content needing to pass image validation\\n    &#8211; exploitation depending on internal infrastructure knowledge\\n    \\n    Those are fair constraints to discuss.\\n    \\n    But they do not remove the core issue:\\n    &#8211; attacker-controlled URL\\n    &#8211; backend-side request origin\\n    &#8211; redirect following\\n    &#8211; no outbound destination policy in the reviewed path\\n    \\n    That is a real and defensible SSRF vulnerability.\\n    \\n    &#8212;\\n    \\n    ## Fix Analysis\\n    \\n    The important fix here is not stricter MIME handling.\\n    \\n    The real fix is **outbound destination policy**.\\n    \\n    A correct remediation for this class of bug needs to:\\n    \\n    1. allow only `http` and `https`\\n    2. resolve and reject loopback, RFC1918\/private, link-local, multicast, unspecified, and metadata-service ranges before connect\\n    3. re-check every redirect hop against the same policy\\n    4. consider disabling redirects for this feature or limiting them tightly\\n    5. add regression coverage for:\\n       &#8211; `localhost`\\n       &#8211; direct private targets\\n       &#8211; redirect-to-private cases\\n       &#8211; DNS rebinding style scenarios\\n    \\n    That is the right fix direction because this was not an image parsing bug.\\n    It was a network trust-boundary bug.\\n    \\n    &#8212;\\n    \\n    ## Disclosure\\n    \\n    This issue was reported privately through GitHub&#8217;s security reporting flow.\\n    \\n    The report included:\\n    &#8211; source-level root cause analysis\\n    &#8211; a strong local validation model\\n    &#8211; redirect-based proof of internal pivoting\\n    &#8211; artifact and log evidence\\n    &#8211; remediation guidance\\n    \\n    The maintainers confirmed the issue and began working on a resolution.\\n    \\n    The issue was later assigned:\\n    \\n    **CVE-2026-45806**\\n    \\n    &#8212;\\n    \\n    ## What This Bug Actually Teaches\\n    \\n    The key lesson here is simple:\\n    \\n    \\u003e remote media import is an outbound trust boundary, not just a convenience feature\\n    \\n    A lot of developers think in terms of:\\n    &#8211; URL accepted\\n    &#8211; request succeeds\\n    &#8211; image passes validation\\n    &#8211; media gets stored\\n    \\n    Those are implementation details.\\n    \\n    The real security question is:\\n    \\n    **where is the backend allowed to connect on behalf of a user?**\\n    \\n    If that question is not answered explicitly, features like remote import become SSRF surfaces by default.\\n    \\n    This bug also reinforces something important about SSRF review:\\n    \\n    &#8211; redirects matter\\n    &#8211; content validation is not a substitute for network policy\\n    &#8211; authenticated SSRF is still serious when it crosses into internal trust boundaries\\n    \\n    That is the real takeaway.\\n    \\n    &#8212;\\n    \\n    ## Key Points\\n    \\n    &#8211; remote image import is a real backend trust boundary\\n    &#8211; authenticated features can still expose serious SSRF\\n    &#8211; redirect following makes outbound fetch paths much more dangerous\\n    &#8211; image-only validation narrows some abuse paths but does not remove SSRF\\n    &#8211; proving a successful internal redirect path is stronger than just showing a failed connection attempt\\n    &#8211; the right fix is outbound destination policy, not cosmetic response validation\\n    \\n    &#8212;\\n    \\n    ## Final Words\\n    \\n    This vulnerability was not about a flashy payload.\\n    \\n    It was about asking the right trust-boundary question.\\n    \\n    Penpot let an authenticated file editor provide a remote image URL, and the backend trusted that URL farther than it should have.\\n    The redirect handling did the rest.\\n    \\n    That is why this became **CVE-2026-45806**.&#8221;,&#8221;sourceHref&#8221;:&#8221;https:\/\/packetstorm.news\/download\/224373&#8243;,&#8221;cvss&#8221;:{&#8220;score&#8221;:0,&#8221;severity&#8221;:&#8221;NONE&#8221;,&#8221;vector&#8221;:&#8221;NONE&#8221;,&#8221;version&#8221;:&#8221;NONE&#8221;},&#8221;cvss2&#8243;:{},&#8221;cvss3&#8243;:{&#8220;version&#8221;:&#8221;&#8221;,&#8221;vectorString&#8221;:&#8221;&#8221;,&#8221;baseScore&#8221;:0,&#8221;baseSeverity&#8221;:&#8221;&#8221;,&#8221;attackVector&#8221;:&#8221;&#8221;,&#8221;attackComplexity&#8221;:&#8221;&#8221;,&#8221;privilegesRequired&#8221;:&#8221;&#8221;,&#8221;userInteraction&#8221;:&#8221;&#8221;,&#8221;scope&#8221;:&#8221;&#8221;,&#8221;confidentialityImpact&#8221;:&#8221;&#8221;,&#8221;integrityImpact&#8221;:&#8221;&#8221;,&#8221;availabilityImpact&#8221;:&#8221;&#8221;,&#8221;cvssV3&#8243;:{&#8220;version&#8221;:&#8221;&#8221;,&#8221;vectorString&#8221;:&#8221;&#8221;,&#8221;baseScore&#8221;:0,&#8221;baseSeverity&#8221;:&#8221;&#8221;,&#8221;attackVector&#8221;:&#8221;&#8221;,&#8221;attackComplexity&#8221;:&#8221;&#8221;,&#8221;privilegesRequired&#8221;:&#8221;&#8221;,&#8221;userInteraction&#8221;:&#8221;&#8221;,&#8221;scope&#8221;:&#8221;&#8221;,&#8221;confidentialityImpact&#8221;:&#8221;&#8221;,&#8221;integrityImpact&#8221;:&#8221;&#8221;,&#8221;availabilityImpact&#8221;:&#8221;&#8221;}},&#8221;href&#8221;:&#8221;https:\/\/packetstorm.news\/files\/id\/224373\/&#8221;,&#8221;category_name&#8221;:&#8221;Exploit&#8221;,&#8221;post_link&#8221;:&#8221;&#8221;,&#8221;product&#8221;:&#8221;&#8221;,&#8221;version&#8221;:&#8221;&#8221;,&#8221;vendor&#8221;:&#8221;&#8221;,&#8221;ai_description&#8221;:&#8221;&#8221;,&#8221;ai_severity&#8221;:&#8221;&#8221;,&#8221;ai_vendor&#8221;:&#8221;&#8221;,&#8221;ai_product&#8221;:&#8221;&#8221;,&#8221;ai_version&#8221;:&#8221;&#8221;,&#8221;ai_score&#8221;:0}<\/p>\n","protected":false},"excerpt":{"rendered":"<p>{&#8220;lastseen&#8221;:&#8221;2026-06-26T17:26:01&#8243;,&#8221;description&#8221;:&#8221;Penpot&#8217;s remote image import let an authenticated file editor turn a normal media convenience feature into backend-origin server-side request forgery because attacker-controlled URLs crossed into&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3],"tags":[6,8,12,13,33,53,7,11,5],"class_list":["post-66260","post","type-post","status-publish","format-standard","hentry","category-category_exploit","tag-cve","tag-cvss","tag-exploit","tag-news","tag-none","tag-packetstorm","tag-security","tag-tapic","tag-vulnerability"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>\ud83d\udcc4 Penpot Server-Side Request Forgery_PACKETSTORM:224373 - zero redgem<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/zero.redgem.net\/?p=66260\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\ud83d\udcc4 Penpot Server-Side Request Forgery_PACKETSTORM:224373 - zero redgem\" \/>\n<meta property=\"og:description\" content=\"{&#8220;lastseen&#8221;:&#8221;2026-06-26T17:26:01&#8243;,&#8221;description&#8221;:&#8221;Penpot&#8217;s remote image import let an authenticated file editor turn a normal media convenience feature into backend-origin server-side request forgery because attacker-controlled URLs crossed into...\" \/>\n<meta property=\"og:url\" content=\"https:\/\/zero.redgem.net\/?p=66260\" \/>\n<meta property=\"og:site_name\" content=\"zero redgem\" \/>\n<meta property=\"article:published_time\" content=\"2026-06-26T12:42:47+00:00\" \/>\n<meta name=\"author\" content=\"invoker\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"invoker\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"13 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=66260#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=66260\"},\"author\":{\"name\":\"invoker\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#\\\/schema\\\/person\\\/fbfeae8dfad117ac08a7621bee1a1dca\"},\"headline\":\"\ud83d\udcc4 Penpot Server-Side Request Forgery_PACKETSTORM:224373\",\"datePublished\":\"2026-06-26T12:42:47+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=66260\"},\"wordCount\":2586,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#organization\"},\"keywords\":[\"CVE\",\"CVSS\",\"exploit\",\"news\",\"NONE\",\"packetstorm\",\"Security\",\"tapic\",\"Vulnerability\"],\"articleSection\":[\"category_exploit\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/zero.redgem.net\\\/?p=66260#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=66260\",\"url\":\"https:\\\/\\\/zero.redgem.net\\\/?p=66260\",\"name\":\"\ud83d\udcc4 Penpot Server-Side Request Forgery_PACKETSTORM:224373 - zero redgem\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#website\"},\"datePublished\":\"2026-06-26T12:42:47+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=66260#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/zero.redgem.net\\\/?p=66260\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=66260#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/zero.redgem.net\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\ud83d\udcc4 Penpot Server-Side Request Forgery_PACKETSTORM:224373\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#website\",\"url\":\"https:\\\/\\\/zero.redgem.net\\\/\",\"name\":\"zero redgem\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/zero.redgem.net\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#organization\",\"name\":\"zero redgem\",\"url\":\"https:\\\/\\\/zero.redgem.net\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"\",\"contentUrl\":\"\",\"width\":191,\"height\":188,\"caption\":\"zero redgem\"},\"image\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#\\\/schema\\\/person\\\/fbfeae8dfad117ac08a7621bee1a1dca\",\"name\":\"invoker\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/f17c01d7338e6932bcde121cf83569393df3374625d25afd62677cfb528f2e3e?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/f17c01d7338e6932bcde121cf83569393df3374625d25afd62677cfb528f2e3e?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/f17c01d7338e6932bcde121cf83569393df3374625d25afd62677cfb528f2e3e?s=96&d=mm&r=g\",\"caption\":\"invoker\"},\"sameAs\":[\"https:\\\/\\\/zero.redgem.net\"],\"url\":\"https:\\\/\\\/zero.redgem.net\\\/?author=1\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"\ud83d\udcc4 Penpot Server-Side Request Forgery_PACKETSTORM:224373 - zero redgem","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/zero.redgem.net\/?p=66260","og_locale":"en_US","og_type":"article","og_title":"\ud83d\udcc4 Penpot Server-Side Request Forgery_PACKETSTORM:224373 - zero redgem","og_description":"{&#8220;lastseen&#8221;:&#8221;2026-06-26T17:26:01&#8243;,&#8221;description&#8221;:&#8221;Penpot&#8217;s remote image import let an authenticated file editor turn a normal media convenience feature into backend-origin server-side request forgery because attacker-controlled URLs crossed into...","og_url":"https:\/\/zero.redgem.net\/?p=66260","og_site_name":"zero redgem","article_published_time":"2026-06-26T12:42:47+00:00","author":"invoker","twitter_card":"summary_large_image","twitter_misc":{"Written by":"invoker","Est. reading time":"13 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/zero.redgem.net\/?p=66260#article","isPartOf":{"@id":"https:\/\/zero.redgem.net\/?p=66260"},"author":{"name":"invoker","@id":"https:\/\/zero.redgem.net\/#\/schema\/person\/fbfeae8dfad117ac08a7621bee1a1dca"},"headline":"\ud83d\udcc4 Penpot Server-Side Request Forgery_PACKETSTORM:224373","datePublished":"2026-06-26T12:42:47+00:00","mainEntityOfPage":{"@id":"https:\/\/zero.redgem.net\/?p=66260"},"wordCount":2586,"commentCount":0,"publisher":{"@id":"https:\/\/zero.redgem.net\/#organization"},"keywords":["CVE","CVSS","exploit","news","NONE","packetstorm","Security","tapic","Vulnerability"],"articleSection":["category_exploit"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/zero.redgem.net\/?p=66260#respond"]}]},{"@type":"WebPage","@id":"https:\/\/zero.redgem.net\/?p=66260","url":"https:\/\/zero.redgem.net\/?p=66260","name":"\ud83d\udcc4 Penpot Server-Side Request Forgery_PACKETSTORM:224373 - zero redgem","isPartOf":{"@id":"https:\/\/zero.redgem.net\/#website"},"datePublished":"2026-06-26T12:42:47+00:00","breadcrumb":{"@id":"https:\/\/zero.redgem.net\/?p=66260#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/zero.redgem.net\/?p=66260"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/zero.redgem.net\/?p=66260#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/zero.redgem.net\/"},{"@type":"ListItem","position":2,"name":"\ud83d\udcc4 Penpot Server-Side Request Forgery_PACKETSTORM:224373"}]},{"@type":"WebSite","@id":"https:\/\/zero.redgem.net\/#website","url":"https:\/\/zero.redgem.net\/","name":"zero redgem","description":"","publisher":{"@id":"https:\/\/zero.redgem.net\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/zero.redgem.net\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/zero.redgem.net\/#organization","name":"zero redgem","url":"https:\/\/zero.redgem.net\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/zero.redgem.net\/#\/schema\/logo\/image\/","url":"","contentUrl":"","width":191,"height":188,"caption":"zero redgem"},"image":{"@id":"https:\/\/zero.redgem.net\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/zero.redgem.net\/#\/schema\/person\/fbfeae8dfad117ac08a7621bee1a1dca","name":"invoker","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/f17c01d7338e6932bcde121cf83569393df3374625d25afd62677cfb528f2e3e?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/f17c01d7338e6932bcde121cf83569393df3374625d25afd62677cfb528f2e3e?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/f17c01d7338e6932bcde121cf83569393df3374625d25afd62677cfb528f2e3e?s=96&d=mm&r=g","caption":"invoker"},"sameAs":["https:\/\/zero.redgem.net"],"url":"https:\/\/zero.redgem.net\/?author=1"}]}},"_links":{"self":[{"href":"https:\/\/zero.redgem.net\/index.php?rest_route=\/wp\/v2\/posts\/66260","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/zero.redgem.net\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/zero.redgem.net\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/zero.redgem.net\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/zero.redgem.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=66260"}],"version-history":[{"count":0,"href":"https:\/\/zero.redgem.net\/index.php?rest_route=\/wp\/v2\/posts\/66260\/revisions"}],"wp:attachment":[{"href":"https:\/\/zero.redgem.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=66260"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/zero.redgem.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=66260"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/zero.redgem.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=66260"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}