Skip to content

Commit 0178500

Browse files
committed
Add severity range score
Signed-off-by: Tushar Goel <[email protected]>
1 parent d62f377 commit 0178500

File tree

1 file changed

+31
-1
lines changed

1 file changed

+31
-1
lines changed

vulnerabilities/api.py

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
from django.db.models import Prefetch
1313
from django_filters import rest_framework as filters
1414
from drf_spectacular.utils import extend_schema
15-
from drf_spectacular.utils import inline_serializer
1615
from packageurl import PackageURL
1716
from packageurl import normalize_qualifiers
1817
from rest_framework import serializers
@@ -32,7 +31,12 @@
3231
from vulnerabilities.models import VulnerabilitySeverity
3332
from vulnerabilities.models import Weakness
3433
from vulnerabilities.models import get_purl_query_lookups
34+
from vulnerabilities.severity_systems import EPSS, SCORING_SYSTEMS
3535
from vulnerabilities.throttling import StaffUserRateThrottle
36+
from vulnerabilities.utils import get_severity_range
37+
from cvss.exceptions import CVSS2MalformedError
38+
from cvss.exceptions import CVSS3MalformedError
39+
from cvss.exceptions import CVSS4MalformedError
3640

3741

3842
class VulnerabilitySeveritySerializer(serializers.ModelSerializer):
@@ -193,6 +197,7 @@ class VulnerabilitySerializer(BaseResourceSerializer):
193197
aliases = AliasSerializer(many=True, source="alias")
194198
kev = KEVSerializer(read_only=True)
195199
weaknesses = WeaknessSerializer(many=True)
200+
severity_range_score = serializers.SerializerMethodField()
196201

197202
def to_representation(self, instance):
198203
data = super().to_representation(instance)
@@ -205,6 +210,30 @@ def to_representation(self, instance):
205210
data.pop("kev")
206211

207212
return data
213+
214+
def get_severity_range_score(self, instance):
215+
severity_vectors = []
216+
severity_values = set()
217+
for s in instance.severities:
218+
if s.scoring_system == EPSS.identifier:
219+
continue
220+
221+
if s.scoring_elements and s.scoring_system in SCORING_SYSTEMS:
222+
try:
223+
vector_values = SCORING_SYSTEMS[s.scoring_system].get(s.scoring_elements)
224+
severity_vectors.append(vector_values)
225+
except (
226+
CVSS2MalformedError,
227+
CVSS3MalformedError,
228+
CVSS4MalformedError,
229+
NotImplementedError,
230+
):
231+
pass
232+
233+
if s.value:
234+
severity_values.add(s.value)
235+
severity_range = get_severity_range(severity_values)
236+
return severity_range
208237

209238
class Meta:
210239
model = Vulnerability
@@ -218,6 +247,7 @@ class Meta:
218247
"references",
219248
"weaknesses",
220249
"kev",
250+
"severity_range_score",
221251
]
222252

223253

0 commit comments

Comments
 (0)