mirror of
https://github.com/django/django.git
synced 2025-10-31 09:41:08 +00:00
[5.0.x] Fixed CVE-2024-39330 -- Added extra file name validation in Storage's save method.
Thanks to Josh Schneier for the report, and to Carlton Gibson and Sarah Boyce for the reviews.
This commit is contained in:
@@ -34,7 +34,18 @@ class Storage:
|
||||
if not hasattr(content, "chunks"):
|
||||
content = File(content, name)
|
||||
|
||||
# Ensure that the name is valid, before and after having the storage
|
||||
# system potentially modifying the name. This duplicates the check made
|
||||
# inside `get_available_name` but it's necessary for those cases where
|
||||
# `get_available_name` is overriden and validation is lost.
|
||||
validate_file_name(name, allow_relative_path=True)
|
||||
|
||||
# Potentially find a different name depending on storage constraints.
|
||||
name = self.get_available_name(name, max_length=max_length)
|
||||
# Validate the (potentially) new name.
|
||||
validate_file_name(name, allow_relative_path=True)
|
||||
|
||||
# The save operation should return the actual name of the file saved.
|
||||
name = self._save(name, content)
|
||||
# Ensure that the name returned from the storage system is still valid.
|
||||
validate_file_name(name, allow_relative_path=True)
|
||||
|
||||
@@ -10,10 +10,9 @@ def validate_file_name(name, allow_relative_path=False):
|
||||
raise SuspiciousFileOperation("Could not derive file name from '%s'" % name)
|
||||
|
||||
if allow_relative_path:
|
||||
# Use PurePosixPath() because this branch is checked only in
|
||||
# FileField.generate_filename() where all file paths are expected to be
|
||||
# Unix style (with forward slashes).
|
||||
path = pathlib.PurePosixPath(name)
|
||||
# Ensure that name can be treated as a pure posix path, i.e. Unix
|
||||
# style (with forward slashes).
|
||||
path = pathlib.PurePosixPath(str(name).replace("\\", "/"))
|
||||
if path.is_absolute() or ".." in path.parts:
|
||||
raise SuspiciousFileOperation(
|
||||
"Detected path traversal attempt in '%s'" % name
|
||||
|
||||
Reference in New Issue
Block a user