Live › vulnerability › CVE-2026-113668
Go to dashboardThe ApostropheCMS REST route GET /api/v1/<piece-type>/:_id/locales (and the page equivalent) skips the public-API authorization check that sibling read routes apply. An unauthenticated caller who knows a document _id can learn whether the document exists and which locales it is published in.
Summary written from the sources below. Check the originals before acting.
First seen by InfraStack 2026-10-23 19:11 UTC, 3h before NVD. All times on this page are UTC.
| Product | Ecosystem | Affected | Fixed in |
|---|---|---|---|
| apostrophe | npm | < 4.33.0 | 4.33.0 |
Check the installed apostrophe version with: npm ls apostrophe
If below 4.33.0, send an unauthenticated GET to /api/v1/<piece-type>/<known-_id>/locales on a site with public-API access restricted and see if it returns locale data.
4.33.0 or laterEach row is the first time that source carried this signal. The analyst’s rows are its own findings.
The REST route GET /api/v1/<piece-type>/:_id/locales (and the equivalent page route) does not apply the publicApiCheckAsync gate that ApostropheCMS's other read routes enforce. An unauthenticated caller can therefore query this route for any document _id and learn whether the document exists and which locales it is published in — a document-existence and locale-metadata disclosure that the read-API is otherwise supposed to gate.
apostrophecms/apostrophe (monorepo package apostrophe).d3ff8c9 == the shipped 4.32.2; unchanged at current HEAD). No fix at time of report.GET /api/v1/<piece-type>/:_id/locales and GET /api/v1/@apostrophecms/page/:_id/locales.modules/@apostrophecms/piece-type/index.js:397 registers the :_id/locales route with no publicApiCheckAsync. The page module has the same omission at modules/@apostrophecms/page/index.js:925.getAll at piece-type/index.js:256-263) call publicApiCheckAsync (:263) to enforce the public-API access policy.locales handler (which calls getLocales() for the document) runs for any caller regardless of the public-API gate the other read routes apply, returning the document's locale/publication metadata without authorization.An unauthenticated caller can confirm the existence of a document by _id and enumerate its locales/publication state — information the read-API is meant to gate. Defensibly 4.3 (AC:H) given the opaque _id precondition (the caller needs a document id).
Reproduced against [email protected] (== commit d3ff8c9) locally with synthetic content:
:_id/locales route lacks publicApiCheckAsync while the sibling read routes have it.GET /api/v1/<piece-type>/<_id>/locales returned the document's locale metadata (existence + locales), while the gated read routes (e.g. getAll) correctly required the public-API policy.publicApiCheckAsync gate added (matching the siblings) denies the unauthenticated request — isolating the missing gate as the cause.
Synthetic content only; nothing hosted was touched.Add the publicApiCheckAsync (or equivalent) authorization gate to the :_id/locales route in both the piece-type and page modules, matching the sibling read routes, so the locale/existence metadata is only returned to callers permitted by the public-API policy.
Please credit Santosh Kumar Puppala (https://github.com/Santoshkumarpuppala).
This page as .md · .json · in your agent: get_signal("CVE-2026-113668")
GitHub Advisory Database, CC-BY 4.0 · NVD data is provided by NIST and is public domain. Posts quoted belong to their authors.