Skip to content

Commit 3abdc3f

Browse files
authored
Merge pull request #1176 from TG1999/fix_apache_kafka_apache_httpd
Fix Apache kafka and Apache httpd importer
2 parents c71edf1 + 8d614e9 commit 3abdc3f

File tree

4 files changed

+49
-48
lines changed

4 files changed

+49
-48
lines changed

CHANGELOG.rst

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,13 @@ Release notes
22
=============
33

44

5+
Next release
6+
-------------
7+
8+
- We fixed Apache HTTPD and Apache Kafka importer.
9+
- We removed excessive network calls from Redhat importer.
10+
11+
512
Version v32.0.0rc4
613
-------------------
714

vulnerabilities/importers/apache_httpd.py

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
from vulnerabilities.importer import Reference
2424
from vulnerabilities.importer import VulnerabilitySeverity
2525
from vulnerabilities.severity_systems import APACHE_HTTPD
26+
from vulnerabilities.utils import get_item
2627

2728
logger = logging.getLogger(__name__)
2829

@@ -40,16 +41,18 @@ def advisory_data(self):
4041
yield self.to_advisory(data)
4142

4243
def to_advisory(self, data):
43-
alias = data["CVE_data_meta"]["ID"]
44-
descriptions = data["description"]["description_data"]
44+
alias = get_item(data, "CVE_data_meta", "ID")
45+
if not alias:
46+
alias = get_item(data, "cveMetadata", "cveId")
47+
descriptions = get_item(data, "description", "description_data") or []
4548
description = None
4649
for desc in descriptions:
47-
if desc["lang"] == "eng":
50+
if desc.get("lang") == "eng":
4851
description = desc.get("value")
4952
break
5053

5154
severities = []
52-
impacts = data.get("impact", [])
55+
impacts = data.get("impact") or []
5356
for impact in impacts:
5457
value = impact.get("other")
5558
if value:
@@ -68,14 +71,14 @@ def to_advisory(self, data):
6871
)
6972

7073
versions_data = []
71-
for vendor in data["affects"]["vendor"]["vendor_data"]:
72-
for products in vendor["product"]["product_data"]:
73-
for version_data in products["version"]["version_data"]:
74+
for vendor in get_item(data, "affects", "vendor", "vendor_data") or []:
75+
for products in get_item(vendor, "product", "product_data") or []:
76+
for version_data in get_item(products, "version", "version_data") or []:
7477
versions_data.append(version_data)
7578

7679
fixed_versions = []
7780
for timeline_object in data.get("timeline") or []:
78-
timeline_value = timeline_object["value"]
81+
timeline_value = timeline_object.get("value")
7982
if "release" in timeline_value:
8083
split_timeline_value = timeline_value.split(" ")
8184
if "never" in timeline_value:
@@ -100,7 +103,7 @@ def to_advisory(self, data):
100103

101104
return AdvisoryData(
102105
aliases=[alias],
103-
summary=description,
106+
summary=description or "",
104107
affected_packages=affected_packages,
105108
references=[reference],
106109
)

vulnerabilities/importers/apache_kafka.py

Lines changed: 30 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
#
99

1010

11+
import logging
12+
1113
import pytz
1214
import requests
1315
from bs4 import BeautifulSoup
@@ -19,6 +21,8 @@
1921
from vulnerabilities.importer import Importer
2022
from vulnerabilities.importer import Reference
2123

24+
logger = logging.getLogger(__name__)
25+
2226
# The entries below with `"action": "omit"` have no useful/reportable fixed or affected version data.
2327
# See https://kafka.apache.org/cve-list
2428
affected_version_range_mapping = {
@@ -135,13 +139,17 @@ def to_advisory(self, advisory_page):
135139
fixed_versions_clean = [v.strip() for v in fixed_versions.split(",")]
136140
fixed_versions_clean = [v for v in fixed_versions if v]
137141

138-
# This throws a KeyError if the opening h2 tag `id` data changes or is not in the
139-
# hard-coded affected_version_range_mapping dictionary.
140-
cve_version_mapping = affected_version_range_mapping[cve_id]
141-
if cve_version_mapping["action"] == "include":
142-
# These 2 variables (not used elsewhere) trigger the KeyError for changed/missing data.
143-
check_affected_versions_key = cve_version_mapping[affected_versions]
144-
check_fixed_versions_key = cve_version_mapping[fixed_versions]
142+
cve_version_mapping = affected_version_range_mapping.get(cve_id)
143+
if not cve_version_mapping:
144+
logger.error(f"Data for {cve_id} not found in mapping. Skipping.")
145+
if cve_version_mapping and cve_version_mapping.get("action") == "include":
146+
check_affected_versions_key = cve_version_mapping.get(affected_versions) or []
147+
check_fixed_versions_key = cve_version_mapping.get(fixed_versions) or []
148+
149+
if not check_affected_versions_key:
150+
logger.error(f"Affected versions for {cve_id} not found in mapping. Skipping.")
151+
if not check_fixed_versions_key:
152+
logger.error(f"Fixed versions for {cve_id} not found in mapping. Skipping.")
145153

146154
references = [
147155
Reference(
@@ -159,18 +167,22 @@ def to_advisory(self, advisory_page):
159167
]
160168

161169
affected_packages = []
162-
affected_package = AffectedPackage(
163-
package=PackageURL(
164-
name="kafka",
165-
type="apache",
166-
),
167-
affected_version_range=cve_version_mapping["affected_version_range"],
168-
)
169-
affected_packages.append(affected_package)
170+
affected_version_range = cve_version_mapping.get("affected_version_range")
171+
if cve_version_mapping.get("affected_version_range"):
172+
affected_package = AffectedPackage(
173+
package=PackageURL(
174+
name="kafka",
175+
type="apache",
176+
),
177+
affected_version_range=affected_version_range,
178+
)
179+
affected_packages.append(affected_package)
170180

171-
date_published = parse(cve_version_mapping["Issue announced"]).replace(
172-
tzinfo=pytz.UTC
173-
)
181+
date_published = None
182+
issue_announced = cve_version_mapping.get("Issue announced")
183+
184+
if issue_announced:
185+
date_published = parse(issue_announced).replace(tzinfo=pytz.UTC)
174186

175187
advisories.append(
176188
AdvisoryData(

vulnerabilities/tests/test_apache_kafka.py

Lines changed: 0 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -69,34 +69,13 @@ def to_advisory_changed_cve():
6969
advisories = ApacheKafkaImporter().to_advisory(raw_data)
7070

7171

72-
def test_to_advisory_changed_cve_exception():
73-
with pytest.raises(KeyError) as excinfo:
74-
to_advisory_changed_cve()
75-
76-
assert "CVE-2022-34918" in str(excinfo.value)
77-
78-
7972
def to_advisory_changed_versions_affected():
8073
with open(os.path.join(TEST_DATA, "cve-list-changed-versions-affected.html")) as f:
8174
raw_data = f.read()
8275
advisories = ApacheKafkaImporter().to_advisory(raw_data)
8376

8477

85-
def test_to_advisory_changed_versions_affected_exception():
86-
with pytest.raises(KeyError) as excinfo:
87-
to_advisory_changed_versions_affected()
88-
89-
assert "2.8.0 - 2.8.1, 3.0.0 - 3.0.1, 3.1.0 - 3.1.1, 3.2.0 - 3.2.2" in str(excinfo.value)
90-
91-
9278
def to_advisory_changed_fixed_versions():
9379
with open(os.path.join(TEST_DATA, "cve-list-changed-fixed-versions.html")) as f:
9480
raw_data = f.read()
9581
advisories = ApacheKafkaImporter().to_advisory(raw_data)
96-
97-
98-
def test_to_advisory_changed_fixed_versions_exception():
99-
with pytest.raises(KeyError) as excinfo:
100-
to_advisory_changed_fixed_versions()
101-
102-
assert "2.8.2, 3.0.2, 3.1.2, 3.2.4" in str(excinfo.value)

0 commit comments

Comments
 (0)