Skip to content

Commit 4335d98

Browse files
committed
Migrate xen importer
Signed-off-by: Tushar Goel <tushar.goel.dav@gmail.com>
1 parent 6b0a4c2 commit 4335d98

6 files changed

Lines changed: 119 additions & 52 deletions

File tree

vulnerabilities/importers/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
from vulnerabilities.importers import pysec
2323
from vulnerabilities.importers import redhat
2424
from vulnerabilities.importers import ubuntu
25+
from vulnerabilities.importers import xen
2526

2627
IMPORTERS_REGISTRY = [
2728
nginx.NginxImporter,
@@ -39,6 +40,7 @@
3940
ubuntu.UbuntuImporter,
4041
debian_oval.DebianOvalImporter,
4142
npm.NpmImporter,
43+
xen.XenImporter,
4244
]
4345

4446
IMPORTERS_REGISTRY = {x.qualified_name: x for x in IMPORTERS_REGISTRY}

vulnerabilities/importers/xen.py

Lines changed: 28 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -13,60 +13,36 @@
1313

1414
from vulnerabilities.importer import AdvisoryData
1515
from vulnerabilities.importer import Importer
16-
from vulnerabilities.importer import Reference
17-
from vulnerabilities.utils import create_etag
16+
from vulnerabilities.references import XsaReference
17+
from vulnerabilities.utils import fetch_response
1818
from vulnerabilities.utils import is_cve
1919

2020

2121
class XenImporter(Importer):
22-
# CONFIG_CLASS = XenDBConfiguration
2322

24-
def updated_advisories(self):
25-
advisories = []
26-
if create_etag(data_src=self, url=self.config.db_url, etag_key="etag"):
27-
advisories.extend(self.to_advisories(fetch(self.config.db_url)))
28-
29-
return self.batch_advisories(advisories)
30-
31-
def create_etag(self, url):
32-
etag = requests.head(url).headers.get("etag")
33-
if not etag:
34-
return True
35-
36-
elif url in self.config.etags:
37-
if self.config.etags[url] == etag:
38-
return False
39-
40-
self.config.etags[url] = etag
41-
return True
42-
43-
@staticmethod
44-
def to_advisories(xen_db):
45-
advisories = []
46-
for xsa in xen_db[0]["xsas"]:
47-
reference = get_xen_references(xsa["xsa"])
48-
title = xsa.get("title", [""])
49-
for cve in xsa.get("cve", [""]):
50-
if not is_cve(cve):
51-
cve = ""
52-
53-
advisories.append(
54-
AdvisoryData(
55-
vulnerability_id=cve,
56-
summary=title,
57-
references=[reference],
58-
)
59-
)
60-
return advisories
61-
62-
63-
def get_xen_references(xsa_id):
64-
return Reference(
65-
reference_id="XSA-" + xsa_id,
66-
url="https://xenbits.xen.org/xsa/advisory-{}.html".format(xsa_id),
67-
)
68-
69-
70-
def fetch(url):
71-
response = requests.get(url).content
72-
return json.loads(response)
23+
url = "https://xenbits.xen.org/xsa/xsa.json"
24+
spdx_license_expression = ""
25+
license_url = ""
26+
27+
def advisory_data(self):
28+
data = fetch_response(self.url).json()
29+
if not len(data):
30+
return []
31+
xsas = data[0].get("xsas") or []
32+
for xsa in xsas:
33+
yield from self.to_advisories(xsa)
34+
35+
def to_advisories(self, xsa):
36+
xsa_id = xsa.get("xsa")
37+
references = []
38+
if xsa_id:
39+
references.append(XsaReference.from_num_id(num_id=xsa_id))
40+
title = xsa.get("title")
41+
for cve in xsa.get("cve") or []:
42+
if not is_cve(cve):
43+
continue
44+
yield AdvisoryData(
45+
aliases=[cve],
46+
summary=title,
47+
references=references,
48+
)

vulnerabilities/references.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,16 @@ def from_id(cls, xsa_id):
2828
url=f"https://xenbits.xen.org/xsa/advisory-{numid}.html",
2929
)
3030

31+
@classmethod
32+
def from_num_id(cls, num_id):
33+
"""
34+
Return a new XsaReference from an XSA-XXXX id.
35+
"""
36+
return cls(
37+
reference_id=f"XSA-{num_id}",
38+
url=f"https://xenbits.xen.org/xsa/advisory-{num_id}.html",
39+
)
40+
3141

3242
class ZbxReference(Reference):
3343
"""
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
[
2+
{
3+
"aliases": [
4+
"CVE-2012-5510"
5+
],
6+
"summary": "Grant table version switch list corruption vulnerability",
7+
"affected_packages": [],
8+
"references": [
9+
{
10+
"reference_id": "XSA-26",
11+
"url": "https://xenbits.xen.org/xsa/advisory-26.html",
12+
"severities": []
13+
}
14+
],
15+
"date_published": null
16+
}
17+
]
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
{
2+
"cve": [
3+
"CVE-2012-5510"
4+
],
5+
"files": [
6+
{
7+
"name": "xsa26-4.1.patch",
8+
"project": "xen",
9+
"upstream": "Xen",
10+
"versions": [
11+
[
12+
"4.1.x"
13+
]
14+
]
15+
},
16+
{
17+
"name": "xsa26-4.2.patch",
18+
"project": "xen",
19+
"upstream": "Xen",
20+
"versions": [
21+
[
22+
"4.2.x"
23+
]
24+
]
25+
},
26+
{
27+
"name": "xsa26-unstable.patch",
28+
"project": "xen",
29+
"upstream": "Xen",
30+
"versions": [
31+
[
32+
"xen-unstable"
33+
]
34+
]
35+
}
36+
],
37+
"public_time": "2012-12-03 17:51",
38+
"title": "Grant table version switch list corruption vulnerability",
39+
"version": 3,
40+
"version_time": "2012-12-03 17:51",
41+
"xsa": "26"
42+
}

vulnerabilities/tests/test_xen.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import json
2+
import os
3+
4+
from vulnerabilities.importers.xen import XenImporter
5+
from vulnerabilities.tests import util_tests
6+
7+
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
8+
TEST_DATA = os.path.join(
9+
BASE_DIR,
10+
"test_data",
11+
)
12+
13+
14+
def test_xen_to_advisories():
15+
with open(os.path.join(TEST_DATA, "xen_data.json")) as f:
16+
raw_data = json.load(f)
17+
advisories = XenImporter().to_advisories(raw_data)
18+
result = [data.to_dict() for data in advisories]
19+
expected_file = os.path.join(TEST_DATA, f"parse-advisory-xen-expected.json")
20+
util_tests.check_results_against_json(result, expected_file)

0 commit comments

Comments
 (0)