File tree Expand file tree Collapse file tree 1 file changed +29
-1
lines changed Expand file tree Collapse file tree 1 file changed +29
-1
lines changed Original file line number Diff line number Diff line change 1
1
import os
2
+ import sys
2
3
import tarfile
3
4
from io import BytesIO
4
5
from urllib .error import URLError
@@ -75,7 +76,34 @@ def get_members(tar, prefix):
75
76
76
77
prefix = str (command .version ) + '/'
77
78
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
+ }
79
107
80
108
return {
81
109
'cmd' : '' ,
You can’t perform that action at this time.
0 commit comments