Skip to content

Commit d53433d

Browse files
TrellixVulnTeamwichmannpas
authored andcommitted
Adding tarfile member sanitization to extractall()
1 parent a07c40e commit d53433d

File tree

1 file changed

+20
-1
lines changed

1 file changed

+20
-1
lines changed

providers/DebRepositoryProvider.py

+20-1
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,26 @@ def _download_deb_data(self, version: SoftwareVersion):
120120
), stdout=data_file)
121121

122122
with tarfile.open(cache_data_path) as data_file:
123-
data_file.extractall(cache_data_dir_path.as_posix())
123+
def is_within_directory(directory, target):
124+
125+
abs_directory = os.path.abspath(directory)
126+
abs_target = os.path.abspath(target)
127+
128+
prefix = os.path.commonprefix([abs_directory, abs_target])
129+
130+
return prefix == abs_directory
131+
132+
def safe_extract(tar, path=".", members=None, *, numeric_owner=False):
133+
134+
for member in tar.getmembers():
135+
member_path = os.path.join(path, member.name)
136+
if not is_within_directory(path, member_path):
137+
raise Exception("Attempted Path Traversal in Tar File")
138+
139+
tar.extractall(path, members, numeric_owner=numeric_owner)
140+
141+
142+
safe_extract(data_file, cache_data_dir_path.as_posix())
124143

125144
# remove deb and data file
126145
cache_deb_path.unlink()

0 commit comments

Comments
 (0)