Every CVE Search/ Get API key

CVE-2026-26960

node-tar has Arbitrary File Read/Write via Hardlink Target Escape Through Symlink Chain in Extraction

7.1 HighFix available

node-tar is a full-featured Tar for Node.js. When using default options in versions 7.5.7 and below, an attacker-controlled archive can create a hardlink inside the extraction directory that points to a file outside the extraction root, enabling arbitrary file read and write as the extracting user. Severity is high because the primitive bypasses path protections and turns archive extraction into a direct filesystem access primitive. This issue has been fixed in version 7.5.8.

Attack profile

How easy it is to exploit

Attack vector
Local
Complexity
Low
Privileges needed
None
User interaction
Required

What an attacker can affect

Confidentiality
High
Integrity
High
Availability
None

Exploit likelihood

0.33%Up 0.3 points since Feb 20, 2026
90%50%10%1%

What each source reports

CVE List Score used 7.1

node-tar has Arbitrary File Read/Write via Hardlink Target Escape Through Symlink Chain in Extraction

node-tar is a full-featured Tar for Node.js. When using default options in versions 7.5.7 and below, an attacker-controlled archive can create a hardlink inside the extraction directory that points to a file outside the extraction root, enabling arbitrary file read and write as the extracting user. Severity is high because the primitive bypasses path protections and turns archive extraction into a direct filesystem access primitive. This issue has been fixed in version 7.5.8.

Record
CVE-2026-26960
CVSS 3.1
7.1 HighCVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:N
Weakness
CWE-22
Updated
2026-11-02
EUVDEUVD-2026-8399 7.1

node-tar is a full-featured Tar for Node.js. When using default options in versions 7.5.7 and below, an attacker-controlled archive can create a hardlink inside the extraction directory that points to a file outside the extraction root, enabling arbitrary file read and write as the extracting user. Severity is high because the primitive bypasses path protections and turns archive extraction into a direct filesystem access primitive. This issue has been fixed in version 7.5.8.

Record
EUVD-2026-8399
CVSS 3.1
7.1 HighCVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:N
Updated
2026-11-02
GitHub AdvisoriesGHSA-83g3-92jg-28cx 7.1

Arbitrary File Read/Write via Hardlink Target Escape Through Symlink Chain in node-tar Extraction

Summary

tar.extract() in Node tar allows an attacker-controlled archive to create a hardlink inside the extraction directory that points to a file outside the extraction root, using default options.

This enables arbitrary file read and write as the extracting user (no root, no chmod, no preservePaths).

Severity is high because the primitive bypasses path protections and turns archive extraction into a direct filesystem access primitive.

Details

The bypass chain uses two symlinks plus one hardlink:

  1. a/b/c/up -> ../..
  2. a/b/escape -> c/up/../..
  3. exfil (hardlink) -> a/b/escape/<target-relative-to-parent-of-extract>

Why this works:

  • Linkpath checks are string-based and do not resolve symlinks on disk for hardlink target safety.

    • See STRIPABSOLUTEPATH logic in:
      • ../tar-audit-setuid - CVE/node_modules/tar/dist/commonjs/unpack.js:255
      • ../tar-audit-setuid - CVE/node_modules/tar/dist/commonjs/unpack.js:268
      • ../tar-audit-setuid - CVE/node_modules/tar/dist/commonjs/unpack.js:281
  • Hardlink extraction resolves target as path.resolve(cwd, entry.linkpath) and then calls fs.link(target, destination).

    • ../tar-audit-setuid - CVE/node_modules/tar/dist/commonjs/unpack.js:566
    • ../tar-audit-setuid - CVE/node_modules/tar/dist/commonjs/unpack.js:567
    • ../tar-audit-setuid - CVE/node_modules/tar/dist/commonjs/unpack.js:703
  • Parent directory safety checks (mkdir + symlink detection) are applied to the destination path of the extracted entry, not to the resolved hardlink target path.

    • ../tar-audit-setuid - CVE/node_modules/tar/dist/commonjs/unpack.js:617
    • ../tar-audit-setuid - CVE/node_modules/tar/dist/commonjs/unpack.js:619
    • ../tar-audit-setuid - CVE/node_modules/tar/dist/commonjs/mkdir.js:27
    • ../tar-audit-setuid - CVE/node_modules/tar/dist/commonjs/mkdir.js:101

As a result, exfil is created inside extraction root but linked to an external file. The PoC confirms shared inode and successful read+write via exfil.

PoC

hardlink.js Environment used for validation:

  • Node: v25.4.0
  • tar: 7.5.7
  • OS: macOS Darwin 25.2.0
  • Extract options: defaults (tar.extract({ file, cwd }))

Steps:

  1. Prepare/locate a tar module. If require('tar') is not available locally, set TAR_MODULE to an absolute path to a tar package directory.

  2. Run:

TAR_MODULE="$(cd '../tar-audit-setuid - CVE/node_modules/tar' && pwd)" node hardlink.js
  1. Expected vulnerable output (key lines):
same_inode=true
read_ok=true
write_ok=true
result=VULNERABLE

Interpretation:

  • same_inode=true: extracted exfil and external secret are the same file object.
  • read_ok=true: reading exfil leaks external content.
  • write_ok=true: writing exfil modifies external file.

Impact

Vulnerability type:

  • Arbitrary file read/write via archive extraction path confusion and link resolution.

Who is impacted:

  • Any application/service that extracts attacker-controlled tar archives with Node tar defaults.
  • Impact scope is the privileges of the extracting process user.

Potential outcomes:

  • Read sensitive files reachable by the process user.
  • Overwrite writable files outside extraction root.
  • Escalate impact depending on deployment context (keys, configs, scripts, app data).
Record
GHSA-83g3-92jg-28cx
CVSS 3.1
7.1 HighCVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:N
Weakness
CWE-22
Updated
2026-11-02
NVD 7.1

node-tar is a full-featured Tar for Node.js. When using default options in versions 7.5.7 and below, an attacker-controlled archive can create a hardlink inside the extraction directory that points to a file outside the extraction root, enabling arbitrary file read and write as the extracting user. Severity is high because the primitive bypasses path protections and turns archive extraction into a direct filesystem access primitive. This issue has been fixed in version 7.5.8.

Record
CVE-2026-26960
CVSS 3.1
7.1 HighCVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:N
Weakness
CWE-22
Updated
2026-11-02
OSV 7.1

node-tar has Arbitrary File Read/Write via Hardlink Target Escape Through Symlink Chain in Extraction

node-tar is a full-featured Tar for Node.js. When using default options in versions 7.5.7 and below, an attacker-controlled archive can create a hardlink inside the extraction directory that points to a file outside the extraction root, enabling arbitrary file read and write as the extracting user. Severity is high because the primitive bypasses path protections and turns archive extraction into a direct filesystem access primitive. This issue has been fixed in version 7.5.8.

Record
CVE-2026-26960
CVSS 3.1
7.1 HighCVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:N
Weakness
CWE-22
Updated
2026-11-02
OSVDEBIAN-CVE-2026-26960 7.1

node-tar is a full-featured Tar for Node.js. When using default options in versions 7.5.7 and below, an attacker-controlled archive can create a hardlink inside the extraction directory that points to a file outside the extraction root, enabling arbitrary file read and write as the extracting user. Severity is high because the primitive bypasses path protections and turns archive extraction into a direct filesystem access primitive. This issue has been fixed in version 7.5.8.

Record
DEBIAN-CVE-2026-26960
CVSS 3.1
7.1 HighCVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:N
Updated
2026-11-02
Show 14 moreShow less
OSVGHSA-83g3-92jg-28cx 7.1

Arbitrary File Read/Write via Hardlink Target Escape Through Symlink Chain in node-tar Extraction

Summary

tar.extract() in Node tar allows an attacker-controlled archive to create a hardlink inside the extraction directory that points to a file outside the extraction root, using default options.

This enables arbitrary file read and write as the extracting user (no root, no chmod, no preservePaths).

Severity is high because the primitive bypasses path protections and turns archive extraction into a direct filesystem access primitive.

Details

The bypass chain uses two symlinks plus one hardlink:

  1. a/b/c/up -> ../..
  2. a/b/escape -> c/up/../..
  3. exfil (hardlink) -> a/b/escape/<target-relative-to-parent-of-extract>

Why this works:

  • Linkpath checks are string-based and do not resolve symlinks on disk for hardlink target safety.

    • See STRIPABSOLUTEPATH logic in:
      • ../tar-audit-setuid - CVE/node_modules/tar/dist/commonjs/unpack.js:255
      • ../tar-audit-setuid - CVE/node_modules/tar/dist/commonjs/unpack.js:268
      • ../tar-audit-setuid - CVE/node_modules/tar/dist/commonjs/unpack.js:281
  • Hardlink extraction resolves target as path.resolve(cwd, entry.linkpath) and then calls fs.link(target, destination).

    • ../tar-audit-setuid - CVE/node_modules/tar/dist/commonjs/unpack.js:566
    • ../tar-audit-setuid - CVE/node_modules/tar/dist/commonjs/unpack.js:567
    • ../tar-audit-setuid - CVE/node_modules/tar/dist/commonjs/unpack.js:703
  • Parent directory safety checks (mkdir + symlink detection) are applied to the destination path of the extracted entry, not to the resolved hardlink target path.

    • ../tar-audit-setuid - CVE/node_modules/tar/dist/commonjs/unpack.js:617
    • ../tar-audit-setuid - CVE/node_modules/tar/dist/commonjs/unpack.js:619
    • ../tar-audit-setuid - CVE/node_modules/tar/dist/commonjs/mkdir.js:27
    • ../tar-audit-setuid - CVE/node_modules/tar/dist/commonjs/mkdir.js:101

As a result, exfil is created inside extraction root but linked to an external file. The PoC confirms shared inode and successful read+write via exfil.

PoC

hardlink.js Environment used for validation:

  • Node: v25.4.0
  • tar: 7.5.7
  • OS: macOS Darwin 25.2.0
  • Extract options: defaults (tar.extract({ file, cwd }))

Steps:

  1. Prepare/locate a tar module. If require('tar') is not available locally, set TAR_MODULE to an absolute path to a tar package directory.

  2. Run:

TAR_MODULE="$(cd '../tar-audit-setuid - CVE/node_modules/tar' && pwd)" node hardlink.js
  1. Expected vulnerable output (key lines):
same_inode=true
read_ok=true
write_ok=true
result=VULNERABLE

Interpretation:

  • same_inode=true: extracted exfil and external secret are the same file object.
  • read_ok=true: reading exfil leaks external content.
  • write_ok=true: writing exfil modifies external file.

Impact

Vulnerability type:

  • Arbitrary file read/write via archive extraction path confusion and link resolution.

Who is impacted:

  • Any application/service that extracts attacker-controlled tar archives with Node tar defaults.
  • Impact scope is the privileges of the extracting process user.

Potential outcomes:

  • Read sensitive files reachable by the process user.
  • Overwrite writable files outside extraction root.
  • Escalate impact depending on deployment context (keys, configs, scripts, app data).
Record
GHSA-83g3-92jg-28cx
CVSS 3.1
7.1 HighCVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:N
Weakness
CWE-22
Updated
2026-11-02
OSVROOT-APP-NPM-CVE-2026-26960 7.1

CVE-2026-26960 in tar - Patched by Root

Root has patched CVE-2026-26960 in the tar package for Root:npm. Multiple fixed versions available.

Record
ROOT-APP-NPM-CVE-2026-26960
CVSS 3.1
7.1 HighCVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:N
Updated
2026-11-03
OSVUBUNTU-CVE-2026-26960 7.1

node-tar is a full-featured Tar for Node.js. When using default options in versions 7.5.7 and below, an attacker-controlled archive can create a hardlink inside the extraction directory that points to a file outside the extraction root, enabling arbitrary file read and write as the extracting user. Severity is high because the primitive bypasses path protections and turns archive extraction into a direct filesystem access primitive. This issue has been fixed in version 7.5.8.

Record
UBUNTU-CVE-2026-26960
CVSS 3.1
7.1 HighCVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:N
Updated
2026-11-02
OSVCLSA-2026-1773188129 No score

TuxCare security update for tar (7 CVEs)

TuxCare rebuilt tar to address 7 CVEs. Fixed in 2.2.2-tuxcare.1.

Record
CLSA-2026-1773188129
Updated
2026-11-02
OSVCLSA-2026-1773533794 No score

TuxCare security update for tar (6 CVEs)

TuxCare rebuilt tar to address 6 CVEs. Fixed in 6.2.1-tuxcare.1.

Record
CLSA-2026-1773533794
Updated
2026-11-02
OSVCLSA-2026-1773706632 No score

TuxCare security update for tar (4 CVEs)

TuxCare rebuilt tar to address 4 CVEs. Fixed in 1.0.3-tuxcare.2.

Record
CLSA-2026-1773706632
Updated
2026-11-02
OSVCLSA-2026-1783904631 No score

TuxCare security update for tar (3 CVEs)

TuxCare rebuilt tar to address 3 CVEs. Fixed in 6.1.15-tuxcare.1.

Record
CLSA-2026-1783904631
Updated
2026-11-02
OSVCLSA-2026-1784509856 No score

TuxCare security update for tar (2 CVEs)

TuxCare rebuilt tar to address 2 CVEs. Fixed in 6.2.0-tuxcare.2.

Record
CLSA-2026-1784509856
Updated
2026-11-02
OSVCLSA-2026-1787823954 No score

TuxCare security update for tar (4 CVEs)

TuxCare rebuilt tar to address 4 CVEs. Fixed in 6.1.15-tuxcare.1.

Record
CLSA-2026-1787823954
Updated
2026-11-02
OSVCLSA-2026-1787916963 No score

TuxCare security update for tar (5 CVEs)

TuxCare rebuilt tar to address 5 CVEs. Fixed in 6.2.0-tuxcare.2.

Record
CLSA-2026-1787916963
Updated
2026-11-02
OSVCLSA-2026-1792074305 No score

TuxCare security update for tar (12 CVEs)

TuxCare rebuilt tar to address 12 CVEs. Fixed in 6.0.2-tuxcare.6.

Record
CLSA-2026-1792074305
Updated
2026-11-02
OSVCLSA-2026-1792164662 No score

TuxCare security update for tar (8 CVEs)

TuxCare rebuilt tar to address 8 CVEs. Fixed in 6.1.6-tuxcare.1.

Record
CLSA-2026-1792164662
Updated
2026-11-02
OSVCLSA-2026-1792369404 No score

TuxCare security update for tar (9 CVEs)

TuxCare rebuilt tar to address 9 CVEs. Fixed in 6.1.0-tuxcare.2.

Record
CLSA-2026-1792369404
Updated
2026-11-02
OSVCLSA-2026-1793307830 No score

TuxCare security update for tar (11 CVEs)

TuxCare rebuilt tar to address 11 CVEs. Fixed in 4.4.19-tuxcare.5.

Record
CLSA-2026-1793307830
Updated
2026-11-02

Affected products

Affected packages

Affected packages
PackageAffectedFixed
tar
npm
before 7.5.8
7.5.8
tar
TuxCare:npm
From an advisory covering 7 CVEs
2.2.2-tuxcare.0 up to 2.2.2-tuxcare.1, plus listed versions
2.2.2
2.2.2-tuxcare.1
tar
TuxCare:npm
From an advisory covering 6 CVEs
6.2.1-tuxcare.0 up to 6.2.1-tuxcare.1, plus listed versions
6.2.1
6.2.1-tuxcare.1
tar
TuxCare:npm
From an advisory covering 4 CVEs
1.0.3-tuxcare.0 up to 1.0.3-tuxcare.2, plus listed versions
1.0.31.0.3-tuxcare.1
1.0.3-tuxcare.2
tar
TuxCare:npm
From an advisory covering 3 CVEs
6.1.15-tuxcare.0 up to 6.1.15-tuxcare.1, plus listed versions
6.1.15
6.1.15-tuxcare.1
tar
TuxCare:npm
From an advisory covering 2 CVEs
6.2.0-tuxcare.0 up to 6.2.0-tuxcare.2, plus listed versions
6.2.06.2.0-tuxcare.1
6.2.0-tuxcare.2
tar
TuxCare:npm
From an advisory covering 11 CVEs
6.0.2-tuxcare.0 up to 6.0.2-tuxcare.6, plus listed versions
6.0.26.0.2-tuxcare.16.0.2-tuxcare.26.0.2-tuxcare.36.0.2-tuxcare.46.0.2-tuxcare.5
6.0.2-tuxcare.6
tar
TuxCare:npm
From an advisory covering 8 CVEs
6.1.6-tuxcare.0 up to 6.1.6-tuxcare.1, plus listed versions
6.1.6
6.1.6-tuxcare.1
tar
TuxCare:npm
From an advisory covering 9 CVEs
6.1.0-tuxcare.0 up to 6.1.0-tuxcare.2, plus listed versions
6.1.06.1.0-tuxcare.1
6.1.0-tuxcare.2
tar
TuxCare:npm
From an advisory covering 10 CVEs
4.4.19-tuxcare.0 up to 4.4.19-tuxcare.5, plus listed versions
4.4.194.4.19-tuxcare.14.4.19-tuxcare.24.4.19-tuxcare.34.4.19-tuxcare.4
4.4.19-tuxcare.5
Show 14 moreShow less
Affected packages
PackageAffectedFixed
node-tar
Debian:12
before 6.1.13+~cs7.0.5-1+deb12u1, plus listed versions
6.1.13+~cs7.0.5-1
6.1.13+~cs7.0.5-1+deb12u1
node-tar
Debian:13
before 6.2.1+~cs7.0.8-1+deb13u1, plus listed versions
6.2.1+~cs7.0.8-1
6.2.1+~cs7.0.8-1+deb13u1
node-tar
Debian:14
before 6.2.1+ds1+~cs6.1.13-8, plus listed versions
6.2.1+ds1+~cs6.1.13-16.2.1+ds1+~cs6.1.13-26.2.1+ds1+~cs6.1.13-36.2.1+ds1+~cs6.1.13-46.2.1+ds1+~cs6.1.13-56.2.1+ds1+~cs6.1.13-66.2.1+ds1+~cs6.1.13-76.2.1+~cs7.0.8-1
6.2.1+ds1+~cs6.1.13-8
tar
Root:npm
before 6.1.11-aikido.10
6.1.11-aikido.107.5.1-aikido.127.5.7-aikido.44.4.19-aikido.36.2.1-aikido.87.4.3-aikido.86.2.0-aikido.106.1.13-aikido.36.1.11-aikido.47.5.1-aikido.96.1.14-aikido.36.1.11-aikido.56.1.11-aikido.64.4.19-aikido.47.5.1-aikido.106.2.1-aikido.96.1.15-aikido.16.1.15-aikido.26.1.15-aikido.36.1.11-aikido.76.1.14-aikido.46.1.11-aikido.86.2.1-aikido.104.4.19-aikido.57.4.3-aikido.96.2.1-aikido.116.1.11-aikido.94.4.19-aikido.67.4.3-aikido.106.1.14-aikido.57.5.1-aikido.116.1.13-aikido.44.4.19-aikido.76.2.1-aikido.126.1.13-aikido.56.1.14-aikido.67.4.3-aikido.116.1.13-aikido.66.1.13-aikido.76.1.13-aikido.87.4.3-aikido.124.4.13-aikido.16.2.0-aikido.116.1.15-aikido.47.5.7-aikido.57.5.7-aikido.6
@rootio/tar
Root:npm
before 6.2.1-root.io.4
6.2.1-root.io.47.5.7-root.io.17.5.1-root.io.57.4.3-root.io.46.2.0-root.io.66.1.11-root.io.16.1.13-root.io.16.2.1-root.io.56.1.14-root.io.16.2.1-root.io.66.2.0-root.io.77.4.3-root.io.57.5.1-root.io.66.2.1-root.io.77.5.7-root.io.26.1.11-root.io.27.4.3-root.io.67.5.1-root.io.76.2.0-root.io.87.4.3-root.io.77.5.1-root.io.86.2.0-root.io.96.1.13-root.io.26.1.14-root.io.27.5.7-root.io.36.1.11-root.io.36.1.11-root.io.104.4.19-root.io.27.5.1-root.io.127.5.7-root.io.44.4.19-root.io.36.2.1-root.io.87.4.3-root.io.86.2.0-root.io.106.1.13-root.io.36.1.11-root.io.47.5.1-root.io.96.1.14-root.io.36.1.11-root.io.56.1.11-root.io.64.4.19-root.io.47.5.1-root.io.106.2.1-root.io.96.1.15-root.io.16.1.15-root.io.26.1.15-root.io.36.1.11-root.io.76.1.14-root.io.46.1.11-root.io.86.2.1-root.io.104.4.19-root.io.57.4.3-root.io.96.2.1-root.io.116.1.11-root.io.94.4.19-root.io.67.4.3-root.io.106.1.14-root.io.57.5.1-root.io.116.1.13-root.io.44.4.19-root.io.76.2.1-root.io.126.1.13-root.io.56.1.14-root.io.67.4.3-root.io.116.1.13-root.io.66.1.13-root.io.76.1.13-root.io.87.4.3-root.io.124.4.13-root.io.16.2.0-root.io.116.1.15-root.io.47.5.7-root.io.57.5.7-root.io.6
node-tar
Ubuntu:Pro:14.04:LTS
All versions, plus listed versions
0.1.18-10.1.18-1ubuntu0.1~esm1
None known
node-tar
Ubuntu:Pro:16.04:LTS
All versions, plus listed versions
1.0.3-21.0.3-2ubuntu0.1~esm1
None known
node-tar
Ubuntu:18.04:LTS
All versions, plus listed versions
2.2.1-1
None known
node-tar
Ubuntu:Pro:20.04:LTS
All versions, plus listed versions
4.4.10+ds1-24.4.10+ds1-2ubuntu14.4.10+ds1-2ubuntu1+esm1
None known
node-tar
Ubuntu:22.04:LTS
All versions, plus listed versions
6.1.7+~cs11.3.10-16.1.11+~cs11.3.10-16.1.11+ds1+~cs6.0.6-1
None known
node-tar
Ubuntu:24.04:LTS
All versions, plus listed versions
6.1.13+~cs7.0.5-16.1.13+~cs7.0.5-3
None known
node-tar
Ubuntu:25.10
All versions, plus listed versions
6.2.1+~cs7.0.8-1
None known
node-tar
Ubuntu:26.10
All versions, plus listed versions
6.2.1+ds1+~cs6.1.13-107.5.22+~4.0.1-1
None known
node-tar
Ubuntu:26.04:LTS
All versions, plus listed versions
6.2.1+~cs7.0.8-16.2.1+ds1+~cs6.1.13-66.2.1+ds1+~cs6.1.13-76.2.1+ds1+~cs6.1.13-10
None known

History

History
RecordedChangedSources
affected, facts
affectedOSV
affected
first indexedCVE List, EUVD, GitHub Advisories, NVD, OSV

Dates are when Every CVE recorded each change. Upstream dates may differ.

In short

CVE-2026-26960 is a high vulnerability (CVSS 7.1) in Isaacs Node-tar, published February 18, 2026. No source lists public exploit code. EPSS puts the chance of exploitation in the next 30 days at 0.33%, the 26th percentile. Fixed in tar 7.5.8.

References

Show 4 moreShow less
MoveEnter Open