Skip to content

Commit f21f18d

Browse files
authored
Store the whole vulnerability data from cdx to local models (#2007)
Signed-off-by: tdruez <tdruez@aboutcode.org>
1 parent 7328251 commit f21f18d

File tree

4 files changed

+70
-30
lines changed

4 files changed

+70
-30
lines changed

scanpipe/pipes/cyclonedx.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
from cyclonedx.model import license as cdx_license_model
3131
from cyclonedx.model.bom import Bom
3232
from cyclonedx.schema import SchemaVersion
33+
from cyclonedx.schema.schema import BaseSchemaVersion
3334
from cyclonedx.validation import ValidationError
3435
from cyclonedx.validation.json import JsonStrictValidator
3536
from defusedxml import ElementTree as SafeElementTree
@@ -184,10 +185,12 @@ def cyclonedx_component_to_package_data(
184185
affected_by_vulnerabilities = []
185186
if affected_by := vulnerabilities.get(bom_ref):
186187
for cdx_vulnerability in affected_by:
188+
cdx_vulnerability_json = cdx_vulnerability.as_json(view_=BaseSchemaVersion)
187189
affected_by_vulnerabilities.append(
188190
{
189191
"vulnerability_id": str(cdx_vulnerability.id),
190192
"summary": cdx_vulnerability.description,
193+
"cdx_vulnerability_data": json.loads(cdx_vulnerability_json),
191194
}
192195
)
193196

scanpipe/templates/scanpipe/tabset/tab_vulnerabilities.html

Lines changed: 35 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@
22
<table class="table is-bordered is-striped is-narrow is-hoverable is-fullwidth">
33
<thead>
44
<tr>
5-
<th style="width: 210px;">Affected by</th>
5+
<th style="width: 220px;">Affected by</th>
66
<th>Summary</th>
7-
<th style="width: 210px;">Aliases</th>
7+
<th>Analysis</th>
88
</tr>
99
</thead>
1010
<tbody>
@@ -15,28 +15,43 @@
1515
{{ vulnerability.vulnerability_id }}
1616
<i class="fa-solid fa-up-right-from-square is-small"></i>
1717
</a>
18+
<ul class="list-unstyled mb-0">
19+
{% for alias in aliases %}
20+
<li>
21+
{% if alias|slice:":3" == "CVE" %}
22+
<a href="https://nvd.nist.gov/vuln/detail/{{ alias }}" target="_blank">{{ alias }}
23+
<i class="fa-solid fa-up-right-from-square mini"></i>
24+
</a>
25+
{% elif alias|slice:":4" == "GHSA" %}
26+
<a href="https://github.com/advisories/{{ alias }}" target="_blank">{{ alias }}
27+
<i class="fa-solid fa-up-right-from-square mini"></i>
28+
</a>
29+
{% elif alias|slice:":3" == "NPM" %}
30+
<a href="https://github.com/nodejs/security-wg/blob/main/vuln/npm/{{ alias|slice:"4:" }}.json" target="_blank">{{ alias }}
31+
<i class="fa-solid fa-up-right-from-square mini"></i>
32+
</a>
33+
{% else %}
34+
{{ alias }}
35+
{% endif %}
36+
</li>
37+
{% endfor %}
38+
</ul>
1839
</td>
1940
<td>
20-
{{ vulnerability.summary }}
21-
</td>
22-
<td>
23-
{% for alias in vulnerability.aliases %}
24-
{% if alias|slice:":3" == "CVE" %}
25-
<a href="https://nvd.nist.gov/vuln/detail/{{ alias }}" target="_blank">{{ alias }}
26-
<i class="fa-solid fa-up-right-from-square is-small"></i>
27-
</a>
28-
{% elif alias|slice:":4" == "GHSA" %}
29-
<a href="https://github.com/advisories/{{ alias }}" target="_blank">{{ alias }}
30-
<i class="fa-solid fa-up-right-from-square is-small"></i>
31-
</a>
32-
{% elif alias|slice:":3" == "NPM" %}
33-
<a href="https://github.com/nodejs/security-wg/blob/main/vuln/npm/{{ alias|slice:"4:" }}.json" target="_blank">{{ alias }}
34-
<i class="fa-solid fa-up-right-from-square is-small"></i>
35-
</a>
41+
{% if vulnerability.summary %}
42+
{% if vulnerability.summary|length > 150 %}
43+
<details>
44+
<summary>{{ vulnerability.summary|slice:":150" }}...</summary>
45+
{{ vulnerability.summary|slice:"150:" }}
46+
</details>
3647
{% else %}
37-
{{ alias }}
48+
{{ vulnerability.summary }}
3849
{% endif %}
39-
<br>
50+
{% endif %}
51+
</td>
52+
<td>
53+
{% for key, value in vulnerability.cdx_vulnerability.analysis.items %}
54+
<strong>{{ key }}:</strong> {{ value }}{% if not forloop.last %}<br>{% endif %}
4055
{% endfor %}
4156
</td>
4257
</tr>

scanpipe/tests/pipes/test_cyclonedx.py

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -250,13 +250,24 @@ def test_scanpipe_cyclonedx_resolve_cyclonedx_packages_vulnerabilities(self):
250250
self.assertEqual(1, len(packages))
251251

252252
affected_by = packages[0]["affected_by_vulnerabilities"]
253+
self.assertEqual("CVE-2005-2541", affected_by[0]["vulnerability_id"])
254+
self.assertEqual(
255+
"Tar 1.15.1 does not properly warn the user when...",
256+
affected_by[0]["summary"],
257+
)
258+
self.assertIn("cdx_vulnerability_data", affected_by[0])
259+
cdx_vulnerability_data = affected_by[0]["cdx_vulnerability_data"]
253260
expected = [
254-
{
255-
"vulnerability_id": "CVE-2005-2541",
256-
"summary": "Tar 1.15.1 does not properly warn the user when...",
257-
}
261+
"advisories",
262+
"affects",
263+
"description",
264+
"id",
265+
"published",
266+
"ratings",
267+
"source",
268+
"updated",
258269
]
259-
self.assertEqual(expected, affected_by)
270+
self.assertEqual(expected, sorted(cdx_vulnerability_data.keys()))
260271

261272
def test_scanpipe_cyclonedx_resolve_cyclonedx_packages_pre_validation(self):
262273
# This SBOM includes multiple deserialization issues that are "fixed"

scanpipe/tests/test_pipelines.py

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1638,13 +1638,24 @@ def test_scanpipe_load_sbom_pipeline_cyclonedx_with_vulnerabilities(self):
16381638

16391639
self.assertEqual(1, project1.discoveredpackages.count())
16401640
package = project1.discoveredpackages.get()
1641+
affected_by = package.affected_by_vulnerabilities[0]
1642+
cdx_vulnerability_data = affected_by.pop("cdx_vulnerability_data")
1643+
expected = {
1644+
"vulnerability_id": "CVE-2005-2541",
1645+
"summary": "Tar 1.15.1 does not properly warn the user when...",
1646+
}
1647+
self.assertEqual(expected, affected_by)
16411648
expected = [
1642-
{
1643-
"vulnerability_id": "CVE-2005-2541",
1644-
"summary": "Tar 1.15.1 does not properly warn the user when...",
1645-
}
1649+
"advisories",
1650+
"affects",
1651+
"description",
1652+
"id",
1653+
"published",
1654+
"ratings",
1655+
"source",
1656+
"updated",
16461657
]
1647-
self.assertEqual(expected, package.affected_by_vulnerabilities)
1658+
self.assertEqual(expected, sorted(cdx_vulnerability_data.keys()))
16481659

16491660
@mock.patch("scanpipe.pipes.purldb.request_post")
16501661
@mock.patch("uuid.uuid4")

0 commit comments

Comments
 (0)