Skip to content

Commit 8555d00

Browse files
committed
Add advisory ID
Signed-off-by: Tushar Goel <tushar.goel.dav@gmail.com>
1 parent 89238a4 commit 8555d00

File tree

14 files changed

+68
-8
lines changed

14 files changed

+68
-8
lines changed

vulnerabilities/importer.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -376,6 +376,7 @@ class Importer:
376376
vcs_response: VCSResponse = None
377377
# It needs to be unique and immutable
378378
importer_name = ""
379+
requires_reference_for_advisory_id = False
379380

380381
@classmethod
381382
def get_advisory_id(cls, aliases: list[str]) -> str:

vulnerabilities/importers/archlinux.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,12 +29,16 @@ class ArchlinuxImporter(Importer):
2929
spdx_license_expression = "MIT"
3030
license_url = "https://github.com/archlinux/arch-security-tracker/blob/master/LICENSE"
3131
importer_name = "Arch Linux Importer"
32+
requires_reference_for_advisory_id = True
3233

3334
@classmethod
34-
def get_advisory_id(cls, aliases: list[str]) -> str:
35+
def get_advisory_id(cls, aliases: list[str], references) -> str:
3536
"""
3637
Return the Advisory ID for the given aliases.
3738
"""
39+
for ref in references:
40+
if ref.get("reference_id").startswith("AVG-"):
41+
return ref.get("reference_id")
3842
return cls.get_cve_id(aliases)
3943

4044
def fetch(self) -> Iterable[Mapping]:

vulnerabilities/importers/fireeye.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,9 @@ def get_advisory_id(cls, aliases: list[str]) -> str:
4040
"""
4141
Return the Advisory ID for the given aliases.
4242
"""
43+
for alias in aliases:
44+
if alias.startswith("MNDT-"):
45+
return alias
4346
return cls.get_cve_id(aliases)
4447

4548
def advisory_data(self) -> Iterable[AdvisoryData]:

vulnerabilities/importers/gentoo.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,12 +32,17 @@ class GentooImporter(Importer):
3232
# under the [CC-BY-SA-4.0](https://creativecommons.org/licenses/by-sa/4.0/) license.
3333
license_url = "https://creativecommons.org/licenses/by-sa/4.0/"
3434
importer_name = "Gentoo Importer"
35+
requires_reference_for_advisory_id = True
3536

3637
@classmethod
37-
def get_advisory_id(cls, aliases: list[str]) -> str:
38+
def get_advisory_id(cls, aliases: list[str], references) -> str:
3839
"""
3940
Return the Advisory ID for the given aliases.
4041
"""
42+
for ref in references:
43+
ref_id = ref.get("reference_id")
44+
if ref_id and ref_id.startswith("GLSA-"):
45+
return ref_id
4146
return cls.get_cve_id(aliases)
4247

4348
def advisory_data(self) -> Iterable[AdvisoryData]:

vulnerabilities/importers/istio.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,12 +43,17 @@ class IstioImporter(Importer):
4343
license_url = "https://github.com/istio/istio.io/blob/master/LICENSE"
4444
repo_url = "git+https://github.com/istio/istio.io/"
4545
importer_name = "Istio Importer"
46+
requires_reference_for_advisory_id = True
4647

4748
@classmethod
48-
def get_advisory_id(cls, aliases: list[str]) -> str:
49+
def get_advisory_id(cls, aliases: list[str], references) -> str:
4950
"""
5051
Return the Advisory ID for the given aliases.
5152
"""
53+
for ref in references:
54+
ref_id = ref.get("reference_id")
55+
if ref_id and ref_id.startswith("ISTIO-"):
56+
return ref_id
5257
return cls.get_cve_id(aliases)
5358

5459
def advisory_data(self) -> Set[AdvisoryData]:

vulnerabilities/importers/mozilla.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,12 +38,17 @@ class MozillaImporter(Importer):
3838
license_url = "https://github.com/mozilla/foundation-security-advisories/blob/master/LICENSE"
3939
repo_url = "git+https://github.com/mozilla/foundation-security-advisories/"
4040
importer_name = "Mozilla Importer"
41+
requires_reference_for_advisory_id = True
4142

4243
@classmethod
43-
def get_advisory_id(cls, aliases: list[str]) -> str:
44+
def get_advisory_id(cls, aliases: list[str], references) -> str:
4445
"""
4546
Return the Advisory ID for the given aliases.
4647
"""
48+
for ref in references:
49+
ref_id = ref.get("reference_id")
50+
if ref_id and ref_id.lower().startswith("mfsa"):
51+
return ref_id
4752
return cls.get_cve_id(aliases)
4853

4954
def advisory_data(self) -> Iterable[AdvisoryData]:

vulnerabilities/importers/redhat.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,12 +66,17 @@ class RedhatImporter(Importer):
6666
spdx_license_expression = "CC-BY-4.0"
6767
license_url = "https://access.redhat.com/documentation/en-us/red_hat_security_data_api/1.0/html/red_hat_security_data_api/legal-notice"
6868
importer_name = "RedHat Importer"
69+
requires_reference_for_advisory_id = True
6970

7071
@classmethod
71-
def get_advisory_id(cls, aliases: list[str]) -> str:
72+
def get_advisory_id(cls, aliases: list[str], references) -> str:
7273
"""
7374
Return the Advisory ID for the given aliases.
7475
"""
76+
for ref in references:
77+
ref_id = ref.get("reference_id")
78+
if ref_id and ref_id.lower().startswith("RHSA-"):
79+
return ref_id
7580
return cls.get_cve_id(aliases)
7681

7782
def advisory_data(self) -> Iterable[AdvisoryData]:

vulnerabilities/importers/ubuntu_usn.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,12 +63,17 @@ class UbuntuUSNImporter(Importer):
6363
Thanks
6464
"""
6565
importer_name = "Ubuntu USN Importer"
66+
requires_reference_for_advisory_id = True
6667

6768
@classmethod
68-
def get_advisory_id(cls, aliases: list[str]) -> str:
69+
def get_advisory_id(cls, aliases: list[str], references) -> str:
6970
"""
7071
Return the Advisory ID for the given aliases.
7172
"""
73+
for ref in references:
74+
reference_id = ref.get("reference_id")
75+
if reference_id and reference_id.startswith("USN-"):
76+
return reference_id
7277
return cls.get_cve_id(aliases)
7378

7479
def advisory_data(self):

vulnerabilities/importers/xen.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,12 +45,16 @@ class XenImporter(Importer):
4545
-George
4646
"""
4747
importer_name = "Xen Importer"
48+
requires_reference_for_advisory_id = True
4849

4950
@classmethod
50-
def get_advisory_id(cls, aliases: list[str]) -> str:
51+
def get_advisory_id(cls, aliases: list[str], references: list[dict]) -> str:
5152
"""
5253
Return the Advisory ID for the given aliases.
5354
"""
55+
for ref in references:
56+
if ref.get("reference_id").startswith("XSA-"):
57+
return ref.get("reference_id")
5458
return cls.get_cve_id(aliases)
5559

5660
def advisory_data(self):

vulnerabilities/pipelines/__init__.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
from timeit import default_timer as timer
1414
from traceback import format_exc as traceback_format_exc
1515
from typing import Iterable
16+
from typing import Optional
1617

1718
from aboutcode.pipeline import BasePipeline
1819
from aboutcode.pipeline import LoopProgress
@@ -114,6 +115,7 @@ class VulnerableCodeBaseImporterPipeline(VulnerableCodePipeline):
114115
repo_url = None
115116
importer_name = None
116117
advisory_confidence = MAX_CONFIDENCE
118+
requires_reference_for_advisory_id = False
117119

118120
@classmethod
119121
def steps(cls):
@@ -132,6 +134,13 @@ def collect_advisories(self) -> Iterable[AdvisoryData]:
132134
"""
133135
raise NotImplementedError
134136

137+
@classmethod
138+
def get_advisory_id(cls, aliases: list[str], references: Optional[list[dict]] = None) -> str:
139+
"""
140+
Return the Advisory ID for the given aliases.
141+
"""
142+
raise NotImplementedError
143+
135144
@classmethod
136145
def get_advisory_id(cls, aliases: list[str]) -> str:
137146
"""

vulnerabilities/pipelines/add_advisory_id.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,10 +39,17 @@ def add_advisory_id(self):
3939
for advisory in progress.iter(advisories.iterator(chunk_size=batch_size)):
4040
importer_name = advisory.created_by
4141
aliases = Alias.objects.filter(advisories=advisory).values_list("alias", flat=True)
42-
advisory_id = IMPORTERS_REGISTRY[importer_name].get_advisory_id(aliases=aliases)
42+
references = advisory.references
43+
importer = IMPORTERS_REGISTRY[importer_name]
44+
if not importer.requires_reference_for_advisory_id:
45+
advisory_id = importer.get_advisory_id(aliases=aliases)
46+
else:
47+
advisory_id = importer.get_advisory_id(aliases=aliases, references=references)
4348
if advisory_id is None:
4449
continue
4550
advisory.advisory_id = advisory_id
51+
aliases = Alias.objects.filter(advisories=advisory).exclude(alias=advisory_id)
52+
advisory.aliases.set(aliases)
4653
advisories_to_update.append(advisory)
4754
if len(advisories_to_update) >= batch_size:
4855
self.do_bulk_update(advisories_to_update)

vulnerabilities/pipelines/pypa_importer.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,9 @@ def get_advisory_id(cls, aliases: list[str]) -> str:
4242
"""
4343
Return the Advisory ID for the given aliases.
4444
"""
45+
for alias in aliases:
46+
if alias.lower().startswith("pysec-"):
47+
return alias
4548
return cls.get_cve_id(aliases)
4649

4750
def clone(self):

vulnerabilities/pipelines/pysec_importer.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,9 @@ def get_advisory_id(cls, aliases: list[str]) -> str:
4141
"""
4242
Return the Advisory ID for the given aliases.
4343
"""
44+
for alias in aliases:
45+
if alias.startswith("PYSEC-"):
46+
return alias
4447
return cls.get_cve_id(aliases)
4548

4649
def fetch_zip(self):

vulnerabilities/tests/test_add_advisory_pipeline.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,3 +31,4 @@ def test_add_advisory_id(self):
3131
add_advisory_id.AddAdvisoryID().add_advisory_id()
3232
advisory.refresh_from_db()
3333
assert advisory.advisory_id == "CVE-2021-1234"
34+
assert advisory.aliases.count() == 0

0 commit comments

Comments
 (0)