Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 20 additions & 1 deletion chalice/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -231,7 +231,26 @@ def extract_zipfile(self, zipfile_path, unpack_dir):
def extract_tarfile(self, tarfile_path, unpack_dir):
# type: (str, str) -> None
with tarfile.open(tarfile_path, 'r:*') as tar:
tar.extractall(unpack_dir)
def is_within_directory(directory, target):

abs_directory = os.path.abspath(directory)
abs_target = os.path.abspath(target)

prefix = os.path.commonprefix([abs_directory, abs_target])

return prefix == abs_directory

def safe_extract(tar, path=".", members=None, *, numeric_owner=False):

for member in tar.getmembers():
member_path = os.path.join(path, member.name)
if not is_within_directory(path, member_path):
raise Exception("Attempted Path Traversal in Tar File")

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Recommendation generated by Amazon CodeGuru Reviewer. Leave feedback on this recommendation by replying to the comment or by reacting to the comment using emoji.

Using Exception and BaseException can make your code prone to errors and difficult to maintain. Instead, we recommend using one of the Built-in Exceptions or creating a custom exception class that is derived from Exception or one of its subclasses.


tar.extractall(path, members, numeric_owner=numeric_owner)


safe_extract(tar, unpack_dir)

def directory_exists(self, path):
# type: (str) -> bool
Expand Down