Skip to content

Commit 226a78b

Browse files
committed
fix: handle disabled_sources in get_vendor_product_pairs
get_vendor_product_pairs function doesn't handle disabled sources passed by the user. As a result, the user can't disable a datasource (e.g., OSV) when parsing a python PKG-INFO file. Fix this by passing enabled_sources from cli to version_scanner and then to cvedb. To achieve this functionality, source_nvd must also be added to enabled_sources when appropriate. nosec must be added to disable this bandit warning: >> Issue: [B608:hardcoded_sql_expressions] Possible SQL injection vector through string-based query construction. Severity: Medium Confidence: Low CWE: CWE-89 (https://cwe.mitre.org/data/definitions/89.html) Location: cve_bin_tool/cvedb.py:681:12 More Info: https://bandit.readthedocs.io/en/1.7.4/plugins/b608_hardcoded_sql_expressions.html Indeed, sources is retrieved from self.sources[i].source_name which can't be updated by an attacker Signed-off-by: Fabrice Fontaine <[email protected]>
1 parent c5da274 commit 226a78b

File tree

3 files changed

+12
-12
lines changed

3 files changed

+12
-12
lines changed

cve_bin_tool/cli.py

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -734,15 +734,12 @@ def main(argv=None):
734734
nvd_api_key=args["nvd_api_key"],
735735
error_mode=error_mode,
736736
)
737-
default_sources = [source_nvd]
738-
default_sources.extend(enabled_sources)
739-
else:
740-
default_sources = enabled_sources
737+
enabled_sources = [source_nvd] + enabled_sources
741738

742739
# Database update related settings
743740
# Connect to the database
744741
cvedb_orig = CVEDB(
745-
sources=default_sources,
742+
sources=enabled_sources,
746743
version_check=not version_check,
747744
error_mode=error_mode,
748745
)
@@ -1024,6 +1021,7 @@ def main(argv=None):
10241021
exclude_folders=args["exclude"],
10251022
error_mode=error_mode,
10261023
validate=not args["disable_validation_check"],
1024+
sources=enabled_sources,
10271025
)
10281026
version_scanner.remove_skiplist(skips)
10291027
LOGGER.info(f"Number of checkers: {version_scanner.number_of_checkers()}")

cve_bin_tool/cvedb.py

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -677,14 +677,15 @@ def get_vendor_product_pairs(self, package_names) -> list[dict[str, str]]:
677677
"""
678678
cursor = self.db_open_and_get_cursor()
679679
vendor_package_pairs = []
680-
query = """
681-
SELECT DISTINCT vendor FROM cve_range
682-
WHERE product=?
683-
"""
680+
query = (
681+
"SELECT DISTINCT vendor FROM cve_range WHERE product=? AND data_source IN (%s)" # nosec
682+
% ",".join("?" for i in self.sources)
683+
)
684684

685+
data_sources = list(map(lambda x: x.source_name, self.sources))
685686
# For python package checkers we don't need the progress bar running
686687
if type(package_names) is not list:
687-
cursor.execute(query, [package_names])
688+
cursor.execute(query, [package_names] + data_sources)
688689
vendors = list(map(lambda x: x[0], cursor.fetchall()))
689690

690691
for vendor in vendors:
@@ -703,7 +704,7 @@ def get_vendor_product_pairs(self, package_names) -> list[dict[str, str]]:
703704
for package_name in track(
704705
package_names, description="Processing the given list...."
705706
):
706-
cursor.execute(query, [package_name["name"].lower()])
707+
cursor.execute(query, [package_name["name"].lower()] + data_sources)
707708
vendors = list(map(lambda x: x[0], cursor.fetchall()))
708709
for vendor in vendors:
709710
if vendor != "":

cve_bin_tool/version_scanner.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ def __init__(
5454
error_mode: ErrorMode = ErrorMode.TruncTrace,
5555
score: int = 0,
5656
validate: bool = True,
57+
sources=None,
5758
):
5859
self.logger = logger or LOGGER.getChild(self.__class__.__name__)
5960
# Update egg if installed in development mode
@@ -76,7 +77,7 @@ def __init__(
7677
self.should_extract = should_extract
7778
self.file_stack: list[str] = []
7879
self.error_mode = error_mode
79-
self.cve_db = CVEDB()
80+
self.cve_db = CVEDB(sources=sources)
8081
self.validate = validate
8182
# self.logger.info("Checkers loaded: %s" % (", ".join(self.checkers.keys())))
8283
self.language_checkers = self.available_language_checkers()

0 commit comments

Comments
 (0)