{"schemaVersion":3,"id":"CVE-2026-113651","aliases":["GHSA-gmfx-5g6x-rr72"],"status":"published","duplicateOf":null,"title":null,"description":"ApostropheCMS is an open-source Node.js content management system, and uploadfs is its file storage library. Prior to uploadfs 1.28.0, attacker-controlled paths that reach the local backend can contain parent-directory segments that escape the configured upload directory and affect file reads, writes, and deletion on the host filesystem. Exploitability depends on an application exposing the relevant uploadfs operations to untrusted path. This issue is fixed in uploadfs 1.28.0.","dates":{"published":"2026-10-20T16:22:30.842Z","modified":"2026-10-20T17:20:31.152Z","reserved":null,"kevAdded":[],"kevDue":[]},"cvss":{"headline":{"score":3.3,"severity":"low","version":"3.1","versionLabel":"v3.1","source":"CVE.org","vector":"CVSS:3.1/AV:N/AC:H/PR:H/UI:N/S:U/C:L/I:L/A:N","computed":false,"selection":"backend-summary"},"metrics":[{"version":"3.1","versionLabel":"v3.1","source":"CVE.org","score":3.3,"severity":"low","vector":"CVSS:3.1/AV:N/AC:H/PR:H/UI:N/S:U/C:L/I:L/A:N","exploitability":null,"impact":null,"computed":false},{"version":"3.1","versionLabel":"v3.1","source":"NVD","score":3.3,"severity":"low","vector":"CVSS:3.1/AV:N/AC:H/PR:H/UI:N/S:U/C:L/I:L/A:N","exploitability":null,"impact":null,"computed":false},{"version":"3.1","versionLabel":"v3.1","source":"OSV · Npm","score":3.3,"severity":"low","vector":"CVSS:3.1/AV:N/AC:H/PR:H/UI:N/S:U/C:L/I:L/A:N","exploitability":1.8,"impact":4.2,"computed":true}]},"epss":{"probability":0.00328,"percentile":0.24607,"severity":"low","asOf":"2026-10-21T00:00:00.000Z","change":{"pp":null,"baselineDate":null,"baselineScore":null},"history":[{"date":"2026-10-21T00:00:00.000Z","score":0.00328,"percentile":0.24607}],"last30":[{"date":"2026-10-21T00:00:00.000Z","score":0.00328,"percentile":0.24607}]},"kev":{"state":"not-listed","entries":[],"listedCount":0,"totalCatalogs":3,"catalogs":[{"source":"cisa","label":"CISA","listed":false,"entry":null},{"source":"enisa","label":"ENISA","listed":false,"entry":null},{"source":"circl","label":"CIRCL","listed":false,"entry":null}]},"ransomware":{"state":"none-recorded","sources":[]},"exploits":[],"exploitCount":0,"weaknesses":[{"id":"CWE-22","name":"Improper Limitation of a Pathname to a Restricted Directory ('Path Traversal')","description":"The product uses external input to construct a pathname that is intended to identify a file or directory that is located underneath a restricted parent directory, but the product does not properly neutralize special elements within the pathname that can cause the pathname to resolve to a location that is outside of the restricted directory.","type":"weakness","status":"Stable","abstraction":"Base","likelihoodOfExploit":"High","url":"https://cwe.mitre.org/data/definitions/22.html"}],"affected":[{"vendor":"apostrophecms","product":"apostrophe","name":"apostrophe","label":"apostrophe","ecosystem":null,"cpePart":"a","purl":null,"purlType":null,"versions":[{"text":"< 4.33.0","noFixRecorded":false,"fixedIn":null}],"versionsText":"< 4.33.0","eol":null,"hubHref":"/vendor/apostrophecms/apostrophe"},{"vendor":"apostrophecms","product":"uploadfs","name":"uploadfs","label":"uploadfs","ecosystem":null,"cpePart":"a","purl":null,"purlType":null,"versions":[{"text":"< 1.28.0","noFixRecorded":false,"fixedIn":null}],"versionsText":"< 1.28.0","eol":null,"hubHref":"/vendor/apostrophecms/uploadfs"},{"vendor":"Npm","product":"uploadfs","name":"uploadfs","label":"uploadfs","ecosystem":"Npm","cpePart":null,"purl":"pkg:npm/uploadfs","purlType":"npm","versions":[{"text":"< 1.28.0","noFixRecorded":false,"fixedIn":null}],"versionsText":"< 1.28.0","eol":null,"hubHref":null}],"affectedCount":3,"eol":{"hasEol":false,"count":0},"references":[{"url":"https://github.com/apostrophecms/apostrophe/security/advisories/GHSA-gmfx-5g6x-rr72","label":"github.com/apostrophecms/apostrophe/security/advisories/GHSA-gmfx-5g6x-rr72","hostname":"github.com","tags":["X Refsource CONFIRM","WEB"]},{"url":"https://github.com/apostrophecms/apostrophe/commit/9500b8b0e1d630d5e07fbb5fd2c25ed0943845ce","label":"github.com/apostrophecms/apostrophe/commit/9500b8b0e1d630d5e07fbb5fd2c25ed0943845ce","hostname":"github.com","tags":["X Refsource MISC","WEB"]},{"url":"https://github.com/apostrophecms/apostrophe/commit/f84fd41cbf6c22eb8d0008fc9c25df1f7130b350","label":"github.com/apostrophecms/apostrophe/commit/f84fd41cbf6c22eb8d0008fc9c25df1f7130b350","hostname":"github.com","tags":["X Refsource MISC","WEB"]},{"url":"https://github.com/apostrophecms/apostrophe/releases/tag/uploadfs@1.28.0","label":"github.com/apostrophecms/apostrophe/releases/tag/uploadfs@1.28.0","hostname":"github.com","tags":["X Refsource MISC","WEB"]},{"url":"https://github.com/apostrophecms/apostrophe","label":"github.com/apostrophecms/apostrophe","hostname":"github.com","tags":["PACKAGE"]}],"lineage":{"upstream":[],"downstream":[],"duplicates":[],"related":[]},"timeline":[{"kind":"published","date":"2026-10-20T16:22:30.842Z","label":"Published","detail":"Vulnerability first disclosed.","source":null},{"kind":"modified","date":"2026-10-20T17:20:31.152Z","label":"Last modified","detail":"Vulnerability information updated.","source":null}],"risk":{"score":13,"level":"low","profile":"Default","thresholds":{"critical":75,"high":50,"medium":25,"low":10}},"meta":{"dataAsOf":"2026-10-22T02:24:03.361Z","stale":false,"partial":false}}