CVE-2026-26960
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.
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
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 High
CVSS: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 High
CVSS: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:
a/b/c/up -> ../..a/b/escape -> c/up/../..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
STRIPABSOLUTEPATHlogic 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
- See
-
Hardlink extraction resolves target as
path.resolve(cwd, entry.linkpath)and then callsfs.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:
-
Prepare/locate a
tarmodule. Ifrequire('tar')is not available locally, setTAR_MODULEto an absolute path to a tar package directory. -
Run:
TAR_MODULE="$(cd '../tar-audit-setuid - CVE/node_modules/tar' && pwd)" node hardlink.js
- Expected vulnerable output (key lines):
same_inode=true
read_ok=true
write_ok=true
result=VULNERABLE
Interpretation:
same_inode=true: extractedexfiland external secret are the same file object.read_ok=true: readingexfilleaks external content.write_ok=true: writingexfilmodifies 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
tardefaults. - 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 High
CVSS: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 High
CVSS: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 High
CVSS: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 High
CVSS: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:
a/b/c/up -> ../..a/b/escape -> c/up/../..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
STRIPABSOLUTEPATHlogic 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
- See
-
Hardlink extraction resolves target as
path.resolve(cwd, entry.linkpath)and then callsfs.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:
-
Prepare/locate a
tarmodule. Ifrequire('tar')is not available locally, setTAR_MODULEto an absolute path to a tar package directory. -
Run:
TAR_MODULE="$(cd '../tar-audit-setuid - CVE/node_modules/tar' && pwd)" node hardlink.js
- Expected vulnerable output (key lines):
same_inode=true
read_ok=true
write_ok=true
result=VULNERABLE
Interpretation:
same_inode=true: extractedexfiland external secret are the same file object.read_ok=true: readingexfilleaks external content.write_ok=true: writingexfilmodifies 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
tardefaults. - 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 High
CVSS: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 High
CVSS: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 High
CVSS: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
| Package | Affected | Fixed |
|---|---|---|
tarnpm |
before 7.5.8 | 7.5.8 |
tarTuxCare: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 |
tarTuxCare: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 |
tarTuxCare: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 |
tarTuxCare: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 |
tarTuxCare: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 |
tarTuxCare: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 |
tarTuxCare: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 |
tarTuxCare: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 |
tarTuxCare: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
| Package | Affected | Fixed |
|---|---|---|
node-tarDebian: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-tarDebian: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-tarDebian: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 |
tarRoot: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/tarRoot: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-tarUbuntu:Pro:14.04:LTS |
All versions, plus listed versions 0.1.18-10.1.18-1ubuntu0.1~esm1 |
None known |
node-tarUbuntu:Pro:16.04:LTS |
All versions, plus listed versions 1.0.3-21.0.3-2ubuntu0.1~esm1 |
None known |
node-tarUbuntu:18.04:LTS |
All versions, plus listed versions 2.2.1-1 |
None known |
node-tarUbuntu: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-tarUbuntu: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-tarUbuntu:24.04:LTS |
All versions, plus listed versions 6.1.13+~cs7.0.5-16.1.13+~cs7.0.5-3 |
None known |
node-tarUbuntu:25.10 |
All versions, plus listed versions 6.2.1+~cs7.0.8-1 |
None known |
node-tarUbuntu:26.10 |
All versions, plus listed versions 6.2.1+ds1+~cs6.1.13-107.5.22+~4.0.1-1 |
None known |
node-tarUbuntu: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
| Recorded | Changed | Sources |
|---|---|---|
| affected, facts | ||
| affected | OSV | |
| affected | ||
| first indexed | CVE 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
github.com/isaacs/node-tar/security/advisories/GHSA-83g3-92jg-28cx
github.com/isaacs/node-tar/commit/2cb1120bcefe28d7ecc719b41441ade59c52e384
github.com/isaacs/node-tar/commit/d18e4e1f846f4ddddc153b0f536a19c050e7499f
nvd.nist.gov/vuln/detail/CVE-2026-26960
github.com/advisories/GHSA-83g3-92jg-28cx
github.com/CVEProject/cvelistV5/tree/main/cves/2026/26xxx/CVE-2026-26960.json