@@ -327,38 +327,38 @@ def how_vulnerable(
327
327
if current_node in sanitiser_nodes :
328
328
vuln_deets ['sanitiser' ] = current_node
329
329
vuln_deets ['confident' ] = True
330
- return VulnerabilityType .SANITISED
330
+ return VulnerabilityType .SANITISED , interactive
331
331
332
332
if isinstance (current_node , BBorBInode ):
333
333
if current_node .func_name in blackbox_mapping ['propagates' ]:
334
334
continue
335
335
elif current_node .func_name in blackbox_mapping ['does_not_propagate' ]:
336
- return VulnerabilityType .FALSE
336
+ return VulnerabilityType .FALSE , interactive
337
337
elif interactive :
338
338
user_says = input (
339
- 'Is the return value of {} with tainted argument "{}" vulnerable? ([Y]es/[N]o/[S]top)' .format (
339
+ 'Is the return value of {} with tainted argument "{}" vulnerable? ([Y]es/[N]o/[S]top asking )' .format (
340
340
current_node .label ,
341
341
chain [i - 1 ].left_hand_side
342
342
)
343
343
).lower ()
344
344
if user_says .startswith ('s' ):
345
345
interactive = False
346
346
vuln_deets ['unknown_assignment' ] = current_node
347
- return VulnerabilityType .UNKNOWN
347
+ return VulnerabilityType .UNKNOWN , interactive
348
348
if user_says .startswith ('n' ):
349
349
blackbox_mapping ['does_not_propagate' ].append (current_node .func_name )
350
- return VulnerabilityType .FALSE
350
+ return VulnerabilityType .FALSE , interactive
351
351
blackbox_mapping ['propagates' ].append (current_node .func_name )
352
352
else :
353
353
vuln_deets ['unknown_assignment' ] = current_node
354
- return VulnerabilityType .UNKNOWN
354
+ return VulnerabilityType .UNKNOWN , interactive
355
355
356
356
if potential_sanitiser :
357
357
vuln_deets ['sanitiser' ] = potential_sanitiser
358
358
vuln_deets ['confident' ] = False
359
- return VulnerabilityType .SANITISED
359
+ return VulnerabilityType .SANITISED , interactive
360
360
361
- return VulnerabilityType .TRUE
361
+ return VulnerabilityType .TRUE , interactive
362
362
363
363
364
364
def get_tainted_node_in_sink_args (
@@ -443,12 +443,13 @@ def get_vulnerability(
443
443
cfg .nodes ,
444
444
lattice
445
445
)
446
+
446
447
for chain in get_vulnerability_chains (
447
448
source .cfg_node ,
448
449
sink .cfg_node ,
449
450
def_use
450
451
):
451
- vulnerability_type = how_vulnerable (
452
+ vulnerability_type , interactive = how_vulnerable (
452
453
chain ,
453
454
blackbox_mapping ,
454
455
sanitiser_nodes ,
@@ -462,9 +463,9 @@ def get_vulnerability(
462
463
463
464
vuln_deets ['reassignment_nodes' ] = chain
464
465
465
- return vuln_factory (vulnerability_type )(** vuln_deets )
466
+ return vuln_factory (vulnerability_type )(** vuln_deets ), interactive
466
467
467
- return None
468
+ return None , interactive
468
469
469
470
470
471
def find_vulnerabilities_in_cfg (
@@ -495,7 +496,7 @@ def find_vulnerabilities_in_cfg(
495
496
)
496
497
for sink in triggers .sinks :
497
498
for source in triggers .sources :
498
- vulnerability = get_vulnerability (
499
+ vulnerability , interactive = get_vulnerability (
499
500
source ,
500
501
sink ,
501
502
triggers ,
0 commit comments