Skip to content

Commit 09f6fc4

Browse files
authored
Merge pull request #2164 from ziadhany/update-compute_content_id_v2
Avoid producing identical hashes for different advisory IDs.
2 parents 7975a38 + 68abbbf commit 09f6fc4

File tree

3 files changed

+53
-3
lines changed

3 files changed

+53
-3
lines changed

vulnerabilities/pipes/advisory.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -304,7 +304,7 @@ def insert_advisory_v2(
304304
patches = get_or_create_advisory_patches(patches=advisory.patches)
305305
weaknesses = get_or_create_advisory_weaknesses(weaknesses=advisory.weaknesses)
306306
content_id = compute_content_id_v2(advisory_data=advisory)
307-
307+
created = False
308308
try:
309309
default_data = {
310310
"datasource_id": pipeline_id,
@@ -314,11 +314,13 @@ def insert_advisory_v2(
314314
"date_published": advisory.date_published,
315315
"date_collected": datetime.now(timezone.utc),
316316
"original_advisory_text": advisory.original_advisory_text,
317+
"url": advisory.url,
317318
}
318319

319320
advisory_obj, created = AdvisoryV2.objects.get_or_create(
321+
advisory_id=advisory.advisory_id,
322+
datasource_id=pipeline_id,
320323
unique_content_id=content_id,
321-
url=advisory.url,
322324
defaults=default_data,
323325
)
324326
related_fields = {
@@ -334,7 +336,7 @@ def insert_advisory_v2(
334336
getattr(advisory_obj, field_name).add(*values)
335337

336338
except Advisory.MultipleObjectsReturned:
337-
logger.error(
339+
logger(
338340
f"Multiple Advisories returned: unique_content_id: {content_id}, url: {advisory.url}, advisory: {advisory!r}"
339341
)
340342
raise

vulnerabilities/tests/test_models.py

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,12 +30,15 @@
3030
from vulnerabilities.importer import PatchData
3131
from vulnerabilities.importer import Reference
3232
from vulnerabilities.importer import ReferenceV2
33+
from vulnerabilities.importer import VulnerabilitySeverity
3334
from vulnerabilities.models import AdvisorySeverity
3435
from vulnerabilities.models import Alias
3536
from vulnerabilities.models import Package
3637
from vulnerabilities.models import Patch
3738
from vulnerabilities.models import Vulnerability
39+
from vulnerabilities.severity_systems import CVSSV3
3840
from vulnerabilities.severity_systems import CVSSV4
41+
from vulnerabilities.severity_systems import ScoringSystem
3942
from vulnerabilities.utils import compute_content_id
4043

4144

@@ -771,3 +774,47 @@ def test_advisoryv2_to_advisory_data_patch_seralization(self):
771774
result = models.AdvisoryV2.objects.first().to_advisory_data()
772775

773776
self.assertEqual(result, self.advisoryv2_data1)
777+
778+
779+
class TestAdvisoryV2ModelDuplication(DjangoTestCase):
780+
def setUp(self):
781+
self.advisoryv2_data1 = AdvisoryDataV2(
782+
advisory_id="CVE-2023-0401",
783+
aliases=[],
784+
summary="",
785+
affected_packages=[],
786+
severities=[
787+
VulnerabilitySeverity(
788+
system=CVSSV3,
789+
value="7.5",
790+
scoring_elements="CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H",
791+
)
792+
],
793+
patches=[],
794+
url="https://test.com",
795+
)
796+
797+
self.advisoryv2_data2 = AdvisoryDataV2(
798+
advisory_id="CVE-2023-0662",
799+
aliases=[],
800+
summary="",
801+
affected_packages=[],
802+
severities=[
803+
VulnerabilitySeverity(
804+
system=CVSSV3,
805+
value="7.5",
806+
scoring_elements="CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H",
807+
)
808+
],
809+
patches=[],
810+
url="https://test.com",
811+
)
812+
813+
def test_advisoryv2_duplication_data(self):
814+
from vulnerabilities.pipes.advisory import insert_advisory_v2
815+
816+
insert_advisory_v2(advisory=self.advisoryv2_data1, pipeline_id="test_pipeline")
817+
insert_advisory_v2(advisory=self.advisoryv2_data2, pipeline_id="test_pipeline")
818+
result = models.AdvisoryV2.objects.count()
819+
820+
self.assertEqual(result, 2)

vulnerabilities/utils.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -689,6 +689,7 @@ def compute_content_id_v2(advisory_data):
689689

690690
elif isinstance(advisory_data, AdvisoryDataV2):
691691
normalized_data = {
692+
"advisory_id": normalize_text(advisory_data.advisory_id),
692693
"aliases": normalize_list(advisory_data.aliases),
693694
"summary": normalize_text(advisory_data.summary),
694695
"affected_packages": [

0 commit comments

Comments
 (0)