Skip to content

Commit d78cd0f

Browse files
committed
Add scoring system for vectors
Signed-off-by: Shivam Sandbhor <shivam.sandbhor@gmail.com>
1 parent 5428b37 commit d78cd0f

14 files changed

Lines changed: 145 additions & 370 deletions

vulnerabilities/admin.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
Package,
3030
Vulnerability,
3131
VulnerabilityReference,
32+
VulnerabilitySeverity
3233
)
3334

3435

@@ -55,3 +56,7 @@ class PackageRelatedVulnerabilityAdmin(admin.ModelAdmin):
5556
@admin.register(Importer)
5657
class ImporterAdmin(admin.ModelAdmin):
5758
pass
59+
60+
@admin.register(VulnerabilitySeverity)
61+
class VulnerabilitySeverityAdmin(admin.ModelAdmin):
62+
pass

vulnerabilities/importers/nvd.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,12 @@ def extract_severity_scores(cve_item):
111111
value=str(cve_item["impact"]["baseMetricV3"]["cvssV3"]["baseScore"]),
112112
)
113113
)
114+
severity_scores.append(
115+
VulnerabilitySeverity(
116+
system=scoring_systems["cvssv3_vector"],
117+
value=str(cve_item["impact"]["baseMetricV3"]["cvssV3"]["vectorString"]),
118+
)
119+
)
114120

115121
if cve_item["impact"].get("baseMetricV2"):
116122
severity_scores.append(
@@ -119,6 +125,12 @@ def extract_severity_scores(cve_item):
119125
value=str(cve_item["impact"]["baseMetricV2"]["cvssV2"]["baseScore"]),
120126
)
121127
)
128+
severity_scores.append(
129+
VulnerabilitySeverity(
130+
system=scoring_systems["cvssv2_vector"],
131+
value=str(cve_item["impact"]["baseMetricV2"]["cvssV2"]["vectorString"]),
132+
)
133+
)
122134

123135
return severity_scores
124136

vulnerabilities/importers/redhat.py

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ def __enter__(self):
4343
def updated_advisories(self):
4444
processed_advisories = []
4545
for advisory_data in self.redhat_response:
46-
processed_advisories.extend(to_advisory(advisory_data))
46+
processed_advisories.append(to_advisory(advisory_data))
4747

4848
return self.batch_advisories(processed_advisories)
4949

@@ -55,7 +55,6 @@ def fetch():
5555
url = "https://access.redhat.com/hydra/rest/securitydata/cve.json?page={}"
5656

5757
while True:
58-
5958
resp_json = requests.get(url.format(page_no)).json()
6059
page_no += 1
6160
if not resp_json:
@@ -68,7 +67,6 @@ def fetch():
6867

6968

7069
def to_advisory(advisory_data):
71-
7270
affected_purls = []
7371
if advisory_data.get("affected_packages"):
7472
for rpm in advisory_data["affected_packages"]:
@@ -117,14 +115,26 @@ def to_advisory(advisory_data):
117115
else:
118116
references.append(Reference(severities=[], url=url, reference_id=rh_adv))
119117

120-
redhat_cve_entry = requests.get(advisory_data["resource_url"]).json()
121-
redhat_cvss = redhat_cve_entry["cvss3"]["cvss3_base_score"]
122-
redhat_cvss3 = VulnerabilitySeverity(
123-
system=scoring_systems["rh_cvssv3"],
124-
value=redhat_cvss,
125-
)
118+
redhat_scores = []
119+
cvssv3_score = advisory_data.get("cvss3_score")
120+
if cvssv3_score:
121+
redhat_scores.append(
122+
VulnerabilitySeverity(
123+
system=scoring_systems["cvssv3"],
124+
value=cvssv3_score,
125+
)
126+
)
127+
128+
cvssv3_vector = advisory_data.get("cvss3_scoring_vector")
129+
if cvssv3_vector:
130+
redhat_scores.append(
131+
VulnerabilitySeverity(
132+
system=scoring_systems["cvssv3_vector"],
133+
value=cvssv3_vector,
134+
)
135+
)
126136

127-
references.append(Reference(severities=[redhat_cvss3], url=advisory_data["resource_url"]))
137+
references.append(Reference(severities=redhat_scores, url=advisory_data["resource_url"]))
128138

129139
return Advisory(
130140
summary=advisory_data["bugzilla_description"],

vulnerabilities/migrations/0001_initial.py

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# Generated by Django 3.0.7 on 2021-01-21 16:32
1+
# Generated by Django 3.0.7 on 2021-02-03 07:30
22

33
import django.contrib.postgres.fields.jsonb
44
from django.db import migrations, models
@@ -49,12 +49,24 @@ class Migration(migrations.Migration):
4949
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
5050
('cve_id', models.CharField(help_text='CVE ID', max_length=50, null=True, unique=True)),
5151
('summary', models.TextField(blank=True, help_text='Summary of the vulnerability')),
52-
('cvss', models.FloatField(help_text='CVSS Score', max_length=100, null=True)),
5352
],
5453
options={
5554
'verbose_name_plural': 'Vulnerabilities',
5655
},
5756
),
57+
migrations.CreateModel(
58+
name='VulnerabilityReference',
59+
fields=[
60+
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
61+
('source', models.CharField(blank=True, help_text='Source(s) name eg:NVD', max_length=50)),
62+
('reference_id', models.CharField(blank=True, help_text='Reference ID, eg:DSA-4465-1', max_length=50)),
63+
('url', models.URLField(blank=True, help_text='URL of Vulnerability data', max_length=1024)),
64+
('vulnerability', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='vulnerabilities.Vulnerability')),
65+
],
66+
options={
67+
'unique_together': {('vulnerability', 'source', 'reference_id', 'url')},
68+
},
69+
),
5870
migrations.CreateModel(
5971
name='PackageRelatedVulnerability',
6072
fields=[
@@ -74,16 +86,16 @@ class Migration(migrations.Migration):
7486
field=models.ManyToManyField(through='vulnerabilities.PackageRelatedVulnerability', to='vulnerabilities.Vulnerability'),
7587
),
7688
migrations.CreateModel(
77-
name='VulnerabilityReference',
89+
name='VulnerabilitySeverity',
7890
fields=[
7991
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
80-
('source', models.CharField(blank=True, help_text='Source(s) name eg:NVD', max_length=50)),
81-
('reference_id', models.CharField(blank=True, help_text='Reference ID, eg:DSA-4465-1', max_length=50)),
82-
('url', models.URLField(blank=True, help_text='URL of Vulnerability data', max_length=1024)),
92+
('value', models.CharField(help_text='Example: 9.0, Important, High', max_length=50)),
93+
('scoring_system', models.CharField(choices=[('cvssv2', 'CVSSv2'), ('cvssv3', 'CVSSv3'), ('rhbs', 'RedHat Bugzilla severity'), ('rhas', 'RedHat Aggregate severity')], help_text='Identifier for the scoring system used. Avaiable choices are: cvssv2 is identifier for CVSSv2 system, cvssv3 is identifier for CVSSv3 system, rhbs is identifier for RedHat Bugzilla severity system, rhas is identifier for RedHat Aggregate severity system ', max_length=50)),
94+
('reference', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='vulnerabilities.VulnerabilityReference')),
8395
('vulnerability', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='vulnerabilities.Vulnerability')),
8496
],
8597
options={
86-
'unique_together': {('vulnerability', 'source', 'reference_id', 'url')},
98+
'unique_together': {('vulnerability', 'reference', 'scoring_system')},
8799
},
88100
),
89101
migrations.AlterUniqueTogether(

vulnerabilities/migrations/0002_vulnerabilityseverityscore.py

Lines changed: 0 additions & 24 deletions
This file was deleted.

vulnerabilities/migrations/0003_auto_20201127_1423.py

Lines changed: 0 additions & 27 deletions
This file was deleted.

vulnerabilities/migrations/0004_auto_20201129_1024.py

Lines changed: 0 additions & 17 deletions
This file was deleted.

vulnerabilities/migrations/0005_auto_20201218_0824.py

Lines changed: 0 additions & 27 deletions
This file was deleted.

vulnerabilities/migrations/0006_auto_20210123_0616.py

Lines changed: 0 additions & 27 deletions
This file was deleted.

vulnerabilities/models.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -210,7 +210,7 @@ class VulnerabilitySeverity(models.Model):
210210
scoring_system = models.CharField(
211211
max_length=50,
212212
choices=scoring_system_choices,
213-
help_text="Identifier for the scoring system used. Avaiable choices are: {} ".format(
213+
help_text="Identifier for the scoring system used. Available choices are: {} ".format(
214214
", ".join(
215215
[
216216
f"{ss.identifier} is identifier for {ss.name} system"

0 commit comments

Comments
 (0)