From 4919a6444d9b0150fa21d4ab9884163981f1ccc4 Mon Sep 17 00:00:00 2001 From: TrellixVulnTeam Date: Mon, 17 Oct 2022 07:41:45 +0000 Subject: [PATCH] Adding tarfile member sanitization to extractall() --- snntorch/spikevision/neuromorphic_dataset.py | 63 +++++++++++++++++++- 1 file changed, 60 insertions(+), 3 deletions(-) diff --git a/snntorch/spikevision/neuromorphic_dataset.py b/snntorch/spikevision/neuromorphic_dataset.py index 246cd008..e5f60d3a 100644 --- a/snntorch/spikevision/neuromorphic_dataset.py +++ b/snntorch/spikevision/neuromorphic_dataset.py @@ -251,13 +251,70 @@ def _extract_archive(from_path, to_path=None, remove_finished=False): if _is_tar(from_path): with tarfile.open(from_path, "r") as tar: - tar.extractall(path=to_path) + 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") + + tar.extractall(path, members, numeric_owner=numeric_owner) + + + safe_extract(tar, path=to_path) elif _is_targz(from_path) or _is_tgz(from_path): with tarfile.open(from_path, "r:gz") as tar: - tar.extractall(path=to_path) + 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") + + tar.extractall(path, members, numeric_owner=numeric_owner) + + + safe_extract(tar, path=to_path) elif _is_tarxz(from_path): with tarfile.open(from_path, "r:xz") as tar: - tar.extractall(path=to_path) + 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") + + tar.extractall(path, members, numeric_owner=numeric_owner) + + + safe_extract(tar, path=to_path) elif _is_gzip(from_path): to_path = os.path.join( to_path, os.path.splitext(os.path.basename(from_path))[0]