Working draft

N12 name-absolute

An absolute name, which points outside the directory the archive is extracted to.

Reject(draft) A strict parser must reject this archive.

Category
name
Default policy
rejects it
Files
N12-name-absolute.tar test archive, 2,048 bytes sha256 d926d96c8236e0e7970c9e94439bba340bac8045367d65544e04d8abdd32effe
N12-name-absolute.jsonexpected result
N12-name-absolute.txtannotated blocks
N12-name-absolute.pygenerator script

The case

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.

The archive

Every block of 512 bytes, to scale, with its offset. Hover over a field for its bytes.

N12-name-absolute: every block of the archive0x000000header: regular filename [0,100): "/tmp/tar-minefield-absolute" + 73 NULnamemode [100,108): "0000644" + NUL, 644 (octal)uid [108,116): "0000000" + NUL, 0gid [116,124): "0000000" + NUL, 0size [124,136): "00000000131" + NUL, 89mtime [136,148): "00000000000" + NUL, 0chksum [148,156): "014336\0 ", 6366: the unsigned sum of the header, this field as spacestypeflag [156,157): "0", regular filelinkname [157,257): 100 NULlinknamemagic [257,263): "ustar" + NULversion [263,265): "00"uname [265,297): 32 NULunamegname [297,329): 32 NULgnamedevmajor [329,337): "0000000" + NUL, 0devminor [337,345): "0000000" + NUL, 0prefix [345,500): 155 NULprefixpad [500,512): 12 NULname "/tmp/tar-minefield-absolute" + 73 NUL0x000200data89 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""If this file is outside the directory you extracted to, the extractor followed the name.\n"0x0004002 zero blocks: the end-of-archive markerbytes 0 to 512 of 1024: 512 NUL0x0006002 zero blocks, continuedbytes 512 to 1024 of 1024: 512 NUL0x000800end of fileNULprintable ASCIIspacecontrol character, such as a newlinebyte over 0x7fwritten by the case itself
Every block, as text
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
Every byte, as a hex dump

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  ................

What implementations make of it

implementationversionoutcomewhat it makes of it
GNU tartar (GNU tar) 1.35⚠️ acceptstree A: tmp/, tmp/tar-minefield-absolute (89 B, 3b7f22a5)
bsdtarbsdtar 3.8.10 - libarchive 3.8.10⚠️ acceptstree A: tmp/, tmp/tar-minefield-absolute (89 B, 3b7f22a5)
BusyBox tarBusyBox v1.38.0, defconfig⚠️ acceptstree A: tmp/, tmp/tar-minefield-absolute (89 B, 3b7f22a5)
7-Zip7-Zip (z) 26.05 (x64)⚠️ acceptstree A: tmp/, tmp/tar-minefield-absolute (89 B, 3b7f22a5)
Python tarfile, filter=data, as in pipCPython 3.15.2⚠️ acceptstree A: tmp/, tmp/tar-minefield-absolute (89 B, 3b7f22a5)
Python tarfile, filter=tarCPython 3.15.2⚠️ acceptstree A: tmp/, tmp/tar-minefield-absolute (89 B, 3b7f22a5)
Python tarfile, filter=fully_trustedCPython 3.15.2💥 writes outside the destinationwrites outside: /tmp/tar-minefield-absolute (89 B, 3b7f22a5)
node-tartar 7.5.22⚠️ acceptstree A: tmp/, tmp/tar-minefield-absolute (89 B, 3b7f22a5)
node-tar, stricttar 7.5.22✅ as the verdict sayserror: Error: TAR_ENTRY_INFO: stripping / from absolute path
tar-fstar-fs 3.1.3, on tar-stream 3.2.2⚠️ acceptstree A: tmp/, tmp/tar-minefield-absolute (89 B, 3b7f22a5)
Java Commons CompressCommons Compress 1.28.0, Expander, on Java 27.0.1.0.2✅ as the verdict sayserror: java.io.IOException: Zip slip 'DEST' + '/tmp/tar-minefield-absolute' -> '/tmp/tar-minefield-absolute'
.NET System.Formats.TarSystem.Formats.Tar of .NET 10.0.14, ExtractToDirectory✅ as the verdict sayserror: 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 ComposerPharData of PHP 8.5.12, as Composer's TarDownloader calls it⚠️ acceptstree A: tmp/, tmp/tar-minefield-absolute (89 B, 3b7f22a5)
Go containerd archive.Applycontainerd v2.4.2, archive.Apply, of go1.27.3⚠️ acceptstree A: tmp/, tmp/tar-minefield-absolute (89 B, 3b7f22a5)
Rust tartar 0.4.46, unpack⚠️ acceptstree A: tmp/, tmp/tar-minefield-absolute (89 B, 3b7f22a5)
Rust astral-tokio-tarastral-tokio-tar 0.7.0, unpack⚠️ acceptstree A: tmp/, tmp/tar-minefield-absolute (89 B, 3b7f22a5)
Rust tar-codec, as in uvtar-codec 0.0.15, with the policies of uv 0.13✅ as the verdict sayserror: at byte 0: unsafe member path "/tmp/tar-minefield-absolute": is absolute
RubyGemsRubyGems 4.0.20 of Ruby 4.0.9, extract_tar_gz✅ as the verdict sayserror: Gem::Package::PathError: installing into parent path /tmp/tar-minefield-absolute of DEST is not allowed
R untar, internalutils::untar of R 4.6.1, tar = "internal"⚠️ acceptstree A: tmp/, tmp/tar-minefield-absolute (89 B, 3b7f22a5)
Perl Archive::TarArchive::Tar 3.12 of Perl v5.44.0✅ as the verdict sayserror: 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 tartar 0.7.2.0, extract, of GHC 9.14✅ as the verdict sayserror: Absolute file name in tar archive: "/tmp/tar-minefield-absolute"
Julia Tar.jlTar 1.10.0 of Julia 1.13.3✅ as the verdict sayserror: path is absolute Tar.Header("/tmp/tar-minefield-absolute", :file, 0o644, 89, "")
live-bootstrap untarmescc-tools-extra a151c245e512, as live-bootstrap pins it, built with cc💥 writes outside the destinationwrites outside: /tmp/tar-minefield-absolute (89 B, 3b7f22a5)
live-bootstrap untar, --non-strictmescc-tools-extra a151c245e512, as live-bootstrap pins it, built with cc💥 writes outside the destinationwrites outside: /tmp/tar-minefield-absolute (89 B, 3b7f22a5)

Prevalence in release tarballs

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.

ecosystemtarballswith itshare
Spack37,5531<0.01%
nixpkgs18,9901<0.01%
Guix10,1680none
PyPI10,0000none
crates.io5,0000none
RubyGems5,00010.02%
live-bootstrap1710none
total (distinct)82,5863<0.01%

See the list of these 3 tarballs, with the sha256 of each and an example from it.