Skip to content

Commit 3a5cf25

Browse files
Fix CVE-2007-4559 warnings in RHEL tar extraction.
Signed-off-by: Leander Stephen D'Souza <leanderdsouza1234@gmail.com>
1 parent b5980ce commit 3a5cf25

File tree

1 file changed

+29
-1
lines changed

1 file changed

+29
-1
lines changed

vcs2l/clients/tar.py

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import os
2+
import sys
23
import tarfile
34
from io import BytesIO
45
from urllib.error import URLError
@@ -75,7 +76,34 @@ def get_members(tar, prefix):
7576

7677
prefix = str(command.version) + '/'
7778
members = get_members(tar, prefix)
78-
tar.extractall(self.path, members)
79+
80+
try:
81+
if sys.version_info >= (3, 12):
82+
tar.extractall(self.path, members, filter='data')
83+
else:
84+
# Fallback for older Python versions - implement basic safety checks
85+
for member in members:
86+
member_path = os.path.join(self.path, member.name)
87+
real_member_path = os.path.realpath(
88+
member_path
89+
) # compresses ../ and such
90+
real_path = os.path.realpath(self.path)
91+
92+
if not real_member_path.startswith(real_path + os.sep):
93+
raise tarfile.ExtractError(
94+
f'Attempted path traversal in tar file: {member.name}'
95+
)
96+
97+
tar.extractall(self.path, members)
98+
99+
except tarfile.ExtractError as e:
100+
return {
101+
'cmd': '',
102+
'cwd': self.path,
103+
'output': "Failed to unpack tarball fetched from '%s': %s"
104+
% (command.url, e),
105+
'returncode': 1,
106+
}
79107

80108
return {
81109
'cmd': '',

0 commit comments

Comments
 (0)