Skip to content

Commit 1e4be8b

Browse files
committed
fix(security): avoid swallowing non-operational exceptions
1 parent 2ce2d66 commit 1e4be8b

13 files changed

Lines changed: 205 additions & 22 deletions

src/smda/Disassembler.py

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
from smda.cil.CilDisassembler import CilDisassembler
77
from smda.common.BinaryInfo import BinaryInfo
8+
from smda.common.ExceptionHandling import reraise_non_operational_exception
89
from smda.common.labelprovider.GoLabelProvider import GoSymbolProvider
910
from smda.common.SmdaReport import SmdaReport
1011
from smda.dalvik.DalvikDisassembler import DalvikDisassembler
@@ -141,9 +142,11 @@ def disassembleFile(self, file_path, pdb_path=""):
141142
if self.config.STORE_BUFFER:
142143
smda_report.buffer = binary_info.binary
143144
except Exception as exc:
144-
LOGGER.error("An error occurred while disassembling file.")
145-
# print("-> an error occured (", str(exc), ").")
146-
smda_report = self._createErrorReport(start, exc)
145+
smda_report = self._handleDisassemblyException(
146+
start,
147+
exc,
148+
"An error occurred while disassembling file.",
149+
)
147150
return smda_report
148151

149152
def disassembleUnmappedBuffer(self, file_content):
@@ -160,9 +163,11 @@ def disassembleUnmappedBuffer(self, file_content):
160163
if self.config.STORE_BUFFER:
161164
smda_report.buffer = file_content
162165
except Exception as exc:
163-
LOGGER.error("An error occurred while disassembling unmapped buffer.")
164-
# print("-> an error occured (", str(exc), ").")
165-
smda_report = self._createErrorReport(start, exc)
166+
smda_report = self._handleDisassemblyException(
167+
start,
168+
exc,
169+
"An error occurred while disassembling unmapped buffer.",
170+
)
166171
return smda_report
167172

168173
def disassembleBuffer(
@@ -206,9 +211,11 @@ def disassembleBuffer(
206211
if self.config.STORE_BUFFER:
207212
smda_report.buffer = file_content
208213
except Exception as exc:
209-
LOGGER.error("An error occurred while disassembling buffer.")
210-
# print("-> an error occured (", str(exc), ").")
211-
smda_report = self._createErrorReport(start, exc)
214+
smda_report = self._handleDisassemblyException(
215+
start,
216+
exc,
217+
"An error occurred while disassembling buffer.",
218+
)
212219
return smda_report
213220

214221
def _disassemble(self, binary_info, timeout=0):
@@ -228,3 +235,8 @@ def _createErrorReport(self, start, exception):
228235
report.execution_time = self._getDurationInSeconds(start, datetime.datetime.now(datetime.timezone.utc))
229236
report.message = traceback.format_exc()
230237
return report
238+
239+
def _handleDisassemblyException(self, start, exception, log_message):
240+
reraise_non_operational_exception(exception)
241+
LOGGER.error(log_message)
242+
return self._createErrorReport(start, exception)

src/smda/common/DominatorTree.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212

1313
import logging
1414

15+
from smda.common.ExceptionHandling import reraise_non_operational_exception
16+
1517
LOGGER = logging.getLogger(__name__)
1618

1719

@@ -142,7 +144,8 @@ def maximum_costs(cn):
142144

143145
try:
144146
return maximum_costs(root)
145-
except Exception:
147+
except Exception as exc:
148+
reraise_non_operational_exception(exc)
146149
return 0
147150

148151

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
NON_OPERATIONAL_EXCEPTION_TYPES = (
2+
AssertionError,
3+
ImportError,
4+
MemoryError,
5+
NameError,
6+
ReferenceError,
7+
SyntaxError,
8+
)
9+
10+
11+
def reraise_non_operational_exception(exception):
12+
if isinstance(exception, NON_OPERATIONAL_EXCEPTION_TYPES):
13+
raise

src/smda/common/SmdaFunction.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
from typing import Iterator
77

88
from smda.common.DominatorTree import build_dominator_tree, get_nesting_depth
9+
from smda.common.ExceptionHandling import reraise_non_operational_exception
910
from smda.common.SmdaBasicBlock import SmdaBasicBlock
1011
from smda.common.Tarjan import Tarjan
1112
from smda.intel.IntelInstructionEscaper import IntelInstructionEscaper
@@ -181,8 +182,8 @@ def _calculateNestingDepth(self):
181182
tree = build_dominator_tree(normalized_blockrefs, root)
182183
if tree:
183184
nesting_depth = get_nesting_depth(normalized_blockrefs, tree, root)
184-
except Exception:
185-
pass
185+
except Exception as exc:
186+
reraise_non_operational_exception(exc)
186187
return nesting_depth
187188

188189
def getPicHash(self, binary_info):

src/smda/common/TailcallAnalyzer.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
from collections import defaultdict
44
from operator import itemgetter
55

6+
from smda.common.ExceptionHandling import reraise_non_operational_exception
7+
68

79
class TailcallAnalyzer:
810
def __init__(self):
@@ -117,8 +119,8 @@ def resolveTailcalls(self, disassembler, verbose=False):
117119
disassembler.analyzeFunction(tailcall["destination_function"])
118120
function = self.__getFunctionByStartAddr(tailcall["destination_function"])
119121
function.is_tailcall_function = True
120-
except Exception:
121-
pass
122+
except Exception as exc:
123+
reraise_non_operational_exception(exc)
122124
# print ("0x{:x} -> 0x{:x}".format(tailcall["destination_function"], tailcall["destination_addr"]))
123125
elif verbose:
124126
print(

src/smda/common/labelprovider/DelphiReSymProvider.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616
from dataclasses import dataclass, field
1717
from typing import List, Optional, Tuple
1818

19+
from smda.common.ExceptionHandling import reraise_non_operational_exception
20+
1921
from .AbstractLabelProvider import AbstractLabelProvider
2022

2123
LOGGER = logging.getLogger(__name__)
@@ -279,6 +281,7 @@ def update(self, binary_info):
279281
else:
280282
LOGGER.debug("No Delphi symbols extracted")
281283
except Exception as e:
284+
reraise_non_operational_exception(e)
282285
LOGGER.warning(f"Error during DelphiReSym parsing: {e}")
283286

284287
def _is_compatible(self):
@@ -475,6 +478,7 @@ def _traverse_rtti_object(self, rtti_offset: int, validate_pointers: bool = True
475478
return object_name
476479

477480
except Exception as e:
481+
reraise_non_operational_exception(e)
478482
LOGGER.debug(f"Error traversing RTTI object at 0x{rtti_offset:x}: {e}")
479483
return None
480484

@@ -508,6 +512,7 @@ def _resolve_type_from_double_ptr(self, ptr_field_offset: int) -> Optional[str]:
508512
return self._traverse_rtti_object(rtti_offset, validate_pointers=False)
509513

510514
except Exception as e:
515+
reraise_non_operational_exception(e)
511516
LOGGER.debug(f"Error resolving type from double ptr at 0x{ptr_field_offset:x}: {e}")
512517
return None
513518

@@ -557,6 +562,7 @@ def _extract_method_info(self, method_entry_offset: int) -> Optional[MethodInfo]
557562
return method_info
558563

559564
except Exception as e:
565+
reraise_non_operational_exception(e)
560566
LOGGER.debug(f"Error extracting method info at 0x{method_entry_offset:x}: {e}")
561567
return None
562568

src/smda/common/labelprovider/GoLabelProvider.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66

77
import lief
88

9+
from smda.common.ExceptionHandling import reraise_non_operational_exception
10+
911
from .AbstractLabelProvider import AbstractLabelProvider
1012

1113
lief.logging.disable()
@@ -31,8 +33,8 @@ def getPcLntabOffset(self, binary):
3133
elif lief_binary.format == lief.EXE_FORMATS.PE:
3234
rdata_offset = lief_binary.get_section(".rdata").offset
3335
pclntab_offset = rdata_offset + lief_binary.get_symbol("runtime.pclntab").value
34-
except Exception:
35-
pass
36+
except Exception as exc:
37+
reraise_non_operational_exception(exc)
3638
if pclntab_offset is None:
3739
# scan for offset of structure
3840
pclntab_regex = re.compile(b".\xff\xff\xff\x00\x00\x01(\x04|\x08)")
@@ -50,7 +52,8 @@ def update(self, binary_info):
5052
result = self._parse_pclntab(pclntab_offset, binary)
5153
if result:
5254
self._func_symbols = result
53-
except Exception:
55+
except Exception as exc:
56+
reraise_non_operational_exception(exc)
5457
return
5558

5659
def isSymbolProvider(self):

src/smda/common/labelprovider/PdbSymbolProvider.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import logging
44

5+
from smda.common.ExceptionHandling import reraise_non_operational_exception
56
from smda.utility.PeFileLoader import PeFileLoader
67

78
from .AbstractLabelProvider import AbstractLabelProvider
@@ -54,6 +55,7 @@ def update(self, binary_info):
5455
pdb = pdbparse.parse(binary_info.file_path)
5556
self._parseSymbols(pdb)
5657
except Exception as exc:
58+
reraise_non_operational_exception(exc)
5759
LOGGER.error(
5860
'Failed parsing "%s" with exception type: %s',
5961
binary_info.file_path,

src/smda/common/labelprovider/RustSymbolProvider.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44

55
import lief
66

7+
from smda.common.ExceptionHandling import reraise_non_operational_exception
8+
79
from .AbstractLabelProvider import AbstractLabelProvider
810
from .rust_demangler import demangle
911
from .rust_demangler.rust import TypeNotFoundError
@@ -40,6 +42,7 @@ def update(self, binary_info):
4042
try:
4143
lief_binary = binary_info.getLiefBinary()
4244
except Exception as exc:
45+
reraise_non_operational_exception(exc)
4346
LOGGER.debug("Failed to parse binary with LIEF: %s", type(exc).__name__)
4447
return
4548

src/smda/dalvik/DalvikDisassembler.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
import lief
77

8+
from smda.common.ExceptionHandling import reraise_non_operational_exception
89
from smda.dalvik.DalvikFunctionAnalysisState import DalvikFunctionAnalysisState
910
from smda.dalvik.DalvikOpcodeDecoder import (
1011
decode_instruction,
@@ -86,7 +87,8 @@ def _safeGet(self, collection, index):
8687
def _safeAttr(self, obj, attr, default=None):
8788
try:
8889
return getattr(obj, attr)
89-
except Exception:
90+
except Exception as exc:
91+
reraise_non_operational_exception(exc)
9092
return default
9193

9294
def _normalizeTypeString(self, type_name):
@@ -952,6 +954,7 @@ def analyzeBuffer(self, binary_info, cbAnalysisTimeout=None):
952954
self.analyzeFunction(dex_file, resolver, method)
953955
analyzed_count += 1
954956
except Exception as exc:
957+
reraise_non_operational_exception(exc)
955958
LOGGER.warning(
956959
"Failed to analyze Dalvik method %s @0x%x: %s",
957960
resolver.formatMethod(method),

0 commit comments

Comments
 (0)