{"id":"CVE-2026-113653","kind":"vulnerability","aliases":["CVE-2026-113653","GHSA-xf6w-q65w-4f2w"],"related":[],"title":"ApostropheCMS: The general public can access @apostrophecms/user objects via a relationship (viewRole is not applied to the general public)","description":"### Impact\nEven though it is correctly applied to guests, contributors, etc., `viewRole` is not applied to the general public. This means that a secured content type like `@apostrophecms/user` can in theory be accessed.\n\nThis is greatly mitigated by the fact that there is no automatic public REST API for any content type. One has to expressly allow it. However, it does mean that developers can make the mistake of setting up a relationship between a content type like a blog post, and `@apostrophecms/user`. This could potentially expose some sensitive information if templates were written poorly, e.g. if they JSON-serialized the entire object. Note that password hashes are NOT affected because they reside in a separate collection.\n\nThe public demo project and its various flavors must be updated first because it inadvertently relies on the bug.\n\n### Patches\n4.33.0\n\n### Workarounds\nNever create relationships with `@apostrophecms/user` that are intended for non-admin display. If you need a relationship that expresses authorship, create a separate author piece type to publicly represent that.","summary":"ApostropheCMS does not apply the viewRole permission to the general public, so anonymous visitors can read @apostrophecms/user documents through a relationship field. An attacker can see user record data exposed by a blog post or similar template, such as names or emails if the template serializes the whole user object; password hashes are stored separately and not exposed.","severity":"medium","cvss":6.9,"epss":0.003869999898597598,"exploited":false,"exploited_at":null,"products":[{"name":"apostrophe","fixed":["4.33.0"],"affected":"< 4.33.0","ecosystem":"npm"}],"ecosystems":["npm"],"tags":["apostrophecms","cms","cwe-863","node","package","self-hosted"],"not_affected_if":["managed-hosting-with-patched-version","no-user-relationships","version-4.33.0-or-later"],"how_to_check":"Look for relationship fields pointing to @apostrophecms/user in your content type definitions (grep for \"@apostrophecms/user\" in modules/).\nCheck your installed version: npm ls apostrophe.\nReview templates that render relationship data for JSON serialization of the whole object.","fix":"Upgrade apostrophe to 4.33.0 or later.\nUntil then, remove relationships to @apostrophecms/user meant for public display and use a separate public author piece type instead.","status":"open","published_at":"2026-10-20T17:17:36+00:00","first_seen_at":"2026-10-23T19:11:32+00:00","triaged_at":"2026-10-23T20:13:33+00:00","updated_at":"2026-10-23T21:57:20+00:00","category":"package","confidence":0.85,"triage":{"at":"2026-10-23T20:13:33Z","model":"claude-haiku-5-5","output":{"fix":"Upgrade apostrophe to 4.33.0 or later.\nUntil then, remove relationships to @apostrophecms/user meant for public display and use a separate public author piece type instead.","summary":"ApostropheCMS does not apply the viewRole permission to the general public, so anonymous visitors can read @apostrophecms/user documents through a relationship field. An attacker can see user record data exposed by a blog post or similar template, such as names or emails if the template serializes the whole user object; password hashes are stored separately and not exposed.","category":"package","who_cares":["apostrophecms","node","self-hosted","cms"],"confidence":0.85,"analyst_note":"","how_to_check":"Look for relationship fields pointing to @apostrophecms/user in your content type definitions (grep for \"@apostrophecms/user\" in modules/).\nCheck your installed version: npm ls apostrophe.\nReview templates that render relationship data for JSON serialization of the whole object.","needs_analyst":false,"not_affected_if":["version-4.33.0-or-later","no-user-relationships","managed-hosting-with-patched-version"],"severity_if_unknown":"medium"},"cost_usd":0.00043,"input_tokens":2304,"output_tokens":400,"severity_before":"medium"},"analyst_status":null,"analyst_note":null,"search":"'-113653':22A,30A '-2026':21A,29A '-863':35B '4.33.0':237C '4f2w':27A 'access':6A,131C 'admin':250C 'affect':209C 'allow':155C 'anonym':53B 'api':146C 'apostrophe':31A 'apostrophecm':1A,32B,41B 'apostrophecms/user':7A,57B,126C,181C,243C 'appli':15A,44B,105C,113C 'attack':64B 'author':263C 'authorship':259C 'automat':143C 'blog':73B,178C 'bug':235C 'cms':33B 'collect':216C 'content':123C,149C,174C 'contributor':108C 'correct':104C 'could':183C 'creat':240C,260C 'cve':20A,28A 'cwe':34B 'data':69B 'demo':219C 'develop':162C 'display':251C 'document':58B 'e.g':194C 'email':82B 'entir':201C 'etc':109C 'even':100C 'expos':70B,98B,185C 'express':258C 'expressli':154C 'fact':138C 'field':62B 'first':228C 'flavor':224C 'general':3A,18A,50B,116C 'ghsa':24A 'ghsa-xf6w-q65w-4f2w':23A 'great':134C 'guest':107C 'hash':92B,206C 'host':40B 'howev':157C 'impact':99C 'inadvert':231C 'inform':188C 'intend':246C 'json':198C 'json-seri':197C 'like':125C,176C 'make':164C 'mean':119C,160C 'mistak':166C 'mitig':135C 'must':225C 'name':80B 'need':254C 'never':239C 'node':36B 'non':249C 'non-admin':248C 'note':203C 'object':8A,90B,202C 'one':151C 'packag':37B 'password':91B,205C 'patch':236C 'permiss':47B 'piec':264C 'poor':193C 'post':74B,179C 'potenti':184C 'project':220C 'public':4A,19A,51B,117C,144C,218C,267C 'q65w':26A 'read':56B 'record':68B 'relationship':11A,61B,171C,241C,256C 'reli':232C 'repres':268C 'resid':212C 'rest':145C 'secur':122C 'see':66B 'self':39B 'self-host':38B 'sensit':187C 'separ':95B,215C,262C 'serial':86B,199C 'set':168C 'similar':76B 'store':94B 'templat':77B,85B,190C 'theori':129C 'though':101C 'type':124C,150C,175C,265C 'updat':227C 'user':67B,89B 'various':223C 'via':9A 'viewrol':12A,46B,110C 'visitor':54B 'whole':88B 'workaround':238C 'written':192C 'xf6w':25A","nicknames":[],"mitigations":[],"who_affected":null,"tier":"C","verified":{},"analyst_revisit_at":null,"first_public_at":"2026-10-20T17:17:36+00:00","kev":null,"cvss_vector":"CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:L/VI:L/VA:L/SC:N/SI:N/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X","cvss_by":"security-advisories@github.com","poc_count":0,"sources":[{"source":"ghsa","external_id":"GHSA-xf6w-q65w-4f2w","url":"https://github.com/advisories/GHSA-xf6w-q65w-4f2w","severity":"medium","published_at":"2026-10-20T18:26:02+00:00","modified_at":"2026-10-20T18:26:03+00:00","first_seen_at":"2026-10-23T19:11:32+00:00","fetched_at":"2026-10-23T19:11:32+00:00","note":null},{"source":"nvd","external_id":"CVE-2026-113653","url":"https://nvd.nist.gov/vuln/detail/CVE-2026-113653","severity":null,"published_at":"2026-10-20T17:17:36+00:00","modified_at":"2026-10-20T19:53:10+00:00","first_seen_at":"2026-10-23T21:57:20+00:00","fetched_at":"2026-10-23T22:28:58+00:00","note":null}],"documents":[],"notice":"Free to read at a human pace. An API with keys and an MCP server are in preparation; early access: hello@infrastack.ai"}