Skip to content

Commit da6713f

Browse files
committed
Add example importer and improver
This is a dummy importer and improver that runs without network connection only to test vulnerablecode framework Signed-off-by: Hritik Vijay <hritikxx8@gmail.com>
1 parent 8c69661 commit da6713f

3 files changed

Lines changed: 106 additions & 1 deletion

File tree

vulnerabilities/importers/__init__.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,15 @@
2020
# VulnerableCode is a free software code scanning tool from nexB Inc. and others.
2121
# Visit https://github.com/nexB/vulnerablecode/ for support and download.
2222
from vulnerabilities.importers import alpine_linux
23+
from vulnerabilities.importers import example
2324
from vulnerabilities.importers import nginx
25+
from vulnerabilities.importers import npm
2426

25-
IMPORTERS_REGISTRY = [nginx.NginxImporter, alpine_linux.AlpineImporter]
27+
IMPORTERS_REGISTRY = [
28+
example.ExampleImporter,
29+
nginx.NginxImporter,
30+
alpine_linux.AlpineImporter,
31+
npm.NpmImporter,
32+
]
2633

2734
IMPORTERS_REGISTRY = {x.qualified_name: x for x in IMPORTERS_REGISTRY}
Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
from datetime import datetime
2+
from datetime import timezone
3+
from typing import Iterable
4+
5+
import requests
6+
from django.db.models.query import QuerySet
7+
from packageurl import PackageURL
8+
from univers.version_range import NginxVersionRange
9+
from univers.versions import SemverVersion
10+
11+
from vulnerabilities.importer import AdvisoryData
12+
from vulnerabilities.importer import AffectedPackage
13+
from vulnerabilities.importer import Importer
14+
from vulnerabilities.importer import Reference
15+
from vulnerabilities.importer import VulnerabilitySeverity
16+
from vulnerabilities.improver import MAX_CONFIDENCE
17+
from vulnerabilities.improver import Improver
18+
from vulnerabilities.improver import Inference
19+
from vulnerabilities.models import Advisory
20+
from vulnerabilities.severity_systems import SCORING_SYSTEMS
21+
22+
23+
class ExampleImporter(Importer):
24+
25+
spdx_license_expression = "BSD-2-Clause"
26+
27+
def advisory_data(self) -> Iterable[AdvisoryData]:
28+
raw_data = fetch_advisory_data()
29+
for data in raw_data:
30+
yield parse_advisory_data(data)
31+
32+
33+
def fetch_advisory_data():
34+
return [
35+
{
36+
"id": "CVE-2021-230171337",
37+
"summary": "1-byte memory overwrite in resolver",
38+
"advisory_severity": "medium",
39+
"vulnerable": "0.6.18-1.20.0",
40+
"fixed": "1.20.1",
41+
"reference": "http://mailman.nginx.org/pipermail/nginx-announce/2021/000300.html",
42+
"published_on": "14-02-2021 UTC",
43+
},
44+
{
45+
"id": "CVE-2021-12341337",
46+
"summary": "Dummy advisory",
47+
"advisory_severity": "high",
48+
"vulnerable": "0.6.18-1.20.0",
49+
"fixed": "1.20.1",
50+
"reference": "http://example.com/cve-2021-1234",
51+
"published_on": "06-10-2021 UTC",
52+
},
53+
]
54+
55+
56+
def parse_advisory_data(raw_data) -> AdvisoryData:
57+
purl = PackageURL(type="example", name="dummy_package")
58+
affected_version_range = NginxVersionRange.from_native(raw_data["vulnerable"])
59+
fixed_version = SemverVersion(raw_data["fixed"])
60+
affected_package = AffectedPackage(
61+
package=purl, affected_version_range=affected_version_range, fixed_version=fixed_version
62+
)
63+
severity = VulnerabilitySeverity(
64+
system=SCORING_SYSTEMS["generic_textual"], value=raw_data["advisory_severity"]
65+
)
66+
references = [Reference(url=raw_data["reference"], severities=[severity])]
67+
date_published = datetime.strptime(raw_data["published_on"], "%d-%m-%Y %Z").replace(
68+
tzinfo=timezone.utc
69+
)
70+
71+
return AdvisoryData(
72+
aliases=[raw_data["id"]],
73+
summary=raw_data["summary"],
74+
affected_packages=[affected_package],
75+
references=references,
76+
date_published=date_published,
77+
)
78+
79+
80+
class ExampleAliasImprover(Improver):
81+
@property
82+
def interesting_advisories(self) -> QuerySet:
83+
return Advisory.objects.filter(created_by=ExampleImporter.qualified_name)
84+
85+
def get_inferences(self, advisory_data) -> Iterable[Inference]:
86+
for alias in advisory_data.aliases:
87+
new_aliases = fetch_additional_aliases(alias)
88+
aliases = new_aliases + [alias]
89+
yield Inference(aliases=aliases, confidence=MAX_CONFIDENCE)
90+
91+
92+
def fetch_additional_aliases(alias):
93+
alias_map = {
94+
"CVE-2021-230171337": ["PYSEC-1337", "CERTIN-1337"],
95+
"CVE-2021-12341337": ["ANONSEC-1337", "CERTDES-1337"],
96+
}
97+
return alias_map.get(alias)

vulnerabilities/improvers/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
from vulnerabilities.improvers import default
33

44
IMPROVERS_REGISTRY = [
5+
importers.example.ExampleAliasImprover,
56
default.DefaultImprover,
67
importers.nginx.NginxBasicImprover,
78
importers.alpine_linux.AlpineBasicImprover,

0 commit comments

Comments
 (0)