Skip to content

Commit 43d9ac4

Browse files
committed
Fillup missing vulnerabilities summary
Signed-off-by: Tushar Goel <[email protected]>
1 parent fabe035 commit 43d9ac4

File tree

2 files changed

+44
-0
lines changed

2 files changed

+44
-0
lines changed

vulnerabilities/improvers/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
from vulnerabilities.pipelines import enhance_with_kev
1919
from vulnerabilities.pipelines import enhance_with_metasploit
2020
from vulnerabilities.pipelines import flag_ghost_packages
21+
from vulnerabilities.pipelines import fill_vulnerability_summary_pipeline
2122

2223
IMPROVERS_REGISTRY = [
2324
valid_versions.GitHubBasicImprover,
@@ -45,6 +46,7 @@
4546
compute_package_version_rank.ComputeVersionRankPipeline,
4647
collect_commits.CollectFixCommitsPipeline,
4748
add_cvss31_to_CVEs.CVEAdvisoryMappingPipeline,
49+
fill_vulnerability_summary_pipeline.FillVulnerabilitySummariesPipeline,
4850
]
4951

5052
IMPROVERS_REGISTRY = {
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
import logging
2+
from vulnerabilities.models import Vulnerability, Advisory
3+
from vulnerabilities.pipelines import VulnerableCodePipeline
4+
from django.db.models import Q
5+
6+
7+
class FillVulnerabilitySummariesPipeline(VulnerableCodePipeline):
8+
"""Pipeline to fill missing vulnerability summaries from advisories."""
9+
10+
pipeline_id = "fill_vulnerability_summaries"
11+
12+
@classmethod
13+
def steps(cls):
14+
return (cls.fill_missing_summaries,)
15+
16+
def fill_missing_summaries(self):
17+
"""Find vulnerabilities without summaries and fill them using advisories with the same aliases."""
18+
vulnerabilities_qs = Vulnerability.objects.filter(summary="").prefetch_related("aliases")
19+
self.log(f"Processing {vulnerabilities_qs.count()} vulnerabilities without summaries", level=logging.INFO)
20+
nvd_importer_advisories = Advisory.objects.filter(created_by="nvd_importer", summary__isnull=False).exclude(summary="")
21+
self.log(f"Found {nvd_importer_advisories.count()} advisories from NVD importer", level=logging.INFO)
22+
23+
for vulnerability in vulnerabilities_qs:
24+
aliases = vulnerability.aliases.values_list("alias", flat=True)
25+
alias = aliases.first()
26+
27+
# check if the vulnerability has an alias
28+
if not alias:
29+
self.log(f"Vulnerability {vulnerability.vulnerability_id} has no alias", level=logging.INFO)
30+
continue
31+
32+
# check if the vulnerability has an alias that matches an advisory
33+
matching_advisories = nvd_importer_advisories.filter(Q(aliases__contains=alias))
34+
35+
if matching_advisories.exists():
36+
best_advisory = matching_advisories.first() # Take the first matching advisory with a summary
37+
vulnerability.summary = best_advisory.summary
38+
vulnerability.save()
39+
if self.log:
40+
self.log(f"Updated summary for vulnerability {vulnerability.vulnerability_id}", level=logging.INFO)
41+
else:
42+
self.log(f"No advisory found for alias {alias}", level=logging.INFO)

0 commit comments

Comments
 (0)