N12 name-absoluteAn absolute name, which points outside the directory the archive is extracted to.
Reject(draft) A strict parser must reject this archive.
N12-name-absolute.tar |
test archive, 2,048 bytes
sha256 d926d96c8236e0e7970c9e94439bba340bac8045367d65544e04d8abdd32effe |
N12-name-absolute.json | expected result |
N12-name-absolute.txt | annotated blocks |
N12-name-absolute.py | generator script |
The name /tmp/tar-minefield-absolute is a path from the root. The case is rejected because the name, taken as it is, leads out of the destination, not because it is ambiguous. The file is harmless, and in /tmp, so that an extractor that follows the name writes it without running as root.
Decision point: whether an absolute name is rejected, made relative, or followed.
Seen in: dtv-scan-tables (/usr/share/dvb/) and masurca 3.3.1.
Every block of 512 bytes, to scale, with its offset. Hover over a field for its bytes.
N12-name-absolute: must reject
An absolute name, which points outside the directory the archive is extracted to.
The name `/tmp/tar-minefield-absolute` is a path from the root. The case is rejected because the
name, taken as it is, leads out of the destination, not because it is ambiguous. The file is
harmless, and in `/tmp`, so that an extractor that follows the name writes it without running as
root.
Decision point: whether an absolute name is rejected, made relative, or followed.
Seen in: dtv-scan-tables (`/usr/share/dvb/`) and masurca 3.3.1.
0x000000 header: regular file
name [ 0,100) "/tmp/tar-minefield-absolute" + 73 NUL
mode [100,108) "0000644" + NUL 644 (octal)
uid [108,116) "0000000" + NUL 0
gid [116,124) "0000000" + NUL 0
size [124,136) "00000000131" + NUL 89
mtime [136,148) "00000000000" + NUL 0
chksum [148,156) "014336\0 " 6366: the unsigned sum of the header, this field as spaces
typeflag [156,157) "0" regular file
linkname [157,257) 100 NUL
magic [257,263) "ustar" + NUL
version [263,265) "00"
uname [265,297) 32 NUL
gname [297,329) 32 NUL
devmajor [329,337) "0000000" + NUL 0
devminor [337,345) "0000000" + NUL 0
prefix [345,500) 155 NUL
pad [500,512) 12 NUL
0x000200 data
89 bytes, then 423 NUL to the end of the block
"If this file is outside the directory you extracted to, the extractor followed the name.\n"
0x000400 2 zero blocks: the end-of-archive marker
0x000800 end of file
As xxd writes it: xxd -r makes the archive of it.
00000000: 2f74 6d70 2f74 6172 2d6d 696e 6566 6965 /tmp/tar-minefie 00000010: 6c64 2d61 6273 6f6c 7574 6500 0000 0000 ld-absolute..... 00000020: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000030: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000040: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000050: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000060: 0000 0000 3030 3030 3634 3400 3030 3030 ....0000644.0000 00000070: 3030 3000 3030 3030 3030 3000 3030 3030 000.0000000.0000 00000080: 3030 3030 3133 3100 3030 3030 3030 3030 0000131.00000000 00000090: 3030 3000 3031 3433 3336 0020 3000 0000 000.014336. 0... 000000a0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000000b0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000000c0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000000d0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000000e0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000000f0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000100: 0075 7374 6172 0030 3000 0000 0000 0000 .ustar.00....... 00000110: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000120: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000130: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000140: 0000 0000 0000 0000 0030 3030 3030 3030 .........0000000 00000150: 0030 3030 3030 3030 0000 0000 0000 0000 .0000000........ 00000160: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000170: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000180: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000190: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000001a0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000001b0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000001c0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000001d0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000001e0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000001f0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000200: 4966 2074 6869 7320 6669 6c65 2069 7320 If this file is 00000210: 6f75 7473 6964 6520 7468 6520 6469 7265 outside the dire 00000220: 6374 6f72 7920 796f 7520 6578 7472 6163 ctory you extrac 00000230: 7465 6420 746f 2c20 7468 6520 6578 7472 ted to, the extr 00000240: 6163 746f 7220 666f 6c6c 6f77 6564 2074 actor followed t 00000250: 6865 206e 616d 652e 0a00 0000 0000 0000 he name......... 00000260: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000270: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000280: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000290: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000002a0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000002b0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000002c0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000002d0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000002e0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000002f0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000300: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000310: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000320: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000330: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000340: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000350: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000360: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000370: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000380: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000390: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000003a0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000003b0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000003c0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000003d0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000003e0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000003f0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000400: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000410: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000420: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000430: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000440: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000450: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000460: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000470: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000480: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000490: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000004a0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000004b0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000004c0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000004d0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000004e0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000004f0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000500: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000510: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000520: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000530: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000540: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000550: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000560: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000570: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000580: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000590: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000005a0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000005b0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000005c0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000005d0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000005e0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000005f0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000600: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000610: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000620: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000630: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000640: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000650: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000660: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000670: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000680: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000690: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000006a0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000006b0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000006c0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000006d0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000006e0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000006f0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000700: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000710: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000720: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000730: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000740: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000750: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000760: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000770: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000780: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000790: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000007a0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000007b0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000007c0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000007d0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000007e0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000007f0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
| implementation | version | outcome | what it makes of it |
|---|---|---|---|
| GNU tar | tar (GNU tar) 1.35 | ⚠️ accepts | tree A: tmp/, tmp/tar-minefield-absolute (89 B, 3b7f22a5) |
| bsdtar | bsdtar 3.8.10 - libarchive 3.8.10 | ⚠️ accepts | tree A: tmp/, tmp/tar-minefield-absolute (89 B, 3b7f22a5) |
| BusyBox tar | BusyBox v1.38.0, defconfig | ⚠️ accepts | tree A: tmp/, tmp/tar-minefield-absolute (89 B, 3b7f22a5) |
| 7-Zip | 7-Zip (z) 26.05 (x64) | ⚠️ accepts | tree A: tmp/, tmp/tar-minefield-absolute (89 B, 3b7f22a5) |
| Python tarfile, filter=data, as in pip | CPython 3.15.2 | ⚠️ accepts | tree A: tmp/, tmp/tar-minefield-absolute (89 B, 3b7f22a5) |
| Python tarfile, filter=tar | CPython 3.15.2 | ⚠️ accepts | tree A: tmp/, tmp/tar-minefield-absolute (89 B, 3b7f22a5) |
| Python tarfile, filter=fully_trusted | CPython 3.15.2 | 💥 writes outside the destination | writes outside: /tmp/tar-minefield-absolute (89 B, 3b7f22a5) |
| node-tar | tar 7.5.22 | ⚠️ accepts | tree A: tmp/, tmp/tar-minefield-absolute (89 B, 3b7f22a5) |
| node-tar, strict | tar 7.5.22 | ✅ as the verdict says | error: Error: TAR_ENTRY_INFO: stripping / from absolute path |
| tar-fs | tar-fs 3.1.3, on tar-stream 3.2.2 | ⚠️ accepts | tree A: tmp/, tmp/tar-minefield-absolute (89 B, 3b7f22a5) |
| Java Commons Compress | Commons Compress 1.28.0, Expander, on Java 27.0.1.0.2 | ✅ as the verdict says | error: java.io.IOException: Zip slip 'DEST' + '/tmp/tar-minefield-absolute' -> '/tmp/tar-minefield-absolute' |
| .NET System.Formats.Tar | System.Formats.Tar of .NET 10.0.14, ExtractToDirectory | ✅ as the verdict says | error: IOException: Extracting the Tar entry '/tmp/tar-minefield-absolute' would have resulted in a file outside the specified destination directory: 'DEST/' |
| PHP PharData, as in Composer | PharData of PHP 8.5.12, as Composer's TarDownloader calls it | ⚠️ accepts | tree A: tmp/, tmp/tar-minefield-absolute (89 B, 3b7f22a5) |
| Go containerd archive.Apply | containerd v2.4.2, archive.Apply, of go1.27.3 | ⚠️ accepts | tree A: tmp/, tmp/tar-minefield-absolute (89 B, 3b7f22a5) |
| Rust tar | tar 0.4.46, unpack | ⚠️ accepts | tree A: tmp/, tmp/tar-minefield-absolute (89 B, 3b7f22a5) |
| Rust astral-tokio-tar | astral-tokio-tar 0.7.0, unpack | ⚠️ accepts | tree A: tmp/, tmp/tar-minefield-absolute (89 B, 3b7f22a5) |
| Rust tar-codec, as in uv | tar-codec 0.0.15, with the policies of uv 0.13 | ✅ as the verdict says | error: at byte 0: unsafe member path "/tmp/tar-minefield-absolute": is absolute |
| RubyGems | RubyGems 4.0.20 of Ruby 4.0.9, extract_tar_gz | ✅ as the verdict says | error: Gem::Package::PathError: installing into parent path /tmp/tar-minefield-absolute of DEST is not allowed |
| R untar, internal | utils::untar of R 4.6.1, tar = "internal" | ⚠️ accepts | tree A: tmp/, tmp/tar-minefield-absolute (89 B, 3b7f22a5) |
| Perl Archive::Tar | Archive::Tar 3.12 of Perl v5.44.0 | ✅ as the verdict says | error: Entry '/tmp/tar-minefield-absolute' is an absolute path. Not extracting absolute paths under SECURE EXTRACT MODE at contrib/matrix/runners/perl/extract.pl line 14. Could not extract '/tmp/tar-minefie… |
| Haskell tar | tar 0.7.2.0, extract, of GHC 9.14 | ✅ as the verdict says | error: Absolute file name in tar archive: "/tmp/tar-minefield-absolute" |
| Julia Tar.jl | Tar 1.10.0 of Julia 1.13.3 | ✅ as the verdict says | error: path is absolute Tar.Header("/tmp/tar-minefield-absolute", :file, 0o644, 89, "") |
| live-bootstrap untar | mescc-tools-extra a151c245e512, as live-bootstrap pins it, built with cc | 💥 writes outside the destination | writes outside: /tmp/tar-minefield-absolute (89 B, 3b7f22a5) |
| live-bootstrap untar, --non-strict | mescc-tools-extra a151c245e512, as live-bootstrap pins it, built with cc | 💥 writes outside the destination | writes outside: /tmp/tar-minefield-absolute (89 B, 3b7f22a5) |
Release tarballs of Spack, nixpkgs, Guix and live-bootstrap, and samples of PyPI, crates.io and RubyGems with name.absolute. The default policy rejects all of them.
| ecosystem | tarballs | with it | share |
|---|---|---|---|
| Spack | 37,553 | 1 | <0.01% |
| nixpkgs | 18,990 | 1 | <0.01% |
| Guix | 10,168 | 0 | none |
| PyPI | 10,000 | 0 | none |
| crates.io | 5,000 | 0 | none |
| RubyGems | 5,000 | 1 | 0.02% |
| live-bootstrap | 171 | 0 | none |
| total (distinct) | 82,586 | 3 | <0.01% |
See the list of these 3 tarballs, with the sha256 of each and an example from it.