Commit 730f64f5c2185e0394d191e7a2a89e16f00889b9

Authored by Christian Herdtweck
1 parent 1f3fef52

raise new exceptions if opening of substreams fails and not relaxed

Showing 1 changed file with 43 additions and 19 deletions
oletools/olevba.py
@@ -2242,12 +2242,24 @@ class VBA_Parser(object): @@ -2242,12 +2242,24 @@ class VBA_Parser(object):
2242 self.ole_subfiles.append( 2242 self.ole_subfiles.append(
2243 VBA_Parser(filename=subfile, data=ole_data, 2243 VBA_Parser(filename=subfile, data=ole_data,
2244 relaxed=self.relaxed)) 2244 relaxed=self.relaxed))
2245 - except FileOpenError as exc:  
2246 - log.info('%s is not a valid OLE file (%s)' % (subfile, exc))  
2247 - continue 2245 + except OlevbaBaseException as exc:
  2246 + if self.relaxed:
  2247 + log.info('%s is not a valid OLE file (%s)' % (subfile, exc))
  2248 + log.debug('Trace:', exc_info=True)
  2249 + continue
  2250 + else:
  2251 + raise SubstreamOpenError(self.filename, subfile,
  2252 + exc)
2248 z.close() 2253 z.close()
2249 # set type only if parsing succeeds 2254 # set type only if parsing succeeds
2250 self.type = TYPE_OpenXML 2255 self.type = TYPE_OpenXML
  2256 + except OlevbaBaseException as exc:
  2257 + if self.relaxed:
  2258 + log.info('Error {} caught in Zip/OpenXML parsing for file {}'
  2259 + .format(exc, self.filename))
  2260 + log.debug('Trace:', exc_info=True)
  2261 + else:
  2262 + raise
2251 except (RuntimeError, zipfile.BadZipfile, zipfile.LargeZipFile, IOError) as exc: 2263 except (RuntimeError, zipfile.BadZipfile, zipfile.LargeZipFile, IOError) as exc:
2252 # TODO: handle parsing exceptions 2264 # TODO: handle parsing exceptions
2253 log.info('Failed Zip/OpenXML parsing for file %r (%s)' 2265 log.info('Failed Zip/OpenXML parsing for file %r (%s)'
@@ -2281,16 +2293,23 @@ class VBA_Parser(object): @@ -2281,16 +2293,23 @@ class VBA_Parser(object):
2281 self.ole_subfiles.append( 2293 self.ole_subfiles.append(
2282 VBA_Parser(filename=fname, data=ole_data, 2294 VBA_Parser(filename=fname, data=ole_data,
2283 relaxed=self.relaxed)) 2295 relaxed=self.relaxed))
2284 - except MsoExtractionError:  
2285 - log.info('Failed decompressing an MSO container in %r - %s'  
2286 - % (fname, MSG_OLEVBA_ISSUES))  
2287 - log.debug('Trace:', exc_info=True)  
2288 - except FileOpenError as exc:  
2289 - log.debug('%s is not a valid OLE sub file (%s)' % (fname, exc)) 2296 + except OlevbaBaseException as exc:
  2297 + if relaxed:
  2298 + log.info('Error parsing subfile {}: {}'
  2299 + .format(fname, exc))
  2300 + log.debug('Trace:', exc_info=True)
  2301 + else:
  2302 + raise SubstreamOpenError(self.filename, fname, exc)
2290 else: 2303 else:
2291 log.info('%s is not a valid MSO file' % fname) 2304 log.info('%s is not a valid MSO file' % fname)
2292 # set type only if parsing succeeds 2305 # set type only if parsing succeeds
2293 self.type = TYPE_Word2003_XML 2306 self.type = TYPE_Word2003_XML
  2307 + except OlevbaBaseException as exc:
  2308 + if self.relaxed:
  2309 + log.info('Failed XML parsing for file %r (%s)' % (self.filename, exc))
  2310 + log.debug('Trace:', exc_info=True)
  2311 + else:
  2312 + raise
2294 except Exception as exc: 2313 except Exception as exc:
2295 # TODO: differentiate exceptions for each parsing stage 2314 # TODO: differentiate exceptions for each parsing stage
2296 # (but ET is different libs, no good exception description in API) 2315 # (but ET is different libs, no good exception description in API)
@@ -2345,14 +2364,14 @@ class VBA_Parser(object): @@ -2345,14 +2364,14 @@ class VBA_Parser(object):
2345 self.ole_subfiles.append( 2364 self.ole_subfiles.append(
2346 VBA_Parser(filename=fname, data=ole_data, 2365 VBA_Parser(filename=fname, data=ole_data,
2347 relaxed=self.relaxed)) 2366 relaxed=self.relaxed))
2348 - except MsoExtractionError:  
2349 - log.info('Failed decompressing an MSO container in %r - %s'  
2350 - % (fname, MSG_OLEVBA_ISSUES))  
2351 - log.debug('Trace:', exc_info=True)  
2352 - # TODO: bug here - need to split in smaller functions/classes?  
2353 - except FileOpenError as exc:  
2354 - log.debug('%s does not contain a valid OLE file (%s)'  
2355 - % (fname, exc)) 2367 + except OlevbaBaseException as exc:
  2368 + if self.relaxed:
  2369 + log.info('%s does not contain a valid OLE file (%s)'
  2370 + % (fname, exc))
  2371 + log.debug('Trace:', exc_info=True)
  2372 + # TODO: bug here - need to split in smaller functions/classes?
  2373 + else:
  2374 + raise SubstreamOpenError(self.filename, fname, exc)
2356 else: 2375 else:
2357 log.debug('type(part_data) = %s' % type(part_data)) 2376 log.debug('type(part_data) = %s' % type(part_data))
2358 try: 2377 try:
@@ -2361,6 +2380,8 @@ class VBA_Parser(object): @@ -2361,6 +2380,8 @@ class VBA_Parser(object):
2361 log.debug('part_data has no __getitem__') 2380 log.debug('part_data has no __getitem__')
2362 # set type only if parsing succeeds 2381 # set type only if parsing succeeds
2363 self.type = TYPE_MHTML 2382 self.type = TYPE_MHTML
  2383 + except OlevbaBaseException:
  2384 + raise
2364 except Exception: 2385 except Exception:
2365 log.info('Failed MIME parsing for file %r - %s' 2386 log.info('Failed MIME parsing for file %r - %s'
2366 % (self.filename, MSG_OLEVBA_ISSUES)) 2387 % (self.filename, MSG_OLEVBA_ISSUES))
@@ -2565,8 +2586,11 @@ class VBA_Parser(object): @@ -2565,8 +2586,11 @@ class VBA_Parser(object):
2565 log.debug('Found VBA compressed code') 2586 log.debug('Found VBA compressed code')
2566 self.contains_macros = True 2587 self.contains_macros = True
2567 except IOError as exc: 2588 except IOError as exc:
2568 - log.info('Error when reading OLE Stream %r' % d.name)  
2569 - log.debug('Trace:', exc_trace=True) 2589 + if self.relaxed:
  2590 + log.info('Error when reading OLE Stream %r' % d.name)
  2591 + log.debug('Trace:', exc_trace=True)
  2592 + else:
  2593 + raise SubstreamOpenError(self.filename, d.name, exc)
2570 return self.contains_macros 2594 return self.contains_macros
2571 2595
2572 def extract_macros(self): 2596 def extract_macros(self):