All vulnerabilities
CVE-2026-112952GHSA-f66c-mpj2-3r8h

ApostropheCMS: POST /api/v1/@apostrophecms/doc/slugTaken discloses existence of private/admin-only content to any authenticated user

apostrophecms apostrophenpmLibraries & packages
CVSS
4.3Medium
ExploitationNo known exploitationNot in CISA KEV, which does not prove it is unexploitedCISA KEV
Exploit odds (EPSS)0.27%Chance of exploitation activity in the next 30 days, higher than 18% of CVEs. Scored 23 Oct 2026FIRST EPSS
Fixed in4.34.0Fixed versionGitHub
Published20 Oct 2026Updated 21 Oct 2026CVE List

What fixes it

  • 4.34.0apostrophe, npmGitHubnpm install apostrophe@4.34.0

A fixed version on one release line is not the upgrade target for every line. Check your exact version and any vendor backports.

Description

Summary

The slugTaken endpoint returns a boolean indicating whether a slug is in use across all document types and visibility levels, with no permission or type filter. Any logged-in user (including editors) can enumerate the slug space of private pages, drafts, and archived content.

Details

POST /api/v1/@apostrophecms/doc/slugTaken with body { "slug": "target-slug" } runs a raw existence check against the documents collection. It does not:

  • Check whether the requesting user has read permission for documents of that type.
  • Filter by visibility (public, loginRequired, private).
  • Filter by viewRole.
  • Filter by publication status (draft vs published).

A single authenticated session can iterate the slug space to enumerate the full content inventory of the CMS, including content the user is explicitly prohibited from viewing.

PoC

# Any authenticated session works — editor role sufficient
curl -b "$EDITOR_JAR" -X POST \
  -H "Content-Type: application/json" \
  -d '{"slug":"known-private-page-slug"}' \
  "http://TARGET/api/v1/@apostrophecms/doc/slugTaken"
# → { "taken": true }  — confirms private page exists

curl -b "$EDITOR_JAR" -X POST \
  -H "Content-Type: application/json" \
  -d '{"slug":"zzz-nonexistent"}' \
  "http://TARGET/api/v1/@apostrophecms/doc/slugTaken"
# → { "taken": false }

Impact

Information disclosure. An attacker with any authenticated session can enumerate all slugs in the system, mapping the full content structure of the CMS including private and admin-only content.

Text from GitHub Advisory Database

Affected versions 3

  • apostrophe, npm< 4.34.0GitHub
  • apostropheaffected: < 4.34.0CVE List
  • apostrophe, npmfrom first release, fixed in 4.34.0OSV

References 6