Skip to content

Commit 124f010

Browse files
committed
mark unfurl should be a step in unfurling version range pipeline
Signed-off-by: Tushar Goel <tushar.goel.dav@gmail.com>
1 parent ef611b2 commit 124f010

5 files changed

Lines changed: 130 additions & 164 deletions

File tree

vulnerabilities/importers/__init__.py

Lines changed: 32 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -120,39 +120,8 @@
120120
ubuntu_osv_importer_v2.UbuntuOSVImporterPipeline,
121121
alpine_linux_importer_v2.AlpineLinuxImporterPipeline,
122122
linux_kernel_importer_v2.LinuxKernelPipeline,
123-
github_importer.GitHubAPIImporterPipeline,
124-
gitlab_importer.GitLabImporterPipeline,
125-
github_osv.GithubOSVImporter,
126-
pypa_importer.PyPaImporterPipeline,
127-
npm_importer.NpmImporterPipeline,
128-
nginx_importer.NginxImporterPipeline,
129-
pysec_importer.PyPIImporterPipeline,
130-
fireeye_importer_v2.FireeyeImporterPipeline,
131-
apache_tomcat.ApacheTomcatImporter,
132-
postgresql.PostgreSQLImporter,
133-
debian.DebianImporter,
134-
curl.CurlImporter,
135-
epss.EPSSImporter,
136-
vulnrichment.VulnrichImporter,
137-
alpine_linux_importer.AlpineLinuxImporterPipeline,
138-
ruby.RubyImporter,
139-
apache_kafka.ApacheKafkaImporter,
140123
openssl_importer_v2.OpenSSLImporterPipeline,
141-
redhat.RedhatImporter,
142-
archlinux.ArchlinuxImporter,
143-
debian_oval.DebianOvalImporter,
144-
retiredotnet.RetireDotnetImporter,
145-
apache_httpd.ApacheHTTPDImporter,
146-
mozilla.MozillaImporter,
147-
gentoo.GentooImporter,
148-
istio.IstioImporter,
149-
project_kb_msr2019.ProjectKBMSRImporter,
150-
suse_scores.SUSESeverityScoreImporter,
151-
elixir_security.ElixirSecurityImporter,
152-
xen.XenImporter,
153-
ubuntu_usn.UbuntuUSNImporter,
154-
fireeye.FireyeImporter,
155-
oss_fuzz.OSSFuzzImporter,
124+
fireeye_importer_v2.FireeyeImporterPipeline,
156125
collect_fix_commits_v2.CollectLinuxFixCommitsPipeline,
157126
collect_fix_commits_v2.CollectBusyBoxFixCommitsPipeline,
158127
collect_fix_commits_v2.CollectNginxFixCommitsPipeline,
@@ -190,6 +159,37 @@
190159
collect_fix_commits_v2.CollectGitFixCommitsPipeline,
191160
collect_fix_commits_v2.CollectJenkinsFixCommitsPipeline,
192161
collect_fix_commits_v2.CollectGitlabFixCommitsPipeline,
162+
# github_importer.GitHubAPIImporterPipeline,
163+
# gitlab_importer.GitLabImporterPipeline,
164+
# github_osv.GithubOSVImporter,
165+
# pypa_importer.PyPaImporterPipeline,
166+
# npm_importer.NpmImporterPipeline,
167+
# nginx_importer.NginxImporterPipeline,
168+
# pysec_importer.PyPIImporterPipeline,
169+
# apache_tomcat.ApacheTomcatImporter,
170+
# postgresql.PostgreSQLImporter,
171+
# debian.DebianImporter,
172+
# curl.CurlImporter,
173+
# epss.EPSSImporter,
174+
# vulnrichment.VulnrichImporter,
175+
# alpine_linux_importer.AlpineLinuxImporterPipeline,
176+
# apache_kafka.ApacheKafkaImporter,
177+
# ruby.RubyImporter,
178+
# redhat.RedhatImporter,
179+
# archlinux.ArchlinuxImporter,
180+
# debian_oval.DebianOvalImporter,
181+
# retiredotnet.RetireDotnetImporter,
182+
# apache_httpd.ApacheHTTPDImporter,
183+
# mozilla.MozillaImporter,
184+
# gentoo.GentooImporter,
185+
# istio.IstioImporter,
186+
# project_kb_msr2019.ProjectKBMSRImporter,
187+
# suse_scores.SUSESeverityScoreImporter,
188+
# elixir_security.ElixirSecurityImporter,
189+
# xen.XenImporter,
190+
# ubuntu_usn.UbuntuUSNImporter,
191+
# fireeye.FireyeImporter,
192+
# oss_fuzz.OSSFuzzImporter,
193193
]
194194
)
195195

vulnerabilities/improvers/__init__.py

Lines changed: 23 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -27,39 +27,13 @@
2727
enhance_with_metasploit as enhance_with_metasploit_v2,
2828
)
2929
from vulnerabilities.pipelines.v2_improvers import flag_ghost_packages as flag_ghost_packages_v2
30-
from vulnerabilities.pipelines.v2_improvers import (
31-
mark_all_impacts_unfurled as mark_all_impacts_unfurled_v2,
32-
)
3330
from vulnerabilities.pipelines.v2_improvers import reference_collect_commits
3431
from vulnerabilities.pipelines.v2_improvers import relate_severities
3532
from vulnerabilities.pipelines.v2_improvers import unfurl_version_range as unfurl_version_range_v2
3633
from vulnerabilities.utils import create_registry
3734

3835
IMPROVERS_REGISTRY = create_registry(
3936
[
40-
valid_versions.GitHubBasicImprover,
41-
valid_versions.GitLabBasicImprover,
42-
valid_versions.NginxBasicImprover,
43-
valid_versions.ApacheHTTPDImprover,
44-
valid_versions.DebianBasicImprover,
45-
valid_versions.NpmImprover,
46-
valid_versions.ElixirImprover,
47-
valid_versions.ApacheTomcatImprover,
48-
valid_versions.ApacheKafkaImprover,
49-
valid_versions.IstioImprover,
50-
valid_versions.DebianOvalImprover,
51-
valid_versions.OSSFuzzImprover,
52-
valid_versions.RubyImprover,
53-
valid_versions.GithubOSVImprover,
54-
vulnerability_status.VulnerabilityStatusImprover,
55-
valid_versions.CurlImprover,
56-
flag_ghost_packages.FlagGhostPackagePipeline,
57-
enhance_with_kev.VulnerabilityKevPipeline,
58-
enhance_with_metasploit.MetasploitImproverPipeline,
59-
enhance_with_exploitdb.ExploitDBImproverPipeline,
60-
compute_package_risk.ComputePackageRiskPipeline,
61-
compute_package_version_rank.ComputeVersionRankPipeline,
62-
populate_vulnerability_summary_pipeline.PopulateVulnerabilitySummariesPipeline,
6337
exploitdb_v2.ExploitDBImproverPipeline,
6438
enhance_with_kev_v2.VulnerabilityKevPipeline,
6539
flag_ghost_packages_v2.FlagGhostPackagePipeline,
@@ -72,6 +46,28 @@
7246
compute_advisory_todo_v2.ComputeToDo,
7347
reference_collect_commits.CollectReferencesFixCommitsPipeline,
7448
enhance_with_github_poc.GithubPocsImproverPipeline,
75-
mark_all_impacts_unfurled_v2.MarkAllImpactsUnfurledPipeline,
49+
# valid_versions.GitHubBasicImprover,
50+
# valid_versions.GitLabBasicImprover,
51+
# valid_versions.NginxBasicImprover,
52+
# valid_versions.ApacheHTTPDImprover,
53+
# valid_versions.DebianBasicImprover,
54+
# valid_versions.NpmImprover,
55+
# valid_versions.ElixirImprover,
56+
# valid_versions.ApacheTomcatImprover,
57+
# valid_versions.ApacheKafkaImprover,
58+
# valid_versions.IstioImprover,
59+
# valid_versions.DebianOvalImprover,
60+
# valid_versions.OSSFuzzImprover,
61+
# valid_versions.RubyImprover,
62+
# valid_versions.GithubOSVImprover,
63+
# vulnerability_status.VulnerabilityStatusImprover,
64+
# valid_versions.CurlImprover,
65+
# flag_ghost_packages.FlagGhostPackagePipeline,
66+
# enhance_with_kev.VulnerabilityKevPipeline,
67+
# enhance_with_metasploit.MetasploitImproverPipeline,
68+
# enhance_with_exploitdb.ExploitDBImproverPipeline,
69+
# compute_package_risk.ComputePackageRiskPipeline,
70+
# compute_package_version_rank.ComputeVersionRankPipeline,
71+
# populate_vulnerability_summary_pipeline.PopulateVulnerabilitySummariesPipeline,
7672
]
7773
)

vulnerabilities/pipelines/v2_improvers/mark_all_impacts_unfurled.py

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

vulnerabilities/pipelines/v2_improvers/unfurl_version_range.py

Lines changed: 71 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,20 +13,27 @@
1313

1414
from aboutcode.pipeline import LoopProgress
1515
from django.db import transaction
16+
from django.db.models import Exists
1617
from django.db.models import F
18+
from django.db.models import OuterRef
1719
from django.db.models import Q
1820
from django.utils import timezone
1921
from fetchcode.package_versions import SUPPORTED_ECOSYSTEMS as FETCHCODE_SUPPORTED_ECOSYSTEMS
2022
from packageurl import PackageURL
2123
from univers.version_range import RANGE_CLASS_BY_SCHEMES
2224
from univers.version_range import VersionRange
2325

26+
from vulnerabilities.models import AdvisoryV2
2427
from vulnerabilities.models import ImpactedPackage
2528
from vulnerabilities.models import ImpactedPackageAffecting
29+
from vulnerabilities.models import ImpactedPackageFixedBy
2630
from vulnerabilities.models import PackageV2
2731
from vulnerabilities.models import PipelineSchedule
2832
from vulnerabilities.pipelines import VulnerableCodePipeline
2933
from vulnerabilities.pipes.fetchcode_utils import get_versions
34+
from vulnerabilities.pipes.group_advisories import group_advisory_for_package
35+
from vulnerabilities.pipes.risk_score import compute_package_risk_score_bulk
36+
from vulnerabilities.utils import TYPES_WITH_MULTIPLE_IMPORTERS
3037
from vulnerabilities.utils import update_purl_version
3138

3239

@@ -39,15 +46,15 @@ class UnfurlVersionRangePipeline(VulnerableCodePipeline):
3946

4047
pipeline_id = "unfurl_version_range_v2"
4148

42-
run_interval = 2
49+
run_interval = 1
4350
run_priority = PipelineSchedule.ExecutionPriority.HIGH
4451

4552
# Days elapsed before version range is re-unfurled
4653
reunfurl_after_days = 2
4754

4855
@classmethod
4956
def steps(cls):
50-
return (cls.unfurl_version_range,)
57+
return (cls.unfurl_version_range, cls.mark_all_impacts_unfurled)
5158

5259
def unfurl_version_range(self):
5360
processed_impacted_packages_count = 0
@@ -115,6 +122,15 @@ def unfurl_version_range(self):
115122
self.log(f"Successfully processed {processed_impacted_packages_count:,d} ImpactedPackage.")
116123
self.log(f"{processed_affected_packages_count:,d} new Impact-Package relation created.")
117124

125+
def mark_all_impacts_unfurled(self):
126+
while True:
127+
advisories = list(latest_advisories_with_all_impacts_unfurled()[:100])
128+
129+
if not advisories:
130+
break
131+
132+
complete_advisories_import(AdvisoryV2.objects.filter(id__in=[a.id for a in advisories]))
133+
118134

119135
def get_affected_purls(versions, impact, logger):
120136
affecting_version_range = VersionRange.from_string(impact.affecting_vers)
@@ -200,3 +216,56 @@ def impacted_package_qs(cutoff_day=2):
200216
.order_by("advisory__id", F("last_range_unfurl_at").asc(nulls_first=True))
201217
.only("pk", "affecting_vers", "advisory", "base_purl")
202218
)
219+
220+
221+
@transaction.atomic
222+
def complete_advisories_import(advisories):
223+
224+
advisory_ids = list(advisories.values_list("id", flat=True))
225+
226+
if not advisory_ids:
227+
return
228+
229+
AdvisoryV2.objects.filter(id__in=advisory_ids).update(_all_impacts_unfurled=True)
230+
231+
affecting_package_ids = set(
232+
ImpactedPackageAffecting.objects.filter(
233+
impacted_package__advisory_id__in=advisory_ids
234+
).values_list(
235+
"package_id",
236+
flat=True,
237+
)
238+
)
239+
240+
fixed_by_package_ids = set(
241+
ImpactedPackageFixedBy.objects.filter(
242+
impacted_package__advisory_id__in=advisory_ids
243+
).values_list(
244+
"package_id",
245+
flat=True,
246+
)
247+
)
248+
249+
compute_package_risk_score_bulk(PackageV2.objects.filter(id__in=affecting_package_ids))
250+
251+
group_package_ids = affecting_package_ids | fixed_by_package_ids
252+
253+
for package in PackageV2.objects.filter(
254+
id__in=group_package_ids, type__in=TYPES_WITH_MULTIPLE_IMPORTERS
255+
).iterator(chunk_size=2000):
256+
group_advisory_for_package(package)
257+
258+
259+
def latest_advisories_with_all_impacts_unfurled():
260+
remaining_unfurled_impacts = ImpactedPackage.objects.filter(
261+
advisory_id=OuterRef("pk"),
262+
last_range_unfurl_at__isnull=True,
263+
advisory__is_latest=True,
264+
)
265+
266+
return (
267+
AdvisoryV2.objects.filter(_all_impacts_unfurled=False, is_latest=True)
268+
.annotate(has_remaining_unfurled=Exists(remaining_unfurled_impacts))
269+
.filter(has_remaining_unfurled=False)
270+
.order_by("id")
271+
)

vulnerabilities/tests/pipelines/v2_improvers/test_mark_all_impacts_unfurled.py

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,8 @@
1414

1515
from vulnerabilities.models import AdvisoryV2
1616
from vulnerabilities.models import ImpactedPackage
17-
from vulnerabilities.pipelines.v2_improvers.mark_all_impacts_unfurled import (
18-
MarkAllImpactsUnfurledPipeline,
19-
)
20-
from vulnerabilities.pipelines.v2_improvers.mark_all_impacts_unfurled import (
17+
from vulnerabilities.pipelines.v2_improvers.unfurl_version_range import UnfurlVersionRangePipeline
18+
from vulnerabilities.pipelines.v2_improvers.unfurl_version_range import (
2119
latest_advisories_with_all_impacts_unfurled,
2220
)
2321

@@ -125,7 +123,7 @@ def test_pipeline_marks_matching_advisories():
125123
last_range_unfurl_at=timezone.now(),
126124
)
127125

128-
pipeline = MarkAllImpactsUnfurledPipeline()
126+
pipeline = UnfurlVersionRangePipeline()
129127
pipeline.mark_all_impacts_unfurled()
130128

131129
advisory.refresh_from_db()
@@ -149,7 +147,7 @@ def test_pipeline_does_not_mark_partial_advisory():
149147
last_range_unfurl_at=None,
150148
)
151149

152-
pipeline = MarkAllImpactsUnfurledPipeline()
150+
pipeline = UnfurlVersionRangePipeline()
153151
pipeline.mark_all_impacts_unfurled()
154152

155153
advisory.refresh_from_db()

0 commit comments

Comments
 (0)