mirror of https://github.com/python/cpython.git
[3.9] gh-99889: Fix directory traversal security flaw in uu.decode() (GH-104096) (#104331)
(cherry picked from commit 0aeda29793
)
Co-authored-by: Sam Carroll <70000253+samcarroll42@users.noreply.github.com>
This commit is contained in:
parent
b53d0ff431
commit
3d5dd1eee2
|
@ -145,6 +145,34 @@ def test_newlines_escaped(self):
|
|||
uu.encode(inp, out, filename)
|
||||
self.assertIn(safefilename, out.getvalue())
|
||||
|
||||
def test_no_directory_traversal(self):
|
||||
relative_bad = b"""\
|
||||
begin 644 ../../../../../../../../tmp/test1
|
||||
$86)C"@``
|
||||
`
|
||||
end
|
||||
"""
|
||||
with self.assertRaisesRegex(uu.Error, 'directory'):
|
||||
uu.decode(io.BytesIO(relative_bad))
|
||||
if os.altsep:
|
||||
relative_bad_bs = relative_bad.replace(b'/', b'\\')
|
||||
with self.assertRaisesRegex(uu.Error, 'directory'):
|
||||
uu.decode(io.BytesIO(relative_bad_bs))
|
||||
|
||||
absolute_bad = b"""\
|
||||
begin 644 /tmp/test2
|
||||
$86)C"@``
|
||||
`
|
||||
end
|
||||
"""
|
||||
with self.assertRaisesRegex(uu.Error, 'directory'):
|
||||
uu.decode(io.BytesIO(absolute_bad))
|
||||
if os.altsep:
|
||||
absolute_bad_bs = absolute_bad.replace(b'/', b'\\')
|
||||
with self.assertRaisesRegex(uu.Error, 'directory'):
|
||||
uu.decode(io.BytesIO(absolute_bad_bs))
|
||||
|
||||
|
||||
class UUStdIOTest(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
|
|
|
@ -130,7 +130,14 @@ def decode(in_file, out_file=None, mode=None, quiet=False):
|
|||
# If the filename isn't ASCII, what's up with that?!?
|
||||
out_file = hdrfields[2].rstrip(b' \t\r\n\f').decode("ascii")
|
||||
if os.path.exists(out_file):
|
||||
raise Error('Cannot overwrite existing file: %s' % out_file)
|
||||
raise Error(f'Cannot overwrite existing file: {out_file}')
|
||||
if (out_file.startswith(os.sep) or
|
||||
f'..{os.sep}' in out_file or (
|
||||
os.altsep and
|
||||
(out_file.startswith(os.altsep) or
|
||||
f'..{os.altsep}' in out_file))
|
||||
):
|
||||
raise Error(f'Refusing to write to {out_file} due to directory traversal')
|
||||
if mode is None:
|
||||
mode = int(hdrfields[1], 8)
|
||||
#
|
||||
|
|
|
@ -0,0 +1,2 @@
|
|||
Fixed a security in flaw in :func:`uu.decode` that could allow for
|
||||
directory traversal based on the input if no ``out_file`` was specified.
|
Loading…
Reference in New Issue