Skip to content

Commit ca17e0e

Browse files
committed
Refactor all importers to work with VulnerabilityReferenceArgs dataclass
Signed-off-by: Shivam Sandbhor <shivam.sandbhor@gmail.com>
1 parent 4db93aa commit ca17e0e

12 files changed

Lines changed: 121 additions & 31 deletions

File tree

vulnerabilities/importers/alpine_linux.py

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434

3535
from vulnerabilities.data_source import Advisory
3636
from vulnerabilities.data_source import GitDataSource
37+
from vulnerabilities.data_source import VulnerabilityReferenceUnit
3738

3839

3940
def validate_schema(advisory_dict):
@@ -136,12 +137,34 @@ def _load_advisories(
136137

137138
for vuln_ids in fixed_vulns:
138139
vuln_ids = vuln_ids.split()
140+
references = []
141+
for reference_id in vuln_ids[1:]:
142+
143+
if reference_id.startswith('XSA'):
144+
xsa_id = reference_id.split('-')[-1]
145+
references.append(VulnerabilityReferenceUnit(
146+
reference_id=reference_id,
147+
url='https://xenbits.xen.org/xsa/advisory-{}.html'.format(xsa_id)
148+
))
149+
150+
elif reference_id.startswith('ZBX'):
151+
references.append(VulnerabilityReferenceUnit(
152+
reference_id=reference_id,
153+
url='https://support.zabbix.com/browse/{}'.format(reference_id)
154+
))
155+
156+
elif reference_id.startswith('wnpa-sec'):
157+
references.append(VulnerabilityReferenceUnit(
158+
reference_id=reference_id,
159+
url='https://www.wireshark.org/security/{}.html'.format(reference_id)
160+
))
161+
139162

140163
advisories.append(Advisory(
141164
summary='',
142165
impacted_package_urls=[],
143166
resolved_package_urls=resolved_purls,
144-
reference_ids=vuln_ids[1:],
167+
vuln_references=references,
145168
cve_id=vuln_ids[0] if vuln_ids[0] != 'CVE-????-?????' else None,
146169
))
147170

vulnerabilities/importers/archlinux.py

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
from packageurl import PackageURL
3232
from schema import Regex, Schema, Or
3333

34-
from vulnerabilities.data_source import DataSource, DataSourceConfiguration, Advisory
34+
from vulnerabilities.data_source import DataSource, DataSourceConfiguration, Advisory,VulnerabilityReferenceUnit
3535

3636

3737
def validate_schema(advisory_dict):
@@ -101,14 +101,25 @@ def _parse(self, record) -> List[Advisory]:
101101
version=record['fixed'],
102102
))
103103

104-
reference_urls = [f'https://security.archlinux.org/{a}' for a in record['advisories']]
105-
104+
vuln_references = []
105+
vuln_references.append(VulnerabilityReferenceUnit(
106+
reference_id=record['name'],
107+
url='https://security.archlinux.org/{}'.format(record['name']))
108+
)
109+
110+
for ref in record['advisories']:
111+
vuln_references.append(VulnerabilityReferenceUnit(
112+
reference_id=ref,
113+
url='https://security.archlinux.org/{}'.format(record['name'])))
114+
print(vuln_references)
115+
116+
106117
advisories.append(Advisory(
107118
cve_id=cve_id,
108119
summary='',
109120
impacted_package_urls=impacted_purls,
110121
resolved_package_urls=resolved_purls,
111-
reference_urls=reference_urls,
122+
vuln_references=vuln_references
112123
))
113124

114125
return advisories

vulnerabilities/importers/debian.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
from vulnerabilities.data_source import Advisory
3838
from vulnerabilities.data_source import DataSource
3939
from vulnerabilities.data_source import DataSourceConfiguration
40+
from vulnerabilities.data_source import VulnerabilityReferenceUnit
4041

4142

4243
def validate_schema(advisory_dict):
@@ -131,18 +132,21 @@ def _parse(self, pkg_name: str, records: Mapping[str, Any]) -> List[Advisory]:
131132
qualifiers={'distro': release_name},
132133
))
133134

134-
reference_urls = []
135+
references = []
135136
debianbug = record.get('debianbug')
136137
if debianbug:
137138
bug_url = f'https://bugs.debian.org/cgi-bin/bugreport.cgi?bug={debianbug}'
138-
reference_urls.append(bug_url)
139+
references.append(VulnerabilityReferenceUnit(
140+
url=bug_url,
141+
reference_id=debianbug
142+
))
139143

140144
advisories.append(Advisory(
141145
cve_id=cve_id,
142146
summary=record.get('description', ''),
143147
impacted_package_urls=impacted_purls,
144148
resolved_package_urls=resolved_purls,
145-
reference_urls=reference_urls,
149+
vuln_references=references,
146150
))
147151

148152
return advisories

vulnerabilities/importers/gentoo.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828

2929
from vulnerabilities.data_source import GitDataSource
3030
from vulnerabilities.data_source import Advisory
31+
from vulnerabilities.data_source import VulnerabilityReferenceUnit
3132

3233

3334
class GentooDataSource(GitDataSource):
@@ -51,6 +52,8 @@ def process_file(self, file):
5152
xml_data = {}
5253
xml_root = ET.parse(file).getroot()
5354
glsa = "GLSA-" + xml_root.attrib["id"]
55+
vuln_reference = [VulnerabilityReferenceUnit(reference_id=glsa ,url="https://security.gentoo.org/glsa/{}".format(xml_root.attrib["id"]))]
56+
5457
for child in xml_root:
5558
if child.tag == "references":
5659
xml_data["cves"] = self.cves_from_reference(child)
@@ -73,7 +76,7 @@ def process_file(self, file):
7376
summary=xml_data["description"],
7477
impacted_package_urls=xml_data["affected_purls"],
7578
resolved_package_urls=xml_data["unaffected_purls"],
76-
reference_ids=[glsa],
79+
vuln_references=vuln_reference
7780
)
7881
advisory_list.append(advisory)
7982
return advisory_list

vulnerabilities/importers/npm.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737

3838
from vulnerabilities.data_source import Advisory
3939
from vulnerabilities.data_source import DataSource
40+
from vulnerabilities.data_source import VulnerabilityReferenceUnit
4041

4142
NPM_URL = 'https://registry.npmjs.org{}'
4243
PAGE = '/-/npm/v1/security/advisories?perPage=100&page=0'
@@ -109,16 +110,19 @@ def _parse(self, records: List[Mapping[str, Any]]) -> List[Advisory]:
109110

110111
impacted_purls = _versions_to_purls(package_name, impacted_versions)
111112
resolved_purls = _versions_to_purls(package_name, resolved_versions)
113+
vuln_reference = [VulnerabilityReferenceUnit(
114+
url=NPM_URL.format(f'/-/npm/v1/advisories/{record["id"]}'),
115+
reference_id=record['id']
116+
)]
112117

113118
for cve_id in record.get('cves') or ['']:
114119
advisories.append(Advisory(
115120
summary=record.get('overview', ''),
116121
cve_id=cve_id,
117122
impacted_package_urls=impacted_purls,
118123
resolved_package_urls=resolved_purls,
119-
reference_urls=[NPM_URL.format(f'/-/npm/v1/advisories/{record["id"]}')],
124+
vuln_references=vuln_reference,
120125
))
121-
122126
return advisories
123127

124128
def added_advisories(self) -> Set[Advisory]:

vulnerabilities/importers/openssl.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828

2929
from vulnerabilities.data_source import Advisory
3030
from vulnerabilities.data_source import DataSource
31+
from vulnerabilities.data_source import VulnerabilityReferenceUnit
3132

3233
import xml.etree.ElementTree as ET
3334

@@ -69,8 +70,8 @@ def to_advisories(xml_response: str) -> Set[Advisory]:
6970

7071
if info:
7172
commit_hash = info[0].attrib['hash']
72-
ref_urls.append("https://github.com/openssl/openssl/commit/"
73-
+ commit_hash)
73+
ref_urls.append(VulnerabilityReferenceUnit(url="https://github.com/openssl/openssl/commit/"
74+
+ commit_hash))
7475
if info.tag == 'description':
7576
# Description
7677
summary = re.sub(r'\s+', ' ', info.text).strip()
@@ -88,7 +89,7 @@ def to_advisories(xml_response: str) -> Set[Advisory]:
8889
summary=summary,
8990
impacted_package_urls=vuln_purls,
9091
resolved_package_urls=safe_purls,
91-
reference_urls=ref_urls)
92+
vuln_references=ref_urls)
9293
advisories.append(advisory)
9394

9495
return advisories

vulnerabilities/importers/redhat.py

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
from vulnerabilities.data_source import Advisory
2828
from vulnerabilities.data_source import DataSource
2929
from vulnerabilities.data_source import DataSourceConfiguration
30-
30+
from vulnerabilities.data_source import VulnerabilityReferenceUnit
3131

3232
class RedhatDataSource(DataSource):
3333
CONFIG_CLASS = DataSourceConfiguration
@@ -71,12 +71,29 @@ def to_advisory(advisory_data):
7171
if rpm_to_purl(rpm):
7272
affected_purls.append(rpm_to_purl(rpm))
7373

74+
references = []
75+
if advisory_data.get('bugzilla'):
76+
bugzilla = advisory_data.get('bugzilla')
77+
references.append(VulnerabilityReferenceUnit(
78+
url='https://bugzilla.redhat.com/show_bug.cgi?id={}'.format(bugzilla),
79+
reference_id=bugzilla
80+
))
81+
82+
for rhsa in advisory_data['advisories']:
83+
references.append(VulnerabilityReferenceUnit(
84+
url='https://access.redhat.com/errata/{}'.format(rhsa),
85+
reference_id=rhsa,
86+
))
87+
88+
references.append(VulnerabilityReferenceUnit(
89+
url=advisory_data['resource_url']
90+
))
91+
7492
return Advisory(
7593
summary=advisory_data['bugzilla_description'],
7694
cve_id=advisory_data['CVE'],
77-
reference_ids=advisory_data['advisories'],
7895
impacted_package_urls=affected_purls,
79-
reference_urls=[advisory_data['resource_url']],
96+
vuln_references=references,
8097
)
8198

8299

vulnerabilities/importers/retiredotnet.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
from vulnerabilities.data_source import GitDataSource
3131
from vulnerabilities.data_source import GitDataSourceConfiguration
3232
from vulnerabilities.data_source import Advisory
33+
from vulnerabilities.data_source import VulnerabilityReferenceUnit
3334

3435

3536
class RetireDotnetDataSource(GitDataSource):
@@ -90,9 +91,13 @@ def process_file(self, path) -> List[Advisory]:
9091
version=pkg['fix'],
9192
type='nuget'))
9293

94+
vuln_reference = [VulnerabilityReferenceUnit(
95+
url=json_doc['link'],
96+
)]
97+
9398
return Advisory(
9499
summary=json_doc['description'],
95100
impacted_package_urls=affected_purls,
96101
resolved_package_urls=fixed_purls,
97-
reference_urls=[json_doc['link']],
98-
cve_id=vuln_id)
102+
cve_id=vuln_id,
103+
vuln_references=vuln_reference)

vulnerabilities/importers/ruby.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232

3333
from vulnerabilities.data_source import Advisory
3434
from vulnerabilities.data_source import GitDataSource
35+
from vulnerabilities.data_source import VulnerabilityReferenceUnit
3536

3637

3738
class RubyDataSource(GitDataSource):
@@ -104,11 +105,17 @@ def process_file(self, path) -> List[Advisory]:
104105
version=version,
105106
) for version in safe_versions}
106107

108+
references = []
109+
if record.get('url'):
110+
references.append(
111+
VulnerabilityReferenceUnit(url=record.get('url'))
112+
)
113+
107114
return Advisory(
108115
summary=record.get('description', ''),
109116
impacted_package_urls=impacted_purls,
110117
resolved_package_urls=resolved_purls,
111-
reference_urls=[record.get('url', '')],
118+
vuln_references=references,
112119
cve_id=cve_id
113120
)
114121

vulnerabilities/importers/rust.py

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434

3535
from vulnerabilities.data_source import Advisory
3636
from vulnerabilities.data_source import GitDataSource
37+
from vulnerabilities.data_source import VulnerabilityReferenceUnit
3738

3839

3940
class RustDataSource(GitDataSource):
@@ -79,8 +80,13 @@ def _load_advisory(self, path: str) -> Optional[Advisory]:
7980
record = toml.load(f)
8081
advisory = record.get('advisory', {})
8182

83+
references = []
8284
crate_name = advisory['package']
83-
reference_url = advisory.get('url', '')
85+
if advisory.get('url'):
86+
references.append(VulnerabilityReferenceUnit(
87+
url=advisory['url']
88+
))
89+
8490
all_versions = self.crates_api.get(crate_name)
8591

8692
affected_ranges = {RangeSpecifier(r) for r
@@ -104,14 +110,20 @@ def _load_advisory(self, path: str) -> Optional[Advisory]:
104110
if alias.startswith('CVE-'):
105111
cve_id = alias
106112
break
113+
114+
115+
references.append(VulnerabilityReferenceUnit(
116+
reference_id=advisory['id'],
117+
url='https://rustsec.org/advisories/{}.html'.format(advisory['id'])
118+
)
119+
)
107120

108121
return Advisory(
109122
summary=advisory.get('description', ''),
110123
impacted_package_urls=impacted_purls,
111124
resolved_package_urls=resolved_purls,
112-
reference_urls=[reference_url] if reference_url else [],
113-
reference_ids=[advisory['id']],
114125
cve_id=cve_id,
126+
vuln_references=references
115127
)
116128

117129

0 commit comments

Comments
 (0)