@@ -48,7 +48,7 @@ class Scanner(object):
48
48
49
49
CHECKER_ENTRYPOINT = "cve_bin_tool.checker"
50
50
51
- def __init__ (self , nvd , checkers = None , verbose = True , logger = None ):
51
+ def __init__ (self , nvd , checkers = None , logger = None ):
52
52
if logger is None :
53
53
logger = LOGGER .getChild (self .__class__ .__name__ )
54
54
# Load checkers if not given
@@ -57,10 +57,9 @@ def __init__(self, nvd, checkers=None, verbose=True, logger=None):
57
57
self .nvd = nvd
58
58
self .checkers = checkers
59
59
self .logger = logger
60
- self .verbose = verbose
61
60
self .all_cves = defaultdict (dict )
62
61
self .files_with_cve = 0
63
- self .logger .info ("Checkers loaded: %s" , ", " .join (self .checkers .keys ()))
62
+ self .logger .info ("Checkers loaded: %s" % ( ", " .join (self .checkers .keys () )))
64
63
65
64
@staticmethod
66
65
def vendor_package_pairs (docstring ):
@@ -98,18 +97,18 @@ def available_checkers(cls):
98
97
checker_list = [item .name for item in checkers ]
99
98
return checker_list
100
99
101
- def remove_skiplist (self , skips = None , quiet = False ):
100
+ def remove_skiplist (self , skips = None ):
102
101
# Take out any checkers that are on the skip list
103
102
# (string of comma-delimited checker names)
104
103
skiplist = skips .split ("," ) if skips else []
105
104
for skipme in skiplist :
106
105
if skipme in self .checkers :
107
106
del self .checkers [skipme ]
108
- if not quiet :
109
- self .logger .debug ("Skipping checker: {}" .format (skipme ))
107
+ self .logger .debug ("Skipping checker: {}" .format (skipme ))
110
108
else :
111
- if not quiet :
112
- self .logger .error ("Checker {} is not a valid checker name" .format (skipme ))
109
+ self .logger .error (
110
+ "Checker {} is not a valid checker name" .format (skipme )
111
+ )
113
112
114
113
def print_checkers (self ):
115
114
self .logger .info ("Checkers: {}" .format (", " .join (self .checkers .keys ())))
@@ -133,7 +132,7 @@ def scan_file(self, filename):
133
132
"""Scans a file to see if it contains any of the target libraries,
134
133
and whether any of those contain CVEs"""
135
134
136
- self .logger .debug ("Scanning file: %r" , filename )
135
+ self .logger .debug ("Scanning file: %r" % filename )
137
136
138
137
# Do not try to scan symlinks
139
138
if os .path .islink (filename ):
@@ -199,13 +198,15 @@ def scan_file(self, filename):
199
198
if found_cves .keys ():
200
199
self .files_with_cve = self .files_with_cve + 1
201
200
self .all_cves [modulename ][version ] = found_cves
202
- if self .verbose :
203
- self .logger .info (filename , result ["is_or_contains" ], modulename , version )
204
- if found_cves .keys ():
205
- self .logger .info ("Known CVEs in version " + str (version ))
206
- self .logger .info (", " .join (found_cves .keys ()))
201
+ self .logger .info (
202
+ "%s %s %s %s"
203
+ % (filename , result ["is_or_contains" ], modulename , version )
204
+ )
205
+ if found_cves .keys ():
206
+ self .logger .info ("Known CVEs in version " + str (version ))
207
+ self .logger .info (", " .join (found_cves .keys ()))
207
208
208
- self .logger .debug ("Done scanning file: %r" , filename )
209
+ self .logger .debug ("Done scanning file: %r" % filename )
209
210
return self .all_cves
210
211
211
212
def extract_and_scan (self , filename , walker = None ):
@@ -250,7 +251,9 @@ def scan_and_or_extract_file(scanner, ectx, walker, should_extract, filepath):
250
251
# Attempt to extract the file and scan the contents
251
252
if ectx .can_extract (filepath ):
252
253
if not should_extract :
253
- LOGGER .debug ("%s is an archive. Pass " % (filepath ,) + "-x option to auto-extract" )
254
+ LOGGER .warning (
255
+ "%s is an archive. Pass " % (filepath ,) + "-x option to auto-extract"
256
+ )
254
257
return
255
258
for filename in walker ([ectx .extract (filepath )]):
256
259
scan_and_or_extract_file (scanner , ectx , walker , should_extract , filename )
@@ -261,20 +264,22 @@ def extract_file(ectx, walker, should_extract, filepath, file_list):
261
264
if ectx .can_extract (filepath ):
262
265
if not should_extract :
263
266
file_list .append (filepath )
264
- LOGGER .debug ("%s is an archive. Pass " % (filepath ,) + "-x option to auto-extract" )
267
+ LOGGER .warning (
268
+ "%s is an archive. Pass " % (filepath ,) + "-x option to auto-extract"
269
+ )
265
270
return
266
271
for filename in walker ([ectx .extract (filepath )]):
267
272
extract_file (ectx , walker , should_extract , filename , file_list )
268
273
file_list .append (filepath )
269
274
270
275
271
276
def scan_files (scanning_file , args ):
272
- nvd = NVDSQLite (quiet = args [ "quiet" ] )
277
+ nvd = NVDSQLite ()
273
278
if args ["update" ] != "never" :
274
279
nvd .get_cvelist_if_stale ()
275
280
with nvd :
276
- scanner = Scanner (nvd , verbose = args [ "verbose" ] )
277
- scanner .remove_skiplist (args ["skips" ], args [ "quiet" ] )
281
+ scanner = Scanner (nvd )
282
+ scanner .remove_skiplist (args ["skips" ])
278
283
scanner .scan_file (scanning_file )
279
284
return scanner .files_with_cve
280
285
@@ -313,13 +318,6 @@ def main(argv=None, outfile=sys.stdout):
313
318
parser .add_argument (
314
319
"-x" , "--extract" , action = "store_true" , help = "autoextract compressed files"
315
320
)
316
- parser .add_argument (
317
- "-v" ,
318
- "--verbose" ,
319
- action = "store_true" ,
320
- help = "details on found issues as script runs" ,
321
- )
322
- parser .add_argument ("-q" , "--quiet" , action = "store_true" , help = "suppress output" )
323
321
parser .add_argument (
324
322
"-l" ,
325
323
"--log" ,
@@ -357,10 +355,10 @@ def main(argv=None, outfile=sys.stdout):
357
355
args = parser .parse_args (argv [1 :])
358
356
except SystemExit :
359
357
# override default argparse exit(2) behaviour so positive numbers can indicate
360
- # number of cves (useful in quiet mode)
361
358
sys .exit (- 2 )
362
359
363
- logging .basicConfig (level = args .log_level )
360
+ if args .log_level :
361
+ LOGGER .setLevel (args .log_level )
364
362
365
363
if platform .system () != "Linux" :
366
364
warning_nolinux = """
@@ -386,25 +384,22 @@ def main(argv=None, outfile=sys.stdout):
386
384
).walk
387
385
388
386
if args .update == "now" :
389
- if not args .quiet :
390
- LOGGER .debug ("Removing all cached CVE data." )
387
+ LOGGER .debug ("Removing all cached CVE data." )
391
388
NVDSQLite .clear_cached_data ()
392
389
393
390
# Single-thread mode
394
391
if not args .multithread :
395
392
# Close database when done
396
- nvd = NVDSQLite (quiet = args . quiet )
393
+ nvd = NVDSQLite ()
397
394
# Update CVE database
398
395
if args .update != "never" :
399
- if not args .quiet :
400
- LOGGER .debug ("Checking if CVE data needs an update." )
396
+ LOGGER .debug ("Checking if CVE data needs an update." )
401
397
nvd .get_cvelist_if_stale ()
402
398
with nvd :
403
399
extractor = Extractor ()
404
- scanner = Scanner (nvd , verbose = args .verbose )
405
- scanner .remove_skiplist (args .skips , args .quiet )
406
- if args .verbose :
407
- scanner .print_checkers ()
400
+ scanner = Scanner (nvd )
401
+ scanner .remove_skiplist (args .skips )
402
+ scanner .print_checkers ()
408
403
409
404
with extractor () as ectx :
410
405
if os .path .isdir (args .directory ):
@@ -417,21 +412,22 @@ def main(argv=None, outfile=sys.stdout):
417
412
scanner , ectx , walker , args .extract , args .directory
418
413
)
419
414
420
- if not args .quiet :
421
- LOGGER .info ("" )
422
- LOGGER .info ("Overall CVE summary: " )
423
- LOGGER .info (
424
- "There are" + str (scanner .files_with_cve ) + "files with known CVEs detected"
425
- )
426
- if (not args .quiet ) and scanner .files_with_cve > 0 :
415
+ LOGGER .info ("" )
416
+ LOGGER .info ("Overall CVE summary: " )
417
+ LOGGER .info (
418
+ "There are "
419
+ + str (scanner .files_with_cve )
420
+ + " files with known CVEs detected"
421
+ )
422
+ if scanner .files_with_cve > 0 :
427
423
affected_string = ", " .join (
428
424
map (
429
425
lambda module_version : " " .join (str (module_version )),
430
426
scanner .affected (),
431
427
)
432
428
)
433
429
LOGGER .info ("Known CVEs in %s:" % (affected_string ,))
434
- output_cves (outfile , scanner .all_cves , include_details = args . verbose )
430
+ output_cves (outfile , scanner .all_cves )
435
431
436
432
# Use the number of files with known cves as error code
437
433
# as requested by folk planning to automate use of this script.
@@ -442,12 +438,12 @@ def main(argv=None, outfile=sys.stdout):
442
438
else :
443
439
444
440
def worker ():
445
- nvd = NVDSQLite (quiet = args . quiet )
441
+ nvd = NVDSQLite ()
446
442
if args .update != "never" :
447
443
nvd .get_cvelist_if_stale ()
448
444
with nvd :
449
- scanner = Scanner (nvd , verbose = args . verbose )
450
- scanner .remove_skiplist (args .skips , args . quiet )
445
+ scanner = Scanner (nvd )
446
+ scanner .remove_skiplist (args .skips )
451
447
while True :
452
448
scan_target = q .get ()
453
449
if not scan_target :
0 commit comments