@@ -38,13 +38,6 @@ def get_requirements(cls) -> List[interfaces.configuration.RequirementInterface]
3838 optional = True ,
3939 default = False ,
4040 ),
41- requirements .BooleanRequirement (
42- name = "heuristic-mode" ,
43- description = "Relaxed constraints. This may generate false positives and "
44- "take a bit longer. This feature is available only when using the --fast option" ,
45- optional = True ,
46- default = False ,
47- ),
4841 ]
4942
5043 @staticmethod
@@ -124,7 +117,6 @@ def _get_hidden_modules_vol2(
124117 vmlinux_module_name : str ,
125118 known_module_addresses : Set [int ],
126119 modules_memory_boundaries : Tuple ,
127- heuristic_mode : bool = False ,
128120 ) -> Iterable [interfaces .objects .ObjectInterface ]:
129121 """Enumerate hidden modules using the traditional implementation.
130122
@@ -135,7 +127,6 @@ def _get_hidden_modules_vol2(
135127 vmlinux_module_name: The name of the kernel module on which to operate
136128 known_module_addresses: Set with known module addresses
137129 modules_memory_boundaries: Minimum and maximum address boundaries for module allocation.
138- heuristic_mode: ignored for this scan method.
139130
140131 Yields:
141132 module objects
@@ -247,7 +238,6 @@ def _get_hidden_modules_fast(
247238 vmlinux_module_name : str ,
248239 known_module_addresses : Set [int ],
249240 modules_memory_boundaries : Tuple ,
250- heuristic_mode : bool = False ,
251241 ) -> Iterable [interfaces .objects .ObjectInterface ]:
252242 """Enumerate hidden modules by taking advantage of memory address alignment patterns
253243
@@ -268,45 +258,48 @@ def _get_hidden_modules_fast(
268258 vmlinux_module_name: The name of the kernel module on which to operate
269259 known_module_addresses: Set with known module addresses
270260 modules_memory_boundaries: Minimum and maximum address boundaries for module allocation.
271- heuristic_mode: If True, it loosens constraints to enhance the detection of advanced threats.
272261 Yields:
273262 module objects
274263 """
275264 vmlinux = context .modules [vmlinux_module_name ]
276265 vmlinux_layer = context .layers [vmlinux .layer_name ]
277266
278267 module_addr_min , module_addr_max = modules_memory_boundaries
279-
280- module_state_values_bytes = cls ._get_module_state_values_bytes (
281- context , vmlinux_module_name
282- )
283-
284268 module_address_alignment = cls ._get_module_address_alignment (
285269 context , vmlinux_module_name
286270 )
287271
272+ mkobj_offset = vmlinux .get_type ("module" ).relative_child_offset ("mkobj" )
273+ mod_offset = vmlinux .get_type ("module_kobject" ).relative_child_offset ("mod" )
274+ offset_to_mkobj_mod = mkobj_offset + mod_offset
275+ mod_member_template = vmlinux .get_type ("module_kobject" ).vol .members ["mod" ][1 ]
276+ mod_size = mod_member_template .size
277+ mod_member_data_format = mod_member_template .data_format
278+
288279 for module_addr in range (
289280 module_addr_min , module_addr_max , module_address_alignment
290281 ):
291282 if module_addr in known_module_addresses :
292283 continue
293284
294- if not heuristic_mode :
295- try :
296- # This is just a pre-filter. Module readability and consistency are verified in module.is_valid()
297- module_state_bytes = vmlinux_layer .read (
298- module_addr , len (module_state_values_bytes [0 ])
299- )
300- if module_state_bytes not in module_state_values_bytes :
301- continue
302- except (
303- exceptions .PagedInvalidAddressException ,
304- exceptions .InvalidAddressException ,
305- ):
285+ try :
286+ # This is just a pre-filter. Module readability and consistency are verified in module.is_valid()
287+ self_referential_bytes = vmlinux_layer .read (
288+ module_addr + offset_to_mkobj_mod , mod_size
289+ )
290+ self_referential = objects .convert_data_to_value (
291+ self_referential_bytes , int , mod_member_data_format
292+ )
293+ if self_referential != module_addr :
306294 continue
295+ except (
296+ exceptions .PagedInvalidAddressException ,
297+ exceptions .InvalidAddressException ,
298+ ):
299+ continue
307300
308301 module = vmlinux .object ("module" , offset = module_addr , absolute = True )
309- if module and module .is_valid (strict_states = not heuristic_mode ):
302+ if module and module .is_valid ():
310303 yield module
311304
312305 @staticmethod
@@ -369,7 +362,6 @@ def get_hidden_modules(
369362 vmlinux_module_name ,
370363 known_module_addresses ,
371364 modules_memory_boundaries ,
372- heuristic_mode ,
373365 )
374366
375367 @classmethod
@@ -410,7 +402,6 @@ def _generator(self):
410402 known_module_addresses ,
411403 modules_memory_boundaries ,
412404 fast_method = self .config .get ("fast" ),
413- heuristic_mode = self .config .get ("heuristic-mode" ),
414405 ):
415406 module_addr = module .vol .offset
416407 module_name = module .get_name () or renderers .NotAvailableValue ()
0 commit comments