summaryrefslogtreecommitdiff
path: root/tests/utils_tests/test_archive.py
diff options
context:
space:
mode:
authorMariusz Felisiak <felisiak.mariusz@gmail.com>2021-01-22 12:23:18 +0100
committerMariusz Felisiak <felisiak.mariusz@gmail.com>2021-02-01 09:14:22 +0100
commit52e409ed17287e9aabda847b6afe58be2fa9f86a (patch)
treea18a930cde1bf98db732b69635558a6a4db650b7 /tests/utils_tests/test_archive.py
parent74ca3cac3272b3a9df6a351095fe4117d0cf2608 (diff)
[3.0.x] 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. Backport of 05413afa8c18cdb978fcdf470e09f7a12b234a23 from master.
Diffstat (limited to 'tests/utils_tests/test_archive.py')
-rw-r--r--tests/utils_tests/test_archive.py21
1 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)