CVE-2026-115931

Arbitrary file read and backend crash through unrestricted provider method calls

Critical 9.9

Postiz lets a signed-in user ask the backend to run a function on one of their connected channels. The backend did not restrict which functions can be requested, so a user could call internal helper functions that were never meant to be reachable from the web interface. One of those helpers reads a file from the server's disk. A user who connects a channel whose stored token is a file path can have the backend return the contents of any file it can read, including its environment, which holds the secret used to sign login sessions, the database address and the credentials of connected services. Another helper makes the backend process exit with a single request. Self-registration is open by default, so no existing account and no action by another user is needed.

Assigner
postiz
Published
2026-10-23
Updated
2026-10-23
Reserved
2026-10-23

Scores

SourceCVSSScoreSeverityVector
postiz3.19.9CriticalCVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H

Weaknesses

Affected

VendorProductVersions
GitroomHQ postiz-app 2.23.0 to < 2.25.2 (affected)
others: unaffected

References

Full CVE JSON record (5.2)

API · GitHub · cve.org

{
  "containers": {
    "cna": {
      "affected": [
        {
          "defaultStatus": "unaffected",
          "packageName": "postiz-app",
          "product": "postiz-app",
          "repo": "https://github.com/gitroomhq/postiz-app",
          "vendor": "GitroomHQ",
          "versions": [
            {
              "lessThan": "2.25.2",
              "status": "affected",
              "version": "2.23.0",
              "versionType": "semver"
            }
          ]
        }
      ],
      "configurations": [
        {
          "lang": "en",
          "value": "The default configuration is affected and no setting has to be changed. Self-registration is open unless DISABLE_REGISTRATION is set to true; with registration closed, any existing user can still exploit the issue."
        },
        {
          "lang": "en",
          "value": "The image built from the project\u0027s Dockerfile.dev runs the process as root, so every file root can read is exposed. The process\u0027s own environment is readable regardless of the user it runs as."
        }
      ],
      "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-23T22:00:00.481Z",
      "descriptions": [
        {
          "lang": "en",
          "value": "Postiz lets a signed-in user ask the backend to run a function on one of their connected channels. The backend did not restrict which functions can be requested, so a user could call internal helper functions that were never meant to be reachable from the web interface.\n\nOne of those helpers reads a file from the server\u0027s disk. A user who connects a channel whose stored token is a file path can have the backend return the contents of any file it can read, including its environment, which holds the secret used to sign login sessions, the database address and the credentials of connected services. Another helper makes the backend process exit with a single request. Self-registration is open by default, so no existing account and no action by another user is needed."
        }
      ],
      "exploits": [
        {
          "lang": "en",
          "value": "Exploitation was demonstrated end to end against an unmodified build of Postiz at commit 3a7d28b7ad96, using only a self-registered account: the contents of a file placed outside the application\u0027s directories and the exact JWT secret the backend was started with were both returned in full. Terminating the backend with one request was demonstrated separately."
        }
      ],
      "impacts": [
        {
          "descriptions": [
            {
              "lang": "en",
              "value": "Any registered user can read any file the backend process can read, with the result returned as bytes so binary files work."
            }
          ]
        },
        {
          "descriptions": [
            {
              "lang": "en",
              "value": "The backend\u0027s environment is readable, which exposes the JWT signing secret, the database and Redis connection strings and the credentials and API keys of connected providers when they are passed as environment variables."
            }
          ]
        },
        {
          "descriptions": [
            {
              "lang": "en",
              "value": "With the JWT signing secret an attacker can sign a session for any user, including a user in another organization or an instance super administrator, and can decrypt data the application stores encrypted with the same secret."
            }
          ]
        },
        {
          "descriptions": [
            {
              "lang": "en",
              "value": "A single request ends the backend process, and it can be repeated after every restart."
            }
          ]
        },
        {
          "descriptions": [
            {
              "lang": "en",
              "value": "Other provider functions become callable by any member of an organization that owns a channel, some of which return access tokens for the connected account that other routes keep server side."
            }
          ]
        }
      ],
      "metrics": [
        {
          "cvssV3_1": {
            "baseScore": 9.9,
            "baseSeverity": "CRITICAL",
            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H",
            "version": "3.1"
          },
          "format": "CVSS"
        }
      ],
      "problemTypes": [
        {
          "descriptions": [
            {
              "cweId": "CWE-470",
              "description": "CWE-470",
              "lang": "en",
              "type": "CWE"
            },
            {
              "cweId": "CWE-73",
              "description": "CWE-73",
              "lang": "en",
              "type": "CWE"
            }
          ]
        }
      ],
      "providerMetadata": {
        "dateUpdated": "2026-10-23T23:07:14.650Z",
        "orgId": "4cdc9741-f887-419a-a2fd-acbbd2729276",
        "shortName": "postiz"
      },
      "references": [
        {
          "name": "Postiz",
          "tags": [
            "product"
          ],
          "url": "https://github.com/gitroomhq/postiz-app"
        },
        {
          "name": "v2.25.1",
          "tags": [
            "release-notes"
          ],
          "url": "https://github.com/gitroomhq/postiz-app/releases/tag/v2.25.1"
        },
        {
          "name": "9383f5b",
          "tags": [
            "patch"
          ],
          "url": "https://github.com/gitroomhq/postiz-app/commit/9383f5be4d310c346e33a3748a9a7ded64c96fed"
        },
        {
          "name": "GAdvisory",
          "tags": [
            "vendor-advisory"
          ],
          "url": "https://gadvisory.org/advisories/PSA-2026-JNXM56"
        }
      ],
      "timeline": [
        {
          "lang": "en",
          "time": "2026-10-23T19:45:00.000Z",
          "value": "Anthropic has disclosed a thorough report of this vulnerability including a working PoC to Postiz"
        },
        {
          "lang": "en",
          "time": "2026-10-23T20:00:00.000Z",
          "value": "Postiz has reproduced the vulnerability and is working on a fix"
        },
        {
          "lang": "en",
          "time": "2026-10-23T21:33:00.000Z",
          "value": "Postiz has pushed a fix for this vulnerability and verified it"
        },
        {
          "lang": "en",
          "time": "2026-10-23T22:00:00.000Z",
          "value": "Postiz has created a release and published the advisory"
        }
      ],
      "title": "Arbitrary file read and backend crash through unrestricted provider method calls",
      "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."
        }
      ]
    }
  },
  "cveMetadata": {
    "assignerOrgId": "4cdc9741-f887-419a-a2fd-acbbd2729276",
    "assignerShortName": "postiz",
    "cveId": "CVE-2026-115931",
    "datePublished": "2026-10-23T22:02:21.717Z",
    "dateReserved": "2026-10-23T21:19:33.246Z",
    "dateUpdated": "2026-10-23T23:07:14.650Z",
    "state": "PUBLISHED"
  },
  "dataType": "CVE_RECORD",
  "dataVersion": "5.2"
}