Skip to content

Commit b3566e4

Browse files
authored
Merge branch 'main' into add-almalinux-advisories
2 parents c6aaf85 + 79f9cd3 commit b3566e4

26 files changed

+596
-151
lines changed

.github/workflows/docs.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ on: [push, pull_request]
44

55
jobs:
66
build:
7-
runs-on: ubuntu-20.04
7+
runs-on: ubuntu-22.04
88

99
strategy:
1010
max-parallel: 4

.github/workflows/main.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ env:
99

1010
jobs:
1111
build:
12-
runs-on: ubuntu-20.04
12+
runs-on: ubuntu-22.04
1313

1414
services:
1515
postgres:

.github/workflows/pypi-release.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ on:
2121
jobs:
2222
build-pypi-distribs:
2323
name: Build and publish library to PyPI
24-
runs-on: ubuntu-20.04
24+
runs-on: ubuntu-22.04
2525

2626
steps:
2727
- uses: actions/checkout@master

docs/source/conf.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@
3636
"https://www.softwaretestinghelp.com/how-to-write-good-bug-report/", # Cloudflare protection
3737
"https://www.openssl.org/news/vulnerabilities.xml", # OpenSSL legacy advisory URL, not longer available
3838
"https://example.org/api/non-existent-packages",
39+
"https://github.com/aboutcode-org/vulnerablecode/pull/495/commits",
40+
"https://nvd.nist.gov/products/cpe",
3941
]
4042

4143
# Add any Sphinx extension module names here, as strings. They can be

requirements.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ dateparser==1.1.1
2727
decorator==5.1.1
2828
defusedxml==0.7.1
2929
distro==1.7.0
30-
Django==4.2.17
30+
Django==4.2.20
3131
django-crispy-forms==2.3
3232
django-environ==0.11.2
3333
django-filter==24.3

vulnerabilities/import_runner.py

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -104,24 +104,30 @@ def process_advisories(
104104
advisories = []
105105
for data in advisory_datas:
106106
content_id = compute_content_id(advisory_data=data)
107+
advisory = {
108+
"summary": data.summary,
109+
"affected_packages": [pkg.to_dict() for pkg in data.affected_packages],
110+
"references": [ref.to_dict() for ref in data.references],
111+
"date_published": data.date_published,
112+
"weaknesses": data.weaknesses,
113+
"created_by": importer_name,
114+
"date_collected": datetime.datetime.now(tz=datetime.timezone.utc),
115+
}
107116
try:
108117
aliases = get_or_create_aliases(aliases=data.aliases)
109118
obj, created = Advisory.objects.get_or_create(
110119
unique_content_id=content_id,
111120
url=data.url,
112-
defaults={
113-
"summary": data.summary,
114-
"affected_packages": [pkg.to_dict() for pkg in data.affected_packages],
115-
"references": [ref.to_dict() for ref in data.references],
116-
"date_published": data.date_published,
117-
"weaknesses": data.weaknesses,
118-
"created_by": importer_name,
119-
"date_collected": datetime.datetime.now(tz=datetime.timezone.utc),
120-
},
121+
defaults=advisory,
121122
)
122123
obj.aliases.add(*aliases)
123124
if not obj.date_imported:
124125
advisories.append(obj)
126+
except Advisory.MultipleObjectsReturned:
127+
logger.error(
128+
f"Multiple Advisories returned: unique_content_id: {content_id}, url: {data.url}, advisory: {advisory!r}"
129+
)
130+
raise
125131
except Exception as e:
126132
logger.error(
127133
f"Error while processing {data!r} with aliases {data.aliases!r}: {e!r} \n {traceback_format_exc()}"

vulnerabilities/importers/__init__.py

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -45,10 +45,25 @@
4545
from vulnerabilities.pipelines import pysec_importer
4646

4747
IMPORTERS_REGISTRY = [
48+
nvd_importer.NVDImporterPipeline,
49+
github_importer.GitHubAPIImporterPipeline,
50+
gitlab_importer.GitLabImporterPipeline,
51+
github_osv.GithubOSVImporter,
52+
pypa_importer.PyPaImporterPipeline,
53+
npm_importer.NpmImporterPipeline,
54+
nginx_importer.NginxImporterPipeline,
55+
pysec_importer.PyPIImporterPipeline,
56+
apache_tomcat.ApacheTomcatImporter,
57+
postgresql.PostgreSQLImporter,
58+
debian.DebianImporter,
59+
curl.CurlImporter,
60+
epss.EPSSImporter,
61+
vulnrichment.VulnrichImporter,
62+
alpine_linux_importer.AlpineLinuxImporterPipeline,
63+
ruby.RubyImporter,
64+
apache_kafka.ApacheKafkaImporter,
4865
openssl.OpensslImporter,
4966
redhat.RedhatImporter,
50-
debian.DebianImporter,
51-
postgresql.PostgreSQLImporter,
5267
archlinux.ArchlinuxImporter,
5368
ubuntu.UbuntuImporter,
5469
debian_oval.DebianOvalImporter,
@@ -60,11 +75,9 @@
6075
project_kb_msr2019.ProjectKBMSRImporter,
6176
suse_scores.SUSESeverityScoreImporter,
6277
elixir_security.ElixirSecurityImporter,
63-
apache_tomcat.ApacheTomcatImporter,
6478
xen.XenImporter,
6579
ubuntu_usn.UbuntuUSNImporter,
6680
fireeye.FireyeImporter,
67-
apache_kafka.ApacheKafkaImporter,
6881
oss_fuzz.OSSFuzzImporter,
6982
ruby.RubyImporter,
7083
github_osv.GithubOSVImporter,

vulnerabilities/importers/osv.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -224,7 +224,14 @@ def get_affected_purl(affected_pkg, raw_id):
224224
f"No PackageURL possible: {purl!r} for affected_pkg {affected_pkg} for OSV id: {raw_id}"
225225
)
226226
return
227-
return PackageURL.from_string(str(purl))
227+
try:
228+
package_url = PackageURL.from_string(str(purl))
229+
return package_url
230+
except:
231+
logger.error(
232+
f"Invalid PackageURL: {purl!r} for affected_pkg {affected_pkg} for OSV id: {raw_id}"
233+
)
234+
return None
228235

229236

230237
def get_affected_version_range(affected_pkg, raw_id, supported_ecosystem):

vulnerabilities/improvers/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
from vulnerabilities.pipelines import enhance_with_kev
1919
from vulnerabilities.pipelines import enhance_with_metasploit
2020
from vulnerabilities.pipelines import flag_ghost_packages
21+
from vulnerabilities.pipelines import populate_vulnerability_summary_pipeline
2122
from vulnerabilities.pipelines import remove_duplicate_advisories
2223

2324
IMPROVERS_REGISTRY = [
@@ -48,6 +49,7 @@
4849
collect_commits.CollectFixCommitsPipeline,
4950
add_cvss31_to_CVEs.CVEAdvisoryMappingPipeline,
5051
remove_duplicate_advisories.RemoveDuplicateAdvisoriesPipeline,
52+
populate_vulnerability_summary_pipeline.PopulateVulnerabilitySummariesPipeline,
5153
]
5254

5355
IMPROVERS_REGISTRY = {

vulnerabilities/management/commands/export.py

Lines changed: 34 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,16 @@
66
# See https://github.com/aboutcode-org/vulnerablecode for support or download.
77
# See https://aboutcode.org for more information about nexB OSS projects.
88
#
9+
import itertools
910
import logging
1011
from itertools import groupby
1112
from pathlib import Path
13+
from timeit import default_timer as timer
14+
from traceback import format_exc as traceback_format_exc
1215

1316
import saneyaml
17+
from aboutcode.pipeline import LoopProgress
18+
from aboutcode.pipeline import humanize_time
1419
from django.core.management.base import BaseCommand
1520
from django.core.management.base import CommandError
1621
from packageurl import PackageURL
@@ -26,7 +31,7 @@ def serialize_severity(sev):
2631
"score": sev.value,
2732
"scoring_system": sev.scoring_system,
2833
"scoring_elements": sev.scoring_elements,
29-
"published_at": sev.published_at,
34+
"published_at": str(sev.published_at),
3035
"url": sev.url,
3136
}
3237

@@ -88,8 +93,22 @@ def export_data(self, base_path: Path):
8893
"""
8994
i = 0
9095
seen_vcid = set()
96+
export_start_time = timer()
9197

92-
for i, (purl_without_version, package_versions) in enumerate(packages_by_type_ns_name(), 1):
98+
distinct_packages_count = (
99+
Package.objects.values("type", "namespace", "name")
100+
.distinct("type", "namespace", "name")
101+
.count()
102+
)
103+
104+
progress = LoopProgress(
105+
total_iterations=distinct_packages_count,
106+
progress_step=1,
107+
logger=self.stdout.write,
108+
)
109+
for i, (purl_without_version, package_versions) in enumerate(
110+
progress.iter(packages_by_type_ns_name()), 1
111+
):
93112
pkg_version = None
94113
try:
95114
package_urls = []
@@ -108,7 +127,11 @@ def export_data(self, base_path: Path):
108127
}
109128
package_vulnerabilities.append(package_data)
110129

111-
for vuln in pkg_version.vulnerabilities:
130+
vulnerabilities = itertools.chain(
131+
pkg_version.affected_by_vulnerabilities.all(),
132+
pkg_version.fixing_vulnerabilities.all(),
133+
)
134+
for vuln in vulnerabilities:
112135
vcid = vuln.vulnerability_id
113136
# do not write twice the same file
114137
if vcid in seen_vcid:
@@ -131,9 +154,15 @@ def export_data(self, base_path: Path):
131154
self.stdout.write(f"Processed {i} package. Last PURL: {purl_without_version}")
132155

133156
except Exception as e:
134-
raise Exception(f"Failed to process Package: {pkg_version}") from e
157+
self.stdout.write(
158+
self.style.ERROR(
159+
f"Failed to process Package {pkg_version}: {e!r} \n {traceback_format_exc()}"
160+
)
161+
)
135162

136163
self.stdout.write(f"Exported data for: {i} package and {len(seen_vcid)} vulnerabilities.")
164+
export_run_time = timer() - export_start_time
165+
self.stdout.write(f"Export completed in {humanize_time(export_run_time)}")
137166

138167

139168
def by_purl_type_ns_name(package):
@@ -159,7 +188,7 @@ def packages_by_type_ns_name():
159188
"fixing_vulnerabilities__weaknesses",
160189
"fixing_vulnerabilities__severities",
161190
)
162-
.paginated()
191+
.iterator()
163192
)
164193

165194
for tp_ns_name, packages in groupby(qs, key=by_purl_type_ns_name):

0 commit comments

Comments
 (0)