Skip to content

Commit 46bc48e

Browse files
authored
Merge branch 'main' into 1214-fix-ver-range
2 parents 4ee75dd + 289f4b8 commit 46bc48e

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

57 files changed

+2595
-656
lines changed

CHANGELOG.rst

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,17 @@
11
Release notes
22
=============
33

4+
Version (next)
5+
-------------------
6+
7+
8+
Version v34.0.2
9+
-------------------
10+
11+
- Add management command to commit exported vulnerability data (#1600)
12+
- Fix API 500 error (#1603)
13+
14+
415
Version v34.0.1
516
-------------------
617

requirements.txt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ click==8.1.2
2121
coreapi==2.3.3
2222
coreschema==0.0.4
2323
cryptography==43.0.1
24+
crispy-bootstrap4==2024.1
2425
cwe2==3.0.0
2526
dateparser==1.1.1
2627
decorator==5.1.1
@@ -35,8 +36,8 @@ djangorestframework==3.15.2
3536
doc8==0.11.1
3637
docopt==0.6.2
3738
docutils==0.17.1
38-
drf-spectacular==0.27.2
39-
drf-spectacular-sidecar==2024.7.1
39+
drf-spectacular==0.24.2
40+
drf-spectacular-sidecar==2022.10.1
4041
executing==0.8.3
4142
fetchcode==0.3.0
4243
freezegun==1.2.1

setup.cfg

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[metadata]
22
name = vulnerablecode
3-
version = 34.0.1
3+
version = 34.0.2
44
license = Apache-2.0 AND CC-BY-SA-4.0
55

66
# description must be on ONE line https://github.com/pypa/setuptools/issues/1390
@@ -62,11 +62,12 @@ install_requires =
6262
django-filter>=24.0
6363
django-widget-tweaks>=1.5.0
6464
django-crispy-forms>=2.3
65+
crispy-bootstrap4>=2024.1
6566
django-environ>=0.11.0
6667
gunicorn>=23.0.0
6768

6869
# for the API doc
69-
drf-spectacular[sidecar]>=0.27.2
70+
drf-spectacular[sidecar]>=0.24.2
7071

7172
#essentials
7273
packageurl-python>=0.15

vulnerabilities/api.py

Lines changed: 20 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
from rest_framework.throttling import UserRateThrottle
2828

2929
from vulnerabilities.models import Alias
30-
from vulnerabilities.models import Kev
30+
from vulnerabilities.models import Exploit
3131
from vulnerabilities.models import Package
3232
from vulnerabilities.models import Vulnerability
3333
from vulnerabilities.models import VulnerabilityReference
@@ -175,10 +175,23 @@ def to_representation(self, instance):
175175
return representation
176176

177177

178-
class KEVSerializer(serializers.ModelSerializer):
178+
class ExploitSerializer(serializers.ModelSerializer):
179179
class Meta:
180-
model = Kev
181-
fields = ["date_added", "description", "required_action", "due_date", "resources_and_notes"]
180+
model = Exploit
181+
fields = [
182+
"date_added",
183+
"description",
184+
"required_action",
185+
"due_date",
186+
"notes",
187+
"known_ransomware_campaign_use",
188+
"source_date_published",
189+
"exploit_type",
190+
"platform",
191+
"source_date_updated",
192+
"data_source",
193+
"source_url",
194+
]
182195

183196

184197
class VulnerabilitySerializer(BaseResourceSerializer):
@@ -189,7 +202,7 @@ class VulnerabilitySerializer(BaseResourceSerializer):
189202

190203
references = VulnerabilityReferenceSerializer(many=True, source="vulnerabilityreference_set")
191204
aliases = AliasSerializer(many=True, source="alias")
192-
kev = KEVSerializer(read_only=True)
205+
exploits = ExploitSerializer(many=True, read_only=True)
193206
weaknesses = WeaknessSerializer(many=True)
194207
severity_range_score = serializers.SerializerMethodField()
195208

@@ -199,10 +212,6 @@ def to_representation(self, instance):
199212
weaknesses = data.get("weaknesses", [])
200213
data["weaknesses"] = [weakness for weakness in weaknesses if weakness is not None]
201214

202-
kev = data.get("kev", None)
203-
if not kev:
204-
data.pop("kev")
205-
206215
return data
207216

208217
def get_severity_range_score(self, instance):
@@ -240,7 +249,7 @@ class Meta:
240249
"affected_packages",
241250
"references",
242251
"weaknesses",
243-
"kev",
252+
"exploits",
244253
"severity_range_score",
245254
]
246255

@@ -676,14 +685,10 @@ def filter_alias(self, queryset, name, value):
676685
return self.queryset.filter(aliases__alias__icontains=alias)
677686

678687

679-
class AliasViewSet(viewsets.ReadOnlyModelViewSet):
688+
class AliasViewSet(VulnerabilityViewSet):
680689
"""
681690
Lookup for vulnerabilities by vulnerability aliases such as a CVE
682691
(https://nvd.nist.gov/general/cve-process).
683692
"""
684693

685-
queryset = Vulnerability.objects.all()
686-
serializer_class = VulnerabilitySerializer
687-
filter_backends = (filters.DjangoFilterBackend,)
688694
filterset_class = AliasFilterSet
689-
throttle_classes = [StaffUserRateThrottle, AnonRateThrottle]

vulnerabilities/api_extension.py

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
from rest_framework.throttling import AnonRateThrottle
2727

2828
from vulnerabilities.api import BaseResourceSerializer
29-
from vulnerabilities.models import Kev
29+
from vulnerabilities.models import Exploit
3030
from vulnerabilities.models import Package
3131
from vulnerabilities.models import Vulnerability
3232
from vulnerabilities.models import VulnerabilityReference
@@ -105,8 +105,21 @@ class Meta:
105105

106106
class V2ExploitSerializer(ModelSerializer):
107107
class Meta:
108-
model = Kev
109-
fields = ("description", "required_action", "date_added", "due_date", "resources_and_notes")
108+
model = Exploit
109+
fields = [
110+
"date_added",
111+
"description",
112+
"required_action",
113+
"due_date",
114+
"notes",
115+
"known_ransomware_campaign_use",
116+
"source_date_published",
117+
"exploit_type",
118+
"platform",
119+
"source_date_updated",
120+
"data_source",
121+
"source_url",
122+
]
110123

111124

112125
class V2VulnerabilitySerializer(ModelSerializer):

vulnerabilities/importers/__init__.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,9 @@
1919
from vulnerabilities.importers import epss
2020
from vulnerabilities.importers import fireeye
2121
from vulnerabilities.importers import gentoo
22-
from vulnerabilities.importers import github
2322
from vulnerabilities.importers import github_osv
24-
from vulnerabilities.importers import gitlab
2523
from vulnerabilities.importers import istio
2624
from vulnerabilities.importers import mozilla
27-
from vulnerabilities.importers import nginx
28-
from vulnerabilities.importers import nvd
2925
from vulnerabilities.importers import openssl
3026
from vulnerabilities.importers import oss_fuzz
3127
from vulnerabilities.importers import postgresql
@@ -40,14 +36,14 @@
4036
from vulnerabilities.importers import vulnrichment
4137
from vulnerabilities.importers import xen
4238
from vulnerabilities.pipelines import VulnerableCodeBaseImporterPipeline
39+
from vulnerabilities.pipelines import github_importer
40+
from vulnerabilities.pipelines import gitlab_importer
41+
from vulnerabilities.pipelines import nginx_importer
4342
from vulnerabilities.pipelines import npm_importer
43+
from vulnerabilities.pipelines import nvd_importer
4444
from vulnerabilities.pipelines import pypa_importer
4545

4646
IMPORTERS_REGISTRY = [
47-
nvd.NVDImporter,
48-
github.GitHubAPIImporter,
49-
gitlab.GitLabAPIImporter,
50-
nginx.NginxImporter,
5147
pysec.PyPIImporter,
5248
alpine_linux.AlpineImporter,
5349
openssl.OpensslImporter,
@@ -78,6 +74,10 @@
7874
vulnrichment.VulnrichImporter,
7975
pypa_importer.PyPaImporterPipeline,
8076
npm_importer.NpmImporterPipeline,
77+
nginx_importer.NginxImporterPipeline,
78+
gitlab_importer.GitLabImporterPipeline,
79+
github_importer.GitHubAPIImporterPipeline,
80+
nvd_importer.NVDImporterPipeline,
8181
]
8282

8383
IMPORTERS_REGISTRY = {

vulnerabilities/improvers/__init__.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,11 @@
88
#
99

1010
from vulnerabilities.improvers import valid_versions
11-
from vulnerabilities.improvers import vulnerability_kev
1211
from vulnerabilities.improvers import vulnerability_status
1312
from vulnerabilities.pipelines import VulnerableCodePipeline
13+
from vulnerabilities.pipelines import enhance_with_exploitdb
14+
from vulnerabilities.pipelines import enhance_with_kev
15+
from vulnerabilities.pipelines import enhance_with_metasploit
1416
from vulnerabilities.pipelines import flag_ghost_packages
1517

1618
IMPROVERS_REGISTRY = [
@@ -31,8 +33,10 @@
3133
valid_versions.GithubOSVImprover,
3234
vulnerability_status.VulnerabilityStatusImprover,
3335
valid_versions.CurlImprover,
34-
vulnerability_kev.VulnerabilityKevImprover,
3536
flag_ghost_packages.FlagGhostPackagePipeline,
37+
enhance_with_kev.VulnerabilityKevPipeline,
38+
enhance_with_metasploit.MetasploitImproverPipeline,
39+
enhance_with_exploitdb.ExploitDBImproverPipeline,
3640
]
3741

3842
IMPROVERS_REGISTRY = {

vulnerabilities/improvers/valid_versions.py

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
from datetime import datetime
1313
from typing import Iterable
1414
from typing import List
15-
from typing import Mapping
1615
from typing import Optional
1716

1817
from django.db.models import Q
@@ -32,18 +31,19 @@
3231
from vulnerabilities.importers.debian import DebianImporter
3332
from vulnerabilities.importers.debian_oval import DebianOvalImporter
3433
from vulnerabilities.importers.elixir_security import ElixirSecurityImporter
35-
from vulnerabilities.importers.github import GitHubAPIImporter
3634
from vulnerabilities.importers.github_osv import GithubOSVImporter
37-
from vulnerabilities.importers.gitlab import GitLabAPIImporter
3835
from vulnerabilities.importers.istio import IstioImporter
39-
from vulnerabilities.importers.nginx import NginxImporter
4036
from vulnerabilities.importers.oss_fuzz import OSSFuzzImporter
4137
from vulnerabilities.importers.ruby import RubyImporter
4238
from vulnerabilities.importers.ubuntu import UbuntuImporter
4339
from vulnerabilities.improver import MAX_CONFIDENCE
4440
from vulnerabilities.improver import Improver
4541
from vulnerabilities.improver import Inference
4642
from vulnerabilities.models import Advisory
43+
from vulnerabilities.pipelines import VulnerableCodeBaseImporterPipeline
44+
from vulnerabilities.pipelines.github_importer import GitHubAPIImporterPipeline
45+
from vulnerabilities.pipelines.gitlab_importer import GitLabImporterPipeline
46+
from vulnerabilities.pipelines.nginx_importer import NginxImporterPipeline
4747
from vulnerabilities.pipelines.npm_importer import NpmImporterPipeline
4848
from vulnerabilities.utils import AffectedPackage as LegacyAffectedPackage
4949
from vulnerabilities.utils import clean_nginx_git_tag
@@ -63,6 +63,8 @@ class ValidVersionImprover(Improver):
6363

6464
@property
6565
def interesting_advisories(self) -> QuerySet:
66+
if issubclass(self.importer, VulnerableCodeBaseImporterPipeline):
67+
return Advisory.objects.filter(Q(created_by=self.importer.pipeline_id)).paginated()
6668
return Advisory.objects.filter(Q(created_by=self.importer.qualified_name)).paginated()
6769

6870
def get_package_versions(
@@ -220,7 +222,7 @@ class NginxBasicImprover(Improver):
220222

221223
@property
222224
def interesting_advisories(self) -> QuerySet:
223-
return Advisory.objects.filter(created_by=NginxImporter.qualified_name).paginated()
225+
return Advisory.objects.filter(created_by=NginxImporterPipeline.pipeline_id).paginated()
224226

225227
def get_inferences(self, advisory_data: AdvisoryData) -> Iterable[Inference]:
226228
all_versions = list(self.fetch_nginx_version_from_git_tags())
@@ -364,12 +366,12 @@ class DebianBasicImprover(ValidVersionImprover):
364366

365367

366368
class GitLabBasicImprover(ValidVersionImprover):
367-
importer = GitLabAPIImporter
369+
importer = GitLabImporterPipeline
368370
ignorable_versions = []
369371

370372

371373
class GitHubBasicImprover(ValidVersionImprover):
372-
importer = GitHubAPIImporter
374+
importer = GitHubAPIImporterPipeline
373375
ignorable_versions = frozenset(
374376
[
375377
"0.1-bulbasaur",

vulnerabilities/improvers/vulnerability_kev.py

Lines changed: 0 additions & 66 deletions
This file was deleted.

vulnerabilities/improvers/vulnerability_status.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,14 @@
1414
from django.db.models.query import QuerySet
1515

1616
from vulnerabilities.importer import AdvisoryData
17-
from vulnerabilities.importers.nvd import NVDImporter
1817
from vulnerabilities.improver import Improver
1918
from vulnerabilities.improver import Inference
2019
from vulnerabilities.models import Advisory
2120
from vulnerabilities.models import Alias
2221
from vulnerabilities.models import Vulnerability
2322
from vulnerabilities.models import VulnerabilityChangeLog
2423
from vulnerabilities.models import VulnerabilityStatusType
24+
from vulnerabilities.pipelines.nvd_importer import NVDImporterPipeline
2525
from vulnerabilities.utils import fetch_response
2626
from vulnerabilities.utils import get_item
2727

@@ -38,7 +38,7 @@ class VulnerabilityStatusImprover(Improver):
3838
@property
3939
def interesting_advisories(self) -> QuerySet:
4040
return (
41-
Advisory.objects.filter(Q(created_by=NVDImporter.qualified_name))
41+
Advisory.objects.filter(Q(created_by=NVDImporterPipeline.pipeline_id))
4242
.distinct("aliases")
4343
.paginated()
4444
)

0 commit comments

Comments
 (0)