The npm package tar provides a Node.js implementation for creating, extracting, and manipulating tar archives. Analyzing versions 1.0.2 and 1.0.3 reveals a subtle but important evolution for developers utilizing this fundamental tool. While both versions share identical dependencies, including "fstream" for file system stream handling, "inherits" for prototypal inheritance, and "block-stream" for managing data in blocks, along with the same set of development dependencies used for testing and building, such as "tap," "mkdirp", "rimraf," and "graceful-fs", the core distinguishing factor lies in the release date. Version 1.0.2 was released on October 28, 2014, while version 1.0.3 followed a month later, on November 28, 2014. This implies the newer version incorporates bug fixes, performance enhancements, or minor feature additions implemented during that period. No functional changes are visible in the metadata.
For developers, this means upgrading from 1.0.2 to 1.0.3 likely introduces improvements in stability and reliability. The commitment to maintaining the same dependency footprint ensures a smooth transition with minimal risk of breaking changes. When integrating tar into Node.js projects for tasks like archiving, backup, or deployment, developers should always favour the latest stable version to benefit from these cumulative updates and ensure optimal performance. While the changelog describing the specific updates between these micro-releases would offer greater clarity, the newer release date signifies a step forward in the package's overall quality.
All the vulnerabilities related to the version 1.0.3 of the package
Symlink Arbitrary File Overwrite in tar
Versions of tar
prior to 2.0.0 are affected by an arbitrary file write vulnerability. The vulnerability occurs because tar
does not verify that extracted symbolic links to not resolve to targets outside of the extraction root directory.
Update to version 2.0.0 or later
Arbitrary File Overwrite in tar
Versions of tar
prior to 4.4.2 for 4.x and 2.2.2 for 2.x are vulnerable to Arbitrary File Overwrite. Extracting tarballs containing a hardlink to a file that already exists in the system, and a file that matches the hardlink will overwrite the system's file with the contents of the extracted file.
For tar 4.x, upgrade to version 4.4.2 or later. For tar 2.x, upgrade to version 2.2.2 or later.
Arbitrary File Creation/Overwrite due to insufficient absolute path sanitization
Arbitrary File Creation, Arbitrary File Overwrite, Arbitrary Code Execution
node-tar
aims to prevent extraction of absolute file paths by turning absolute paths into relative paths when the preservePaths
flag is not set to true
. This is achieved by stripping the absolute path root from any absolute file paths contained in a tar file. For example /home/user/.bashrc
would turn into home/user/.bashrc
.
This logic was insufficient when file paths contained repeated path roots such as ////home/user/.bashrc
. node-tar
would only strip a single path root from such paths. When given an absolute file path with repeating path roots, the resulting path (e.g. ///home/user/.bashrc
) would still resolve to an absolute path, thus allowing arbitrary file creation and overwrite.
3.2.2 || 4.4.14 || 5.0.6 || 6.1.1
NOTE: an adjacent issue CVE-2021-32803 affects this release level. Please ensure you update to the latest patch levels that address CVE-2021-32803 as well if this adjacent issue affects your node-tar
use case.
Users may work around this vulnerability without upgrading by creating a custom onentry
method which sanitizes the entry.path
or a filter
method which removes entries with absolute paths.
const path = require('path')
const tar = require('tar')
tar.x({
file: 'archive.tgz',
// either add this function...
onentry: (entry) => {
if (path.isAbsolute(entry.path)) {
entry.path = sanitizeAbsolutePathSomehow(entry.path)
entry.absolute = path.resolve(entry.path)
}
},
// or this one
filter: (file, entry) => {
if (path.isAbsolute(entry.path)) {
return false
} else {
return true
}
}
})
Users are encouraged to upgrade to the latest patch versions, rather than attempt to sanitize tar input themselves.
Arbitrary File Creation/Overwrite on Windows via insufficient relative path sanitization
Arbitrary File Creation, Arbitrary File Overwrite, Arbitrary Code Execution
node-tar aims to guarantee that any file whose location would be outside of the extraction target directory is not extracted. This is, in part, accomplished by sanitizing absolute paths of entries within the archive, skipping archive entries that contain ..
path portions, and resolving the sanitized paths against the extraction target directory.
This logic was insufficient on Windows systems when extracting tar files that contained a path that was not an absolute path, but specified a drive letter different from the extraction target, such as C:some\path
. If the drive letter does not match the extraction target, for example D:\extraction\dir
, then the result of path.resolve(extractionDirectory, entryPath)
would resolve against the current working directory on the C:
drive, rather than the extraction target directory.
Additionally, a ..
portion of the path could occur immediately after the drive letter, such as C:../foo
, and was not properly sanitized by the logic that checked for ..
within the normalized and split portions of the path.
This only affects users of node-tar
on Windows systems.
4.4.18 || 5.0.10 || 6.1.9
There is no reasonable way to work around this issue without performing the same path normalization procedures that node-tar now does.
Users are encouraged to upgrade to the latest patched versions of node-tar, rather than attempt to sanitize paths themselves.
The fixed versions strip path roots from all paths prior to being resolved against the extraction target folder, even if such paths are not "absolute".
Additionally, a path starting with a drive letter and then two dots, like c:../
, would bypass the check for ..
path portions. This is checked properly in the patched versions.
Finally, a defense in depth check is added, such that if the entry.absolute
is outside of the extraction taret, and we are not in preservePaths:true mode, a warning is raised on that entry, and it is skipped. Currently, it is believed that this check is redundant, but it did catch some oversights in development.
Denial of service while parsing a tar file due to lack of folders count validation
During some analysis today on npm's node-tar
package I came across the folder creation process, Basicly if you provide node-tar with a path like this ./a/b/c/foo.txt
it would create every folder and sub-folder here a, b and c until it reaches the last folder to create foo.txt
, In-this case I noticed that there's no validation at all on the amount of folders being created, that said we're actually able to CPU and memory consume the system running node-tar and even crash the nodejs client within few seconds of running it using a path with too many sub-folders inside
You can reproduce this issue by downloading the tar file I provided in the resources and using node-tar to extract it, you should get the same behavior as the video
Here's a video show-casing the exploit:
Denial of service by crashing the nodejs client when attempting to parse a tar archive, make it run out of heap memory and consuming server CPU and memory resources
This report was originally reported to GitHub bug bounty program, they asked me to report it to you a month ago