@@ -55,6 +55,15 @@ def main(args=None):
5555 b .imageDir = os .path .abspath (args .imageDir )
5656 file_import (importFile ,mFormat ,overwriteFlag )
5757
58+ def safe_extract (zf , member , target_dir ):
59+ normalised_member = os .path .normpath (member )
60+ target_path = os .path .abspath (os .path .join (target_dir , normalised_member ))
61+ target_dir_abs = os .path .abspath (target_dir )
62+ if (os .path .commonpath ([target_dir_abs , target_path ]) != target_dir_abs ):
63+ raise ARMException ('Invalid path in package: ' + member )
64+ zf .extract (member , target_dir_abs )
65+ return target_path
66+
5867def package_import (pkgStr ,session_id = None ):
5968 from cairis .core .Borg import Borg
6069 b = Borg ()
@@ -68,13 +77,13 @@ def package_import(pkgStr,session_id = None):
6877 for fileName in fileList :
6978 fName ,fType = fileName .split ('.' )
7079 if (fType == 'xml' ):
71- zf . extract ( fileName ,b .tmpDir )
80+ extracted_path = safe_extract ( zf , fileName , b .tmpDir )
7281 modelType = ''
7382 try :
74- modelType = ET .fromstring (open (b . tmpDir + '/' + fileName ).read ()).tag
83+ modelType = ET .fromstring (open (extracted_path ).read ()).tag
7584 except ET .ParseError as e :
7685 raise ARMException ('Error parsing ' + fileName + ': ' + str (e ))
77- os .remove (b . tmpDir + '/' + fileName )
86+ os .remove (extracted_path )
7887 if (modelType == 'cairis_model' ):
7988 if (models [modelType ] != '' ):
8089 raise ARMException ('Cannot have more than one CAIRIS model file in the package file' )
@@ -88,19 +97,19 @@ def package_import(pkgStr,session_id = None):
8897 if (cairisModel == '' ):
8998 raise ARMException ('No CAIRIS model file in the package file' )
9099 else :
91- zf . extract ( cairisModel ,b .tmpDir )
92- file_import (b . tmpDir + '/' + cairisModel ,'all' ,1 ,session_id )
93- os .remove (b . tmpDir + '/' + cairisModel )
100+ cairis_model_path = safe_extract ( zf , cairisModel , b .tmpDir )
101+ file_import (cairis_model_path ,'all' ,1 ,session_id )
102+ os .remove (cairis_model_path )
94103
95104 for typeKey in ['locations' ,'architectural_pattern' ,'security_patterns' ]:
96105 for modelFile in models [typeKey ]:
97- zf . extract ( modelFile ,b .tmpDir )
106+ model_path = safe_extract ( zf , modelFile ,b .tmpDir )
98107 if (typeKey == 'architectural_pattern' ):
99108 typeKey = 'architecturalpattern'
100109 elif (typeKey == 'security_patterns' ):
101110 typeKey = 'securitypattern'
102- file_import (b . tmpDir + '/' + modelFile ,typeKey ,0 ,session_id )
103- os .remove (b . tmpDir + '/' + modelFile )
111+ file_import (model_path ,typeKey ,0 ,session_id )
112+ os .remove (model_path )
104113 for imageFile in modelImages :
105114 buf = zf .read (imageFile )
106115 mimeType = magic .from_buffer (buf ,mime = True )
@@ -116,8 +125,10 @@ def file_import(importFile,mFormat,overwriteFlag,session_id = None):
116125
117126 from cairis .mio .ModelImport import importSecurityPatternsFile , importAttackPattern ,importTVTypeFile ,importDirectoryFile ,importRequirementsFile , importRiskAnalysisFile , importUsabilityFile , importAssociationsFile , importProjectFile , importDomainValuesFile , importComponentViewFile , importSynopsesFile ,importProcessesFile ,importAssetsFile ,importLocationsFile ,importModelFile ,importMisusabilityFile ,importDataflowsFile ,importStoriesFile
118127
128+ normalised_import_file = os .path .abspath (importFile )
129+
119130 try :
120- ET .fromstring (open (importFile ).read ())
131+ ET .fromstring (open (normalised_import_file ).read ())
121132 except ET .ParseError as e :
122133 raise ARMException ('Error parsing ' + importFile + ': ' + str (e ))
123134
0 commit comments