GitHub Advisoryadvisory · npm
GHSA-f66c-mpj2-3r8h ApostropheCMS: POST /api/v1/@apostrophecms/doc/slugTaken discloses existence of private/admin-only content to any authenticated user
MEDIUM
Official page ↗
- Aliases
- CVE-2026-112952
- Ecosystem
- npm
- Packages
- apostrophe
- Severity
- Moderate
- CVSS vector
- CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:N/A:N
- Weaknesses
- CWE-200
- Reviewed
- 2026-10-21
Affected packages
• npm apostrophe: < 4.34.0 → fixed in 4.34.0
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
```bash
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.
Related
Alias · CVE (1)
- CVE-2026-112952 ApostropheCMS is an open-source Node.js content management system. vulnerability
Weakness · CWE (1)
- CWE-200 Exposure of Sensitive Information to an Unauthorized Actor weakness
References
- https://github.com/apostrophecms/apostrophe/security/advisories/GHSA-f66c-mpj2-3r8h web
- https://nvd.nist.gov/vuln/detail/CVE-2026-112952 advisory
- https://github.com/apostrophecms/apostrophe/commit/06e4b377f3c360f9e89c32dccd7e505ad5ddf498 web
- https://github.com/apostrophecms/apostrophe/commit/40b989b1a9dd23d30029b8ce7668634265cfe5ea web
- https://github.com/apostrophecms/apostrophe package
- https://github.com/apostrophecms/apostrophe/releases/tag/[email protected] web