diff options
| author | Mariusz Felisiak <felisiak.mariusz@gmail.com> | 2021-01-22 12:23:18 +0100 |
|---|---|---|
| committer | Mariusz Felisiak <felisiak.mariusz@gmail.com> | 2021-02-01 09:07:36 +0100 |
| commit | 05413afa8c18cdb978fcdf470e09f7a12b234a23 (patch) | |
| tree | d3672ac9ec790440c7f4fb3984b8c3d40136c8f8 /tests | |
| parent | 6822aa5c6c3fbec7c5393a05e990865ba59fe167 (diff) | |
Fixed CVE-2021-3281 -- Fixed potential directory-traversal via archive.extract().
Thanks Florian Apolloner, Shai Berger, and Simon Charette for reviews.
Thanks Wang Baohua for the report.
Diffstat (limited to 'tests')
| -rw-r--r-- | tests/utils_tests/test_archive.py | 21 | ||||
| -rw-r--r-- | tests/utils_tests/traversal_archives/traversal.tar | bin | 0 -> 10240 bytes | |||
| -rw-r--r-- | tests/utils_tests/traversal_archives/traversal_absolute.tar | bin | 0 -> 10240 bytes | |||
| -rw-r--r-- | tests/utils_tests/traversal_archives/traversal_disk_win.tar | bin | 0 -> 10240 bytes | |||
| -rw-r--r-- | tests/utils_tests/traversal_archives/traversal_disk_win.zip | bin | 0 -> 312 bytes |
5 files changed, 21 insertions, 0 deletions
diff --git a/tests/utils_tests/test_archive.py b/tests/utils_tests/test_archive.py index dc7c4b4ebd..8fdf3ec445 100644 --- a/tests/utils_tests/test_archive.py +++ b/tests/utils_tests/test_archive.py @@ -4,6 +4,8 @@ import sys import tempfile import unittest +from django.core.exceptions import SuspiciousOperation +from django.test import SimpleTestCase from django.utils import archive @@ -45,3 +47,22 @@ class TestArchive(unittest.TestCase): # A file is readable even if permission data is missing. filepath = os.path.join(tmpdir, 'no_permissions') self.assertEqual(os.stat(filepath).st_mode & mask, 0o666 & ~umask) + + +class TestArchiveInvalid(SimpleTestCase): + def test_extract_function_traversal(self): + archives_dir = os.path.join(os.path.dirname(__file__), 'traversal_archives') + tests = [ + ('traversal.tar', '..'), + ('traversal_absolute.tar', '/tmp/evil.py'), + ] + if sys.platform == 'win32': + tests += [ + ('traversal_disk_win.tar', 'd:evil.py'), + ('traversal_disk_win.zip', 'd:evil.py'), + ] + msg = "Archive contains invalid path: '%s'" + for entry, invalid_path in tests: + with self.subTest(entry), tempfile.TemporaryDirectory() as tmpdir: + with self.assertRaisesMessage(SuspiciousOperation, msg % invalid_path): + archive.extract(os.path.join(archives_dir, entry), tmpdir) diff --git a/tests/utils_tests/traversal_archives/traversal.tar b/tests/utils_tests/traversal_archives/traversal.tar Binary files differnew file mode 100644 index 0000000000..07eede517a --- /dev/null +++ b/tests/utils_tests/traversal_archives/traversal.tar diff --git a/tests/utils_tests/traversal_archives/traversal_absolute.tar b/tests/utils_tests/traversal_archives/traversal_absolute.tar Binary files differnew file mode 100644 index 0000000000..231566b069 --- /dev/null +++ b/tests/utils_tests/traversal_archives/traversal_absolute.tar diff --git a/tests/utils_tests/traversal_archives/traversal_disk_win.tar b/tests/utils_tests/traversal_archives/traversal_disk_win.tar Binary files differnew file mode 100644 index 0000000000..97f0b95501 --- /dev/null +++ b/tests/utils_tests/traversal_archives/traversal_disk_win.tar diff --git a/tests/utils_tests/traversal_archives/traversal_disk_win.zip b/tests/utils_tests/traversal_archives/traversal_disk_win.zip Binary files differnew file mode 100644 index 0000000000..e5ab208398 --- /dev/null +++ b/tests/utils_tests/traversal_archives/traversal_disk_win.zip |
