@@ -327,34 +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/n )' .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
+ if user_says .startswith ('s' ):
345
+ interactive = False
346
+ vuln_deets ['unknown_assignment' ] = current_node
347
+ return VulnerabilityType .UNKNOWN , interactive
344
348
if user_says .startswith ('n' ):
345
349
blackbox_mapping ['does_not_propagate' ].append (current_node .func_name )
346
- return VulnerabilityType .FALSE
350
+ return VulnerabilityType .FALSE , interactive
347
351
blackbox_mapping ['propagates' ].append (current_node .func_name )
348
352
else :
349
353
vuln_deets ['unknown_assignment' ] = current_node
350
- return VulnerabilityType .UNKNOWN
354
+ return VulnerabilityType .UNKNOWN , interactive
351
355
352
356
if potential_sanitiser :
353
357
vuln_deets ['sanitiser' ] = potential_sanitiser
354
358
vuln_deets ['confident' ] = False
355
- return VulnerabilityType .SANITISED
359
+ return VulnerabilityType .SANITISED , interactive
356
360
357
- return VulnerabilityType .TRUE
361
+ return VulnerabilityType .TRUE , interactive
358
362
359
363
360
364
def get_tainted_node_in_sink_args (
@@ -439,12 +443,13 @@ def get_vulnerability(
439
443
cfg .nodes ,
440
444
lattice
441
445
)
446
+
442
447
for chain in get_vulnerability_chains (
443
448
source .cfg_node ,
444
449
sink .cfg_node ,
445
450
def_use
446
451
):
447
- vulnerability_type = how_vulnerable (
452
+ vulnerability_type , interactive = how_vulnerable (
448
453
chain ,
449
454
blackbox_mapping ,
450
455
sanitiser_nodes ,
@@ -458,9 +463,9 @@ def get_vulnerability(
458
463
459
464
vuln_deets ['reassignment_nodes' ] = chain
460
465
461
- return vuln_factory (vulnerability_type )(** vuln_deets )
466
+ return vuln_factory (vulnerability_type )(** vuln_deets ), interactive
462
467
463
- return None
468
+ return None , interactive
464
469
465
470
466
471
def find_vulnerabilities_in_cfg (
@@ -491,7 +496,7 @@ def find_vulnerabilities_in_cfg(
491
496
)
492
497
for sink in triggers .sinks :
493
498
for source in triggers .sources :
494
- vulnerability = get_vulnerability (
499
+ vulnerability , interactive = get_vulnerability (
495
500
source ,
496
501
sink ,
497
502
triggers ,
0 commit comments