Skip to content

Commit 08b63f8

Browse files
TrellixVulnTeammoneymanolisk9ert
authored
Security: CVE-2007-4559 Patch (#1927)
* Adding tarfile member sanitization to extractall() * black and comment Co-authored-by: Manolis Mandrapilias <[email protected]> Co-authored-by: k9ert <[email protected]>
1 parent 793a8c5 commit 08b63f8

File tree

1 file changed

+22
-1
lines changed

1 file changed

+22
-1
lines changed

src/cryptoadvance/specter/util/bitcoind_setup_tasks.py

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,29 @@ def setup_bitcoind_thread(specter=None, internal_bitcoind_version=""):
3535
bitcoin_binaries_folder = os.path.join(specter.data_folder, "bitcoin-binaries")
3636
logger.info(f"Unpacking binaries to {bitcoin_binaries_folder}")
3737
if BITCOIND_OS_SUFFIX[platform.system()].endswith("tar.gz"):
38+
# see https://github.com/cryptoadvance/specter-desktop/pull/1927
39+
# to understand the additional complexity here
3840
with tarfile.open(packed_name, "r:gz") as so:
39-
so.extractall(specter.data_folder)
41+
42+
def is_within_directory(directory, target):
43+
44+
abs_directory = os.path.abspath(directory)
45+
abs_target = os.path.abspath(target)
46+
47+
prefix = os.path.commonprefix([abs_directory, abs_target])
48+
49+
return prefix == abs_directory
50+
51+
def safe_extract(tar, path=".", members=None, *, numeric_owner=False):
52+
53+
for member in tar.getmembers():
54+
member_path = os.path.join(path, member.name)
55+
if not is_within_directory(path, member_path):
56+
raise Exception("Attempted Path Traversal in Tar File")
57+
58+
tar.extractall(path, members, numeric_owner=numeric_owner)
59+
60+
safe_extract(so, specter.data_folder)
4061
else:
4162
with zipfile.ZipFile(packed_name, "r") as zip_ref:
4263
zip_ref.extractall(specter.data_folder)

0 commit comments

Comments
 (0)