PoC Archive PoC Archive
CVE-2025-55130 category: binary CVSS 9.1 (CRITICAL)
Unverified

Node.js Permission Model Symlink Escape (CVE-2025-55130)

Published: 2026-09-03 • Researcher: natann (JFrog Security Research), scumfrog (PoC)

Target software Node.js
Affected versions 20.x < 20.20.0, 22.x < 22.22.0, 24.x < 24.13.0, 25.x < 25.3.0
Status Weaponized
Severity Critical · CVSS 9.1
CVSS 9.1/10
Severity
Critical
CVE
CVE-2025-55130
Category
binary
Affected product
Node.js
Affected versions
20.x < 20.20.0, 22.x < 22.22.0, 24.x < 24.13.0, 25.x < 25.3.0
Disclosed
2026-09-03
Patch status
Unverified
On this page

Metadata

FieldValue
Date Added2026-09-03
Author / Researchernatann (JFrog Security Research), scumfrog (PoC)
CVE / AdvisoryCVE-2025-55130
Categorybinary
SeverityCritical
CVSS Score9.1
StatusWeaponized
Tagssandbox escape, Node.js, symlink, path traversal, permission model, JavaScript

Affected Target

FieldValue
Software / SystemNode.js
Versions Affected20.x < 20.20.0, 22.x < 22.22.0, 24.x < 24.13.0, 25.x < 25.3.0
Language / PlatformJavaScript / Node.js
Authentication RequiredYes (local shell with Node.js permission model active)
Network Access RequiredLocal only

Summary

CVE-2025-55130 is a flaw in the Node.js Permissions model that allows bypassing --allow-fs-read and --allow-fs-write restrictions using crafted relative symlink paths. By chaining directories and symlinks, a script granted access only to the current directory can escape the sandbox and read or write arbitrary files on the system.

Vulnerability Details

Root Cause

The permission check and path resolution happen separately. The initial path passes the permission check (it starts with ./), then the symlink is followed and traversal sequences escape the sandbox.

Attack Vector

  1. Create a nested directory chain with a symlink pointing to an absolute path
  2. Construct a payload path that passes the permission check but resolves outside the sandbox
  3. Read or write arbitrary files

Impact

Full sandbox escape allowing arbitrary file read/write, breaking the isolation guarantees of the Node.js permission model.

References

Notes

Auto-ingested from https://github.com/scumfrog/CVE-2025-55130 on 2026-09-03.

check.js
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
/*
 * CVE-2025-55130 - Vulnerability Check
 * 
 * Quick check if Node.js version is vulnerable
 * 
 * Run: node check.js
 */

const version = process.version.replace('v', '');
const [major, minor] = version.split('.').map(Number);

const VULN_RANGES = {
    20: { max_minor: 19, patched: '20.20.0' },
    22: { max_minor: 21, patched: '22.22.0' },
    24: { max_minor: 12, patched: '24.13.0' },
    25: { max_minor: 2,  patched: '25.3.0' }
};

console.log(`
 ===============================================
  CVE-2025-55130 // Version Check
 ===============================================
  detected: v${version}
  platform: ${process.platform}/${process.arch}
 ===============================================
`);

const range = VULN_RANGES[major];

if (!range) {
    console.log('[?] version not in known affected range');
    console.log('[?] affected: 20.x, 22.x, 24.x, 25.x');
    process.exit(0);
}

const isVuln = minor <= range.max_minor;

if (isVuln) {
    console.log('[+] VULNERABLE');
    console.log(`[+] vulnerable range: ${major}.0.0 - ${major}.${range.max_minor}.x`);
    console.log(`[+] patched version: ${range.patched}`);
    console.log('');
    console.log('[*] to exploit:');
    console.log('    node --permission --allow-fs-read=. --allow-fs-write=. exploit.js');
} else {
    console.log('[-] NOT VULNERABLE');
    console.log('[-] version appears to be patched');
}

console.log('');