{"api_version":"1","generated_at":"2026-10-25T00:15:16+00:00","cve":"CVE-2026-115932","urls":{"html":"https://cve.report/CVE-2026-115932","api":"https://cve.report/api/cve/CVE-2026-115932.json","docs":"https://cve.report/api","cve_org":"https://www.cve.org/CVERecord?id=CVE-2026-115932","nvd":"https://nvd.nist.gov/vuln/detail/CVE-2026-115932"},"summary":{"title":"Path traversal in post media lets any registered user read server files","description":"When a post is published, Postiz treats a media path that is not a web address as a file on the server's disk, but it does not check that the file lies inside the upload directory. A registered user can store a crafted media path with a post, get it past the checks that normally restrict it, and have the publishing worker read an arbitrary file and send it as an attachment to a Discord server the user controls.\n\nThe same unconfined reads can be reached through two further routes. One tells the caller whether a file exists and can exhaust the backend's memory, the other delivers the file the same way as the main route. Self-registration is open by default, so the attacker needs no existing account.","state":"PUBLISHED","assigner":"postiz","published_at":"2026-10-24 13:16:37","updated_at":"2026-10-24 13:16:37"},"problem_types":["CWE-22","CWE-74","CWE-22 CWE-22","CWE-74 CWE-74"],"metrics":[{"version":"3.1","source":"4cdc9741-f887-419a-a2fd-acbbd2729276","type":"Secondary","score":"9.6","severity":"CRITICAL","vector":"CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:N","data":{"version":"3.1","vectorString":"CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:N","baseScore":9.6,"baseSeverity":"CRITICAL","attackVector":"NETWORK","attackComplexity":"LOW","privilegesRequired":"LOW","userInteraction":"NONE","scope":"CHANGED","confidentialityImpact":"HIGH","integrityImpact":"HIGH","availabilityImpact":"NONE"}},{"version":"3.1","source":"CNA","type":"CVSS","score":"9.6","severity":"CRITICAL","vector":"CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:N","data":{"baseScore":9.6,"baseSeverity":"CRITICAL","vectorString":"CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:N","version":"3.1"}}],"references":[{"url":"https://github.com/gitroomhq/postiz-app","name":"https://github.com/gitroomhq/postiz-app","refsource":"4cdc9741-f887-419a-a2fd-acbbd2729276","tags":[],"title":"","mime":"","httpstatus":"","archivestatus":"0"},{"url":"https://github.com/gitroomhq/postiz-app/releases/tag/v2.25.3","name":"https://github.com/gitroomhq/postiz-app/releases/tag/v2.25.3","refsource":"4cdc9741-f887-419a-a2fd-acbbd2729276","tags":[],"title":"","mime":"","httpstatus":"","archivestatus":"0"},{"url":"https://github.com/gitroomhq/postiz-app/commit/12db9bd2f428b628a62809669c3d76297e07750a","name":"https://github.com/gitroomhq/postiz-app/commit/12db9bd2f428b628a62809669c3d76297e07750a","refsource":"4cdc9741-f887-419a-a2fd-acbbd2729276","tags":[],"title":"","mime":"","httpstatus":"","archivestatus":"0"},{"url":"https://gadvisory.org/advisories/PSA-2026-E9AHFV","name":"https://gadvisory.org/advisories/PSA-2026-E9AHFV","refsource":"4cdc9741-f887-419a-a2fd-acbbd2729276","tags":[],"title":"","mime":"","httpstatus":"","archivestatus":"0"},{"url":"https://www.cve.org/CVERecord?id=CVE-2026-115932","name":"CVE Program record","refsource":"CVE.ORG","tags":["canonical"]},{"url":"https://nvd.nist.gov/vuln/detail/CVE-2026-115932","name":"NVD vulnerability detail","refsource":"NVD","tags":["canonical","analysis"]}],"affected":[{"source":"CNA","vendor":"GitroomHQ","product":"postiz-app","version":"affected 2.23.0 2.25.3 semver","platforms":[]}],"timeline":[{"source":"CNA","time":"2026-10-23T17:45:00.000Z","lang":"en","value":"Anthropic has disclosed a thorough report of this vulnerability including a working PoC to Postiz"},{"source":"CNA","time":"2026-10-23T18:00:00.000Z","lang":"en","value":"Postiz has reproduced the vulnerability and is working on a fix"}],"solutions":[],"workarounds":[{"source":"CNA","title":"","value":"Set DISABLE_REGISTRATION=true. The attacker needs an ordinary account, so closing self-registration limits exposure to people who already hold one. This reduces reach, it does not close the issue.","time":"","lang":"en"},{"source":"CNA","title":"","value":"If you do not need the Discord provider, leave its client id, client secret and bot token unset. This removes the main route only; the other routes remain.","time":"","lang":"en"}],"exploits":[{"source":"CNA","title":"","value":"Exploitation was demonstrated end to end against unmodified builds of the backend and the orchestrator at commit 3a7d28b7ad96, using only a self-registered account: a file outside the upload directory arrived byte for byte as an attachment in the attacker's Discord channel. The validation-time route and the stored media route were also exercised separately against the same builds.","time":"","lang":"en"}],"credits":[{"source":"CNA","value":"Anthropic, PBC","lang":"en"},{"source":"CNA","value":"Enno Gelhaus","lang":"en"},{"source":"CNA","value":"Nevo David","lang":"en"}],"nvd_cpes":[],"vendor_comments":[],"enrichments":{"kev":null,"epss":null,"legacy_qids":[]},"source_records":{"cve_program":{"containers":{"cna":{"affected":[{"defaultStatus":"unaffected","packageName":"postiz-app","product":"postiz-app","repo":"https://github.com/gitroomhq/postiz-app","vendor":"GitroomHQ","versions":[{"lessThan":"2.25.3","status":"affected","version":"2.23.0","versionType":"semver"}]}],"configurations":[{"lang":"en","value":"The main route requires the Discord provider to be enabled, that is DISCORD_CLIENT_ID, DISCORD_CLIENT_SECRET and DISCORD_BOT_TOKEN_ID set. These are empty in the shipped docker-compose.yaml. The storage provider does not matter."},{"lang":"en","value":"The validation-time route requires a Dribbble, TikTok or Pinterest provider to be configured."},{"lang":"en","value":"The shipped container runs the worker as root, so every file root can read is exposed. Self-registration is open unless DISABLE_REGISTRATION is set to true."}],"credits":[{"lang":"en","type":"finder","value":"Anthropic, PBC"},{"lang":"en","type":"coordinator","value":"Enno Gelhaus"},{"lang":"en","type":"remediation developer","value":"Nevo David"}],"datePublic":"2026-10-24T12:28:19.768Z","descriptions":[{"lang":"en","value":"When a post is published, Postiz treats a media path that is not a web address as a file on the server's disk, but it does not check that the file lies inside the upload directory. A registered user can store a crafted media path with a post, get it past the checks that normally restrict it, and have the publishing worker read an arbitrary file and send it as an attachment to a Discord server the user controls.\n\nThe same unconfined reads can be reached through two further routes. One tells the caller whether a file exists and can exhaust the backend's memory, the other delivers the file the same way as the main route. Self-registration is open by default, so the attacker needs no existing account."}],"exploits":[{"lang":"en","value":"Exploitation was demonstrated end to end against unmodified builds of the backend and the orchestrator at commit 3a7d28b7ad96, using only a self-registered account: a file outside the upload directory arrived byte for byte as an attachment in the attacker's Discord channel. The validation-time route and the stored media route were also exercised separately against the same builds."}],"impacts":[{"descriptions":[{"lang":"en","value":"Where the Discord provider is configured, any registered user can read any regular file the publishing worker can read and have it delivered byte for byte to a Discord server they control."}]},{"descriptions":[{"lang":"en","value":"Files within reach include those that hold the JWT signing secret, the database address and provider client secrets, such as the instance's environment file, mounted secret files and application logs, and the worker's process environment."}]},{"descriptions":[{"lang":"en","value":"A second route lets a user with a connected Dribbble, TikTok or Pinterest channel learn whether a path exists and whether it is a file or a directory, and exhaust the backend's memory with one request by pointing at a device file, which stops the backend from answering any organization until it is killed."}]},{"descriptions":[{"lang":"en","value":"A third route, on instances using local storage with an empty cloud bucket URL, reaches the same file read without needing a WordPress site."}]}],"metrics":[{"cvssV3_1":{"baseScore":9.6,"baseSeverity":"CRITICAL","vectorString":"CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:N","version":"3.1"},"format":"CVSS"}],"problemTypes":[{"descriptions":[{"cweId":"CWE-22","description":"CWE-22","lang":"en","type":"CWE"},{"cweId":"CWE-74","description":"CWE-74","lang":"en","type":"CWE"}]}],"providerMetadata":{"dateUpdated":"2026-10-24T12:28:36.033Z","orgId":"4cdc9741-f887-419a-a2fd-acbbd2729276","shortName":"postiz"},"references":[{"name":"Postiz","tags":["product"],"url":"https://github.com/gitroomhq/postiz-app"},{"name":"v2.25.3","tags":["release-notes"],"url":"https://github.com/gitroomhq/postiz-app/releases/tag/v2.25.3"},{"name":"12db9bd","tags":["patch"],"url":"https://github.com/gitroomhq/postiz-app/commit/12db9bd2f428b628a62809669c3d76297e07750a"},{"name":"GAdvisory","tags":["vendor-advisory"],"url":"https://gadvisory.org/advisories/PSA-2026-E9AHFV"}],"timeline":[{"lang":"en","time":"2026-10-23T17:45:00.000Z","value":"Anthropic has disclosed a thorough report of this vulnerability including a working PoC to Postiz"},{"lang":"en","time":"2026-10-23T18:00:00.000Z","value":"Postiz has reproduced the vulnerability and is working on a fix"}],"title":"Path traversal in post media lets any registered user read server files","workarounds":[{"lang":"en","value":"Set DISABLE_REGISTRATION=true. The attacker needs an ordinary account, so closing self-registration limits exposure to people who already hold one. This reduces reach, it does not close the issue."},{"lang":"en","value":"If you do not need the Discord provider, leave its client id, client secret and bot token unset. This removes the main route only; the other routes remain."}]}},"cveMetadata":{"assignerOrgId":"4cdc9741-f887-419a-a2fd-acbbd2729276","assignerShortName":"postiz","cveId":"CVE-2026-115932","datePublished":"2026-10-24T12:28:36.033Z","dateReserved":"2026-10-23T21:19:56.682Z","dateUpdated":"2026-10-24T12:28:36.033Z","state":"PUBLISHED"},"dataType":"CVE_RECORD","dataVersion":"5.2"},"nvd":{"publishedDate":"2026-10-24 13:16:37","lastModifiedDate":"2026-10-24 13:16:37","problem_types":["CWE-22","CWE-74","CWE-22 CWE-22","CWE-74 CWE-74"],"metrics":{"cvssMetricV31":[{"source":"4cdc9741-f887-419a-a2fd-acbbd2729276","type":"Secondary","cvssData":{"version":"3.1","vectorString":"CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:N","baseScore":9.6,"baseSeverity":"CRITICAL","attackVector":"NETWORK","attackComplexity":"LOW","privilegesRequired":"LOW","userInteraction":"NONE","scope":"CHANGED","confidentialityImpact":"HIGH","integrityImpact":"HIGH","availabilityImpact":"NONE"},"exploitabilityScore":3.1,"impactScore":5.8}]},"configurations":[]},"legacy_mitre":{"record":{"CveYear":"2026","CveId":"115932","Ordinal":"1","Title":"Path traversal in post media lets any registered user read serve","CVE":"CVE-2026-115932","Year":"2026"},"notes":[{"CveYear":"2026","CveId":"115932","Ordinal":"1","NoteData":"When a post is published, Postiz treats a media path that is not a web address as a file on the server's disk, but it does not check that the file lies inside the upload directory. A registered user can store a crafted media path with a post, get it past the checks that normally restrict it, and have the publishing worker read an arbitrary file and send it as an attachment to a Discord server the user controls.\n\nThe same unconfined reads can be reached through two further routes. One tells the caller whether a file exists and can exhaust the backend's memory, the other delivers the file the same way as the main route. Self-registration is open by default, so the attacker needs no existing account.","Type":"Description","Title":"Path traversal in post media lets any registered user read serve"}]}}}