Skip to content

Commit ca838ef

Browse files
author
Shamal Faily
committed
Fix Uncontrolled data used in path expression
1 parent 53c1fae commit ca838ef

File tree

1 file changed

+21
-10
lines changed

1 file changed

+21
-10
lines changed

cairis/bin/cimport.py

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
5867
def 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

Comments
 (0)