CVE-2026-115932 PUBLISHED

Path traversal in post media lets any registered user read server files

Assigner: postiz
Reserved: 23.10.2026 Published: 24.10.2026 Updated: 24.10.2026

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.

The 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.

Metrics

CVSS Vector: CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:N
CVSS Score: 9.6

Product Status

Vendor GitroomHQ
Product postiz-app
Versions Default: unaffected
  • affected from 2.23.0 to 2.25.3 (excl.)

Affected Configurations

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.

Exploits

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.

Workarounds

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.

Credits

  • Anthropic, PBC finder
  • Enno Gelhaus coordinator
  • Nevo David remediation developer

References

Problem Types

  • CWE-22 CWE
  • CWE-74 CWE

Impacts

  • 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.
  • 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.
  • 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.
  • A third route, on instances using local storage with an empty cloud bucket URL, reaches the same file read without needing a WordPress site.