VYPR
Low severityNVD Advisory· Published Oct 1, 2025· Updated Nov 4, 2025

CVE-2025-59682

CVE-2025-59682

Description

An issue was discovered in Django 4.2 before 4.2.25, 5.1 before 5.1.13, and 5.2 before 5.2.7. The django.utils.archive.extract() function, used by the "startapp --template" and "startproject --template" commands, allows partial directory traversal via an archive with file paths sharing a common prefix with the target directory.

Affected packages

Versions sourced from the GitHub Security Advisory.

PackageAffected versionsPatched versions
djangoPyPI
>= 4.2, < 4.2.254.2.25
djangoPyPI
>= 5.1, < 5.1.135.1.13
djangoPyPI
>= 5.2, < 5.2.75.2.7

Affected products

1

Patches

2
43d84aef04a9

Added CVE-2025-59681 and CVE-2025-59682 to security archive.

https://github.com/django/djangoJacob WallsOct 1, 2025via ghsa
1 file changed · +24 0
  • docs/releases/security.txt+24 0 modified
    @@ -36,6 +36,30 @@ Issues under Django's security process
     All security issues have been handled under versions of Django's security
     process. These are listed below.
     
    +October 1, 2025 - :cve:`2025-59681`
    +-----------------------------------
    +
    +Potential SQL injection in ``QuerySet.annotate()``, ``alias()``, ``aggregate()``, and ``extra()`` on MySQL and MariaDB.
    +`Full description
    +<https://www.djangoproject.com/weblog/2025/oct/01/security-releases/>`__
    +
    +* Django 6.0 :commit:`(patch) <4ceaaee7e04b416fc465e838a6ef43ca0ccffafe>`
    +* Django 5.2 :commit:`(patch) <52fbae0a4dbbe5faa59827f8f05694a0065cc135>`
    +* Django 5.1 :commit:`(patch) <01d2d770e22bffe53c7f1e611e2bbca94cb8a2e7>`
    +* Django 4.2 :commit:`(patch) <38d9ef8c7b5cb6ef51b933e51a20e0e0063f33d5>`
    +
    +October 1, 2025 - :cve:`2025-59682`
    +-----------------------------------
    +
    +Potential partial directory-traversal via ``archive.extract()``.
    +`Full description
    +<https://www.djangoproject.com/weblog/2025/oct/01/security-releases/>`__
    +
    +* Django 6.0 :commit:`(patch) <af067f56c1dd467df4abd0ddd409a700da1f03ba>`
    +* Django 5.2 :commit:`(patch) <ed8fc39d77465eddbde1191a054ae965f6a8a584>`
    +* Django 5.1 :commit:`(patch) <74fa85c688a87224637155902bcd738bb9e65e11>`
    +* Django 4.2 :commit:`(patch) <9504bbaa392c9fe37eee9291f5b4c29eb6037619>`
    +
     September 3, 2025 - :cve:`2025-57833`
     -------------------------------------
     
    
924a0c092e65

Fixed CVE-2025-59682 -- Fixed potential partial directory-traversal via archive.extract().

https://github.com/django/djangoSarah BoyceSep 16, 2025via ghsa
5 files changed · +48 1
  • django/utils/archive.py+5 1 modified
    @@ -145,7 +145,11 @@ def has_leading_dir(self, paths):
         def target_filename(self, to_path, name):
             target_path = os.path.abspath(to_path)
             filename = os.path.abspath(os.path.join(target_path, name))
    -        if not filename.startswith(target_path):
    +        try:
    +            if os.path.commonpath([target_path, filename]) != target_path:
    +                raise SuspiciousOperation("Archive contains invalid path: '%s'" % name)
    +        except ValueError:
    +            # Different drives on Windows raises ValueError.
                 raise SuspiciousOperation("Archive contains invalid path: '%s'" % name)
             return filename
     
    
  • docs/releases/4.2.25.txt+8 0 modified
    @@ -15,3 +15,11 @@ CVE-2025-59681: Potential SQL injection in ``QuerySet.annotate()``, ``alias()``,
     to SQL injection in column aliases, using a suitably crafted dictionary, with
     dictionary expansion, as the ``**kwargs`` passed to these methods (follow up to
     :cve:`2022-28346`).
    +
    +CVE-2025-59682: Potential partial directory-traversal via ``archive.extract()``
    +===============================================================================
    +
    +The ``django.utils.archive.extract()`` function, used by
    +:option:`startapp --template` and :option:`startproject --template`, allowed
    +partial directory-traversal via an archive with file paths sharing a common
    +prefix with the target directory (follow up to :cve:`2021-3281`).
    
  • docs/releases/5.1.13.txt+8 0 modified
    @@ -15,3 +15,11 @@ CVE-2025-59681: Potential SQL injection in ``QuerySet.annotate()``, ``alias()``,
     to SQL injection in column aliases, using a suitably crafted dictionary, with
     dictionary expansion, as the ``**kwargs`` passed to these methods (follow up to
     :cve:`2022-28346`).
    +
    +CVE-2025-59682: Potential partial directory-traversal via ``archive.extract()``
    +===============================================================================
    +
    +The ``django.utils.archive.extract()`` function, used by
    +:option:`startapp --template` and :option:`startproject --template`, allowed
    +partial directory-traversal via an archive with file paths sharing a common
    +prefix with the target directory (follow up to :cve:`2021-3281`).
    
  • docs/releases/5.2.7.txt+8 0 modified
    @@ -17,6 +17,14 @@ to SQL injection in column aliases, using a suitably crafted dictionary, with
     dictionary expansion, as the ``**kwargs`` passed to these methods (follow up to
     :cve:`2022-28346`).
     
    +CVE-2025-59682: Potential partial directory-traversal via ``archive.extract()``
    +===============================================================================
    +
    +The ``django.utils.archive.extract()`` function, used by
    +:option:`startapp --template` and :option:`startproject --template`, allowed
    +partial directory-traversal via an archive with file paths sharing a common
    +prefix with the target directory (follow up to :cve:`2021-3281`).
    +
     Bugfixes
     ========
     
    
  • tests/utils_tests/test_archive.py+19 0 modified
    @@ -3,6 +3,7 @@
     import sys
     import tempfile
     import unittest
    +import zipfile
     
     from django.core.exceptions import SuspiciousOperation
     from django.test import SimpleTestCase
    @@ -94,3 +95,21 @@ def test_extract_function_traversal(self):
                 with self.subTest(entry), tempfile.TemporaryDirectory() as tmpdir:
                     with self.assertRaisesMessage(SuspiciousOperation, msg % invalid_path):
                         archive.extract(os.path.join(archives_dir, entry), tmpdir)
    +
    +    def test_extract_function_traversal_startswith(self):
    +        with tempfile.TemporaryDirectory() as tmpdir:
    +            base = os.path.abspath(tmpdir)
    +            tarfile_handle = tempfile.NamedTemporaryFile(suffix=".zip", delete=False)
    +            tar_path = tarfile_handle.name
    +            tarfile_handle.close()
    +            self.addCleanup(os.remove, tar_path)
    +
    +            malicious_member = os.path.join(base + "abc", "evil.txt")
    +            with zipfile.ZipFile(tar_path, "w") as zf:
    +                zf.writestr(malicious_member, "evil\n")
    +                zf.writestr("test.txt", "data\n")
    +
    +            with self.assertRaisesMessage(
    +                SuspiciousOperation, "Archive contains invalid path"
    +            ):
    +                archive.extract(tar_path, base)
    

Vulnerability mechanics

Generated by null/stub on May 9, 2026. Inputs: CWE entries + fix-commit diffs from this CVE's patches. Citations validated against bundle.

References

10

News mentions

0

No linked articles in our index yet.