Skip to content

Commit a66e519

Browse files
committed
chore: remove enriched_cvss fields
1 parent d11418a commit a66e519

13 files changed

+140
-92
lines changed

backend/application/core/api/serializers_observation.py

+20
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@ class ObservationSerializer(ModelSerializer):
8787
issue_tracker_issue_url = SerializerMethodField()
8888
assessment_needs_approval = SerializerMethodField()
8989
vulnerability_id_aliases = SerializerMethodField()
90+
cve_found_in = SerializerMethodField()
9091

9192
class Meta:
9293
model = Observation
@@ -127,6 +128,9 @@ def get_assessment_needs_approval(self, observation: Observation) -> Optional[in
127128
def get_vulnerability_id_aliases(self, observation: Observation) -> list[dict[str, str]]:
128129
return _get_vulnerability_id_aliases(observation)
129130

131+
def get_cve_found_in(self, observation: Observation) -> list[dict[str, str]]:
132+
return _get_cve_found_in_sources(observation)
133+
130134
def validate_product(self, product: Product) -> Product:
131135
if product and product.is_product_group:
132136
raise ValidationError("Product must not be a product group")
@@ -149,6 +153,7 @@ class ObservationListSerializer(ModelSerializer):
149153
origin_source_file_url = SerializerMethodField()
150154
origin_component_purl_namespace = SerializerMethodField()
151155
vulnerability_id_aliases = SerializerMethodField()
156+
cve_found_in = SerializerMethodField()
152157

153158
class Meta:
154159
model = Observation
@@ -176,6 +181,9 @@ def get_origin_component_purl_namespace(self, observation: Observation) -> Optio
176181
def get_vulnerability_id_aliases(self, observation: Observation) -> list[dict[str, str]]:
177182
return _get_vulnerability_id_aliases(observation)
178183

184+
def get_cve_found_in(self, observation: Observation) -> list[dict[str, str]]:
185+
return _get_cve_found_in_sources(observation)
186+
179187

180188
def _get_origin_source_file_url(observation: Observation) -> Optional[str]:
181189
origin_source_file_url = None
@@ -244,6 +252,14 @@ def _get_vulnerability_id_aliases(observation: Observation) -> list[dict[str, st
244252
return return_list
245253

246254

255+
def _get_cve_found_in_sources(observation: Observation) -> list[dict[str, str]]:
256+
sources_list = get_comma_separated_as_list(observation.cve_found_in)
257+
return_list = []
258+
for source in sources_list:
259+
return_list.append({"source": source})
260+
return return_list
261+
262+
247263
class ObservationUpdateSerializer(ModelSerializer):
248264
def validate(self, attrs: dict) -> dict:
249265
self.instance: Observation
@@ -509,6 +525,7 @@ class ObservationBulkMarkDuplicatesSerializer(Serializer):
509525
class NestedObservationSerializer(ModelSerializer):
510526
scanner_name = SerializerMethodField()
511527
origin_component_name_version = SerializerMethodField()
528+
cve_found_in = SerializerMethodField()
512529

513530
class Meta:
514531
model = Observation
@@ -520,6 +537,9 @@ def get_scanner_name(self, observation: Observation) -> str:
520537
def get_origin_component_name_version(self, observation: Observation) -> str:
521538
return get_origin_component_name_version(observation)
522539

540+
def get_cve_found_in(self, observation: Observation) -> list[dict[str, str]]:
541+
return _get_cve_found_in_sources(observation)
542+
523543

524544
class ObservationLogSerializer(ModelSerializer):
525545
observation_data = ObservationSerializer(source="observation")

backend/application/core/migrations/0061_observation_cve_found_in_and_more.py

-10
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,4 @@ class Migration(migrations.Migration):
1515
name="cve_found_in",
1616
field=models.CharField(blank=True, max_length=255),
1717
),
18-
migrations.AddField(
19-
model_name="observation",
20-
name="enriched_cvss_score",
21-
field=models.DecimalField(decimal_places=1, max_digits=3, null=True),
22-
),
23-
migrations.AddField(
24-
model_name="observation",
25-
name="enriched_cvss_vector",
26-
field=models.CharField(blank=True, max_length=255),
27-
),
2818
]

backend/application/core/models.py

-2
Original file line numberDiff line numberDiff line change
@@ -430,8 +430,6 @@ class Observation(Model):
430430
cvss3_vector = CharField(max_length=255, blank=True)
431431
cvss4_score = DecimalField(max_digits=3, decimal_places=1, null=True)
432432
cvss4_vector = CharField(max_length=255, blank=True)
433-
enriched_cvss_score = DecimalField(max_digits=3, decimal_places=1, null=True)
434-
enriched_cvss_vector = CharField(max_length=255, blank=True)
435433
cve_found_in = CharField(max_length=255, blank=True)
436434

437435
cwe = IntegerField(null=True, validators=[MinValueValidator(1), MaxValueValidator(999999)])

backend/application/core/services/observation.py

-5
Original file line numberDiff line numberDiff line change
@@ -78,9 +78,6 @@ def get_current_severity(observation: Observation) -> str:
7878
if observation.parser_severity:
7979
return observation.parser_severity
8080

81-
if observation.enriched_cvss_score is not None:
82-
return get_cvss_severity(observation.enriched_cvss_score)
83-
8481
if observation.cvss4_score is not None:
8582
return get_cvss_severity(observation.cvss4_score)
8683

@@ -191,8 +188,6 @@ def normalize_cvss_vectors(observation: Observation) -> None:
191188
observation.cvss3_vector = ""
192189
if observation.cvss4_vector is None:
193190
observation.cvss4_vector = ""
194-
if observation.enriched_cvss_vector is None:
195-
observation.enriched_cvss_vector = ""
196191
if observation.cve_found_in is None:
197192
observation.cve_found_in = ""
198193

backend/application/epss/migrations/0003_enriched_cvss_alter_epss_score_cve.py

+9-2
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,16 @@ class Migration(migrations.Migration):
1313
migrations.CreateModel(
1414
name="Enriched_CVSS",
1515
fields=[
16-
("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
16+
(
17+
"id",
18+
models.BigAutoField(
19+
auto_created=True,
20+
primary_key=True,
21+
serialize=False,
22+
verbose_name="ID",
23+
),
24+
),
1725
("cve", models.CharField(max_length=255, unique=True)),
18-
("enriched_cvss_vector", models.CharField(blank=True, max_length=255)),
1926
("base_cvss_vector", models.CharField(blank=True, max_length=255)),
2027
("cisa_kev", models.BooleanField(default=False)),
2128
("vulncheck_kev", models.BooleanField(default=False)),

backend/application/epss/models.py

-1
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,6 @@ def load(cls) -> "EPSS_Status":
4040

4141
class Enriched_CVSS(Model):
4242
cve = CharField(max_length=255, unique=True)
43-
enriched_cvss_vector = CharField(max_length=255, blank=True)
4443
base_cvss_vector = CharField(max_length=255, blank=True)
4544
cisa_kev = BooleanField(default=False)
4645
vulncheck_kev = BooleanField(default=False)

backend/application/epss/services/cvss_bt.py

+15-26
Original file line numberDiff line numberDiff line change
@@ -46,13 +46,9 @@ def import_cvss_bt() -> None:
4646
settings = Settings.load()
4747
if int(cve_year) <= current_year - settings.cvss_enrichment_max_age_years:
4848
continue
49-
enriched_cvss_vector = row.get("cvss-bt_vector", "")
50-
if not enriched_cvss_vector.startswith("CVSS:3") and not enriched_cvss_vector.startswith("CVSS:4"):
51-
continue
5249

5350
enriched_cvss = Enriched_CVSS(
5451
cve=cve,
55-
enriched_cvss_vector=enriched_cvss_vector,
5652
base_cvss_vector=row.get("base_vector", ""),
5753
cisa_kev=row.get("cisa_kev", "").lower() == "true",
5854
vulncheck_kev=row.get("vulncheck_kev", "").lower() == "true",
@@ -97,8 +93,6 @@ def enriched_cvss_apply_observations(settings: Settings) -> None:
9793
"cvss3_vector",
9894
"cvss4_score",
9995
"cvss4_vector",
100-
"enriched_cvss_score",
101-
"enriched_cvss_vector",
10296
"cve_found_in",
10397
"current_severity",
10498
],
@@ -115,37 +109,32 @@ def apply_enriched_cvss(observation: Observation, settings: Settings) -> bool:
115109
if not enriched_cvss:
116110
return False
117111

118-
if observation.cvss3_vector and not enriched_cvss.enriched_cvss_vector.startswith(observation.cvss3_vector):
119-
return False
120-
if observation.cvss4_vector and not enriched_cvss.enriched_cvss_vector.startswith(observation.cvss4_vector):
121-
return False
122-
123-
observation.enriched_cvss_vector = enriched_cvss.enriched_cvss_vector
124-
if enriched_cvss.enriched_cvss_vector.startswith("CVSS:3"):
125-
cvss = CVSS3(observation.enriched_cvss_vector)
126-
observation.enriched_cvss_score = cvss.temporal_score
127-
else:
128-
cvss = CVSS4(observation.enriched_cvss_vector)
129-
observation.enriched_cvss_score = cvss.base_score
112+
cvss3_vector_before = observation.cvss3_vector
113+
cvss4_vector_before = observation.cvss4_vector
114+
cve_found_in_before = observation.cve_found_in
130115

131116
if not observation.cvss3_vector and enriched_cvss.base_cvss_vector.startswith("CVSS:3"):
132117
observation.cvss3_vector = enriched_cvss.base_cvss_vector
133118
cvss = CVSS3(observation.cvss3_vector)
134-
observation.cvss3_score = cvss.temporal_score
119+
observation.cvss3_score = cvss.base_score
135120
if not observation.cvss4_vector and enriched_cvss.base_cvss_vector.startswith("CVSS:4"):
136121
observation.cvss4_vector = enriched_cvss.base_cvss_vector
137122
cvss = CVSS4(observation.cvss4_vector)
138123
observation.cvss4_score = cvss.base_score
139124

140125
_add_cve_found_in(observation, enriched_cvss)
141126

142-
observation.current_severity = get_current_severity(observation)
127+
if (
128+
observation.cvss3_vector != cvss3_vector_before
129+
or observation.cvss4_vector != cvss4_vector_before
130+
or observation.cve_found_in != cve_found_in_before
131+
):
132+
observation.current_severity = get_current_severity(observation)
133+
return True
143134

144-
return True
135+
return False
145136
else:
146-
if observation.enriched_cvss_score or observation.enriched_cvss_vector or observation.cve_found_in:
147-
observation.enriched_cvss_score = None
148-
observation.enriched_cvss_vector = ""
137+
if observation.cve_found_in:
149138
observation.cve_found_in = ""
150139
observation.current_severity = get_current_severity(observation)
151140
return True
@@ -157,8 +146,6 @@ def _add_cve_found_in(observation: Observation, enriched_cvss: Enriched_CVSS) ->
157146
cve_found_in = []
158147
if enriched_cvss.cisa_kev:
159148
cve_found_in.append("CISA KEV")
160-
if enriched_cvss.vulncheck_kev:
161-
cve_found_in.append("VulnCheck KEV")
162149
if enriched_cvss.exploitdb:
163150
cve_found_in.append("ExploitDB")
164151
if enriched_cvss.metasploit:
@@ -167,4 +154,6 @@ def _add_cve_found_in(observation: Observation, enriched_cvss: Enriched_CVSS) ->
167154
cve_found_in.append("Nuclei")
168155
if enriched_cvss.poc_github:
169156
cve_found_in.append("PoC GitHub")
157+
if enriched_cvss.vulncheck_kev:
158+
cve_found_in.append("VulnCheck KEV")
170159
observation.cve_found_in = ", ".join(cve_found_in)

backend/unittests/access_control/api/test_authorization_observation_logs.py

+3-3
Large diffs are not rendered by default.

backend/unittests/access_control/api/test_authorization_observations.py

+3-3
Large diffs are not rendered by default.

0 commit comments

Comments
 (0)