Skip to content

Commit c60643b

Browse files
authored
Merge pull request #324 from nicholasks/feature/premium-insecure-db
Provide CVSS information when available.
2 parents b289752 + 23b234f commit c60643b

File tree

5 files changed

+67
-4
lines changed

5 files changed

+67
-4
lines changed

HISTORY.rst

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,12 @@
22
History
33
=======
44

5-
1.10.1 (2020-12-03)
5+
1.10.2 (master)
6+
-------------------
7+
8+
* Provide CVSS scores on full report, when available
9+
10+
1.10.1 (2021-01-03)
611
-------------------
712

813
* Reduced Docker image and Binary size

README.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -250,7 +250,7 @@ ___
250250

251251
### `--full-report`
252252

253-
*Full reports include a security advisory (if available).*
253+
*Full reports include a security advisory and CVSS scores (if available).*
254254

255255
**Example**
256256
```bash
@@ -277,6 +277,8 @@ safety check --full-report
277277
+============================+===========+==========================+==========+
278278
| package | installed | affected | ID |
279279
+============================+===========+==========================+==========+
280+
| CVSS v2 | BASE SCORE: 6.5 | IMPACT SCORE: 6.4 |
281+
+============================+===========+==========================+==========+
280282
| django | 1.2 | <1.2.2 | 25701 |
281283
+==============================================================================+
282284
| Cross-site scripting (XSS) vulnerability in Django 1.2.x before 1.2.2 allows |

safety/formatter.py

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,32 @@ def render(vulns, full, checked_packages, used_db):
109109
if full:
110110
table.append(SheetReport.REPORT_SECTION)
111111

112+
if vuln.cvssv2 is not None:
113+
base_score = vuln.cvssv2.get("base_score", "None")
114+
impact_score = vuln.cvssv2.get("impact_score", "None")
115+
116+
table.append("| {:76} |".format(
117+
"CVSS v2 | BASE SCORE: {} | IMPACT SCORE: {}".format(
118+
base_score,
119+
impact_score,
120+
)
121+
))
122+
table.append(SheetReport.REPORT_SECTION)
123+
124+
if vuln.cvssv3 is not None:
125+
base_score = vuln.cvssv3.get("base_score", "None")
126+
impact_score = vuln.cvssv3.get("impact_score", "None")
127+
base_severity = vuln.cvssv3.get("base_severity", "None")
128+
129+
table.append("| {:76} |".format(
130+
"CVSS v3 | BASE SCORE: {} | IMPACT SCORE: {} | BASE SEVERITY: {}".format(
131+
base_score,
132+
impact_score,
133+
base_severity,
134+
)
135+
))
136+
table.append(SheetReport.REPORT_SECTION)
137+
112138
descr = get_advisory(vuln)
113139

114140
for pn, paragraph in enumerate(descr.replace('\r', '').split('\n\n')):
@@ -203,6 +229,26 @@ def render(vulns, full, checked_packages, used_db):
203229
vuln.vuln_id
204230
))
205231
if full:
232+
if vuln.cvssv2 is not None:
233+
base_score = vuln.cvssv2.get("base_score", "None")
234+
impact_score = vuln.cvssv2.get("impact_score", "None")
235+
236+
table.append("CVSS v2 -- BASE SCORE: {}, IMPACT SCORE: {}".format(
237+
base_score,
238+
impact_score,
239+
))
240+
241+
if vuln.cvssv3 is not None:
242+
base_score = vuln.cvssv3.get("base_score", "None")
243+
impact_score = vuln.cvssv3.get("impact_score", "None")
244+
base_severity = vuln.cvssv3.get("base_severity", "None")
245+
246+
table.append("CVSS v3 -- BASE SCORE: {}, IMPACT SCORE: {}, BASE SEVERITY: {}".format(
247+
base_score,
248+
impact_score,
249+
base_severity,
250+
))
251+
206252
table.append(get_advisory(vuln))
207253
table.append("--")
208254
else:

safety/safety.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616

1717

1818
class Vulnerability(namedtuple("Vulnerability",
19-
["name", "spec", "version", "advisory", "vuln_id"])):
19+
["name", "spec", "version", "advisory", "vuln_id", "cvssv2", "cvssv3"])):
2020
pass
2121

2222

@@ -157,14 +157,20 @@ def check(packages, key, db_mirror, cached, ignore_ids, proxy):
157157
db_full = fetch_database(full=True, key=key, db=db_mirror, cached=cached, proxy=proxy)
158158
for data in get_vulnerabilities(pkg=name, spec=specifier, db=db_full):
159159
vuln_id = data.get("id").replace("pyup.io-", "")
160+
cve_id = data.get("cve")
161+
if cve_id:
162+
cve_id = cve_id.split(",")[0].strip()
160163
if vuln_id and vuln_id not in ignore_ids:
164+
cve_meta = db_full.get("$meta", {}).get("cve", {}).get(cve_id, {})
161165
vulnerable.append(
162166
Vulnerability(
163167
name=name,
164168
spec=specifier,
165169
version=pkg.version,
166170
advisory=data.get("advisory"),
167-
vuln_id=vuln_id
171+
vuln_id=vuln_id,
172+
cvssv2=cve_meta.get("cvssv2", None),
173+
cvssv3=cve_meta.get("cvssv3", None),
168174
)
169175
)
170176
return vulnerable
@@ -179,6 +185,8 @@ def review(vulnerabilities):
179185
"version": vuln[2],
180186
"advisory": vuln[3],
181187
"vuln_id": vuln[4],
188+
"cvssv2": None,
189+
"cvssv3": None
182190
}
183191
vulnerable.append(
184192
Vulnerability(**current_vuln)

tests/test_safety.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,8 @@ def test_full_report(self):
121121
+ ' blah' * 15 + '.\r\n\r\n'
122122
+ 'All users are urged to upgrade please.\r\n',
123123
vuln_id=1234,
124+
cvssv2=None,
125+
cvssv3=None,
124126
),
125127
]
126128
full_report = formatter.SheetReport.render(

0 commit comments

Comments
 (0)