Skip to content

Commit 02e8616

Browse files
committed
Rename file to cvss2to3.py
Add download_url fof severity_systems.py.ABOUT Fix notes Test with nvd severity data Move the cvssv2_converter.py to serverity_systems.py Give credit to Marc Ruef Fix missing parts in the vector Add some tests Edit CI, II , AI to C , I, A Convert CVSSv2 into CVSSv3 Signed-off-by: ziadhany <ziadhany2016@gmail.com>
1 parent ea0b934 commit 02e8616

5 files changed

Lines changed: 677 additions & 0 deletions

File tree

vulnerabilities/cvss2to3.py

Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
from cvss import CVSS2
2+
3+
4+
def convert_cvssv2_vector_to_cvssv3_vector(cvssv2_vector):
5+
"""
6+
Returns the CVSSv3 vector
7+
>>> cvssv2_vector = "AV:L/AC:L/Au:M/C:N/I:P/A:C/E:U/RL:W/RC:ND/CDP:L/TD:H/CR:ND/IR:ND/AR:M"
8+
>>> cvssv3_vector = convert_cvssv2_vector_to_cvssv3_vector(cvssv2_vector)
9+
>>> assert cvssv3_vector == 'CVSS:3.0/AV:L/UI:N/AC:L/PR:H/C:N/I:L/A:H/S:C/E:U/RL:W/RC:X'
10+
"""
11+
cvss2_metrics = CVSS2(cvssv2_vector).metrics
12+
cvss3_metrics = {}
13+
14+
# AV (P is new)
15+
if cvss2_metrics["AV"] == "L":
16+
# L => (L|P) (usually L)
17+
cvss3_metrics["AV"] = "L"
18+
19+
elif cvss2_metrics["AV"] == "A":
20+
# A => A
21+
cvss3_metrics["AV"] = "A"
22+
23+
elif cvss2_metrics["AV"] == "N":
24+
# N => N
25+
cvss3_metrics["AV"] = "N"
26+
27+
# AC split into AC and UI
28+
cvss3_metrics["UI"] = "R"
29+
if cvss2_metrics["AC"] == "L":
30+
cvss3_metrics["AC"] = "L"
31+
cvss3_metrics["UI"] = "N"
32+
33+
elif cvss2_metrics["AC"] == "M":
34+
cvss3_metrics["AC"] = "L"
35+
36+
elif cvss2_metrics["AC"] == "H":
37+
cvss3_metrics["AC"] = "H"
38+
39+
# Au => PR (needs manual optimization)
40+
if cvss2_metrics.get("Au") == "N":
41+
# N => N
42+
cvss3_metrics["PR"] = "N"
43+
44+
elif cvss2_metrics.get("Au") == "S":
45+
# S => (L|H) (usually L)
46+
cvss3_metrics["PR"] = "L"
47+
48+
elif cvss2_metrics.get("Au") == "M":
49+
# M => (H|L) (sometimes H)
50+
cvss3_metrics["PR"] = "H"
51+
52+
# C, I and A
53+
# C => H , P => L, N => N
54+
for key in ["C", "I", "A"]:
55+
if cvss2_metrics.get(key) == "N":
56+
cvss3_metrics[key] = "N"
57+
elif cvss2_metrics.get(key) == "P":
58+
cvss3_metrics[key] = "L"
59+
elif cvss2_metrics.get(key) == "C":
60+
cvss3_metrics[key] = "H"
61+
62+
# C:C/I:C/A:C derived by S:C
63+
if cvss2_metrics.get("C") and cvss2_metrics.get("I") and cvss2_metrics.get("A"):
64+
cvss3_metrics["S"] = "C"
65+
else:
66+
cvss3_metrics["S"] = "U"
67+
68+
# E
69+
# ND => X , U => U, POC => P, F => F, H => H
70+
if cvss2_metrics.get("E") == "POC":
71+
cvss3_metrics["E"] = "P"
72+
73+
elif cvss2_metrics.get("E") == "ND":
74+
cvss3_metrics["E"] = "X"
75+
76+
elif cvss2_metrics.get("E") == "F":
77+
cvss3_metrics["E"] = "F"
78+
79+
elif cvss2_metrics.get("E") == "H":
80+
cvss3_metrics["E"] = "H"
81+
82+
elif cvss2_metrics.get("E") == "U":
83+
cvss3_metrics["E"] = "U"
84+
85+
# RL
86+
# ND => X, OF => O, TF => T, W => W, U => U
87+
if cvss2_metrics.get("RL") == "ND":
88+
cvss3_metrics["RL"] = "X"
89+
90+
elif cvss2_metrics.get("RL") == "OF":
91+
cvss3_metrics["RL"] = "X"
92+
93+
elif cvss2_metrics.get("RL") == "TF":
94+
cvss3_metrics["RL"] = "P"
95+
96+
elif cvss2_metrics.get("RL") == "W":
97+
cvss3_metrics["RL"] = "W"
98+
99+
elif cvss2_metrics.get("RL") == "U":
100+
cvss3_metrics["RL"] = "U"
101+
102+
# RC
103+
# C = > C, UR = > R, UC = > U, ND = > X
104+
if cvss2_metrics.get("RC") == "C":
105+
cvss3_metrics["RC"] = "C"
106+
107+
elif cvss2_metrics.get("RC") == "UR":
108+
cvss3_metrics["RC"] = "R"
109+
110+
elif cvss2_metrics.get("RC") == "UC":
111+
cvss3_metrics["RC"] = "U"
112+
113+
elif cvss2_metrics.get("RC") == "ND":
114+
cvss3_metrics["RC"] = "X"
115+
116+
cvssv3_vector = ""
117+
for k, v in cvss3_metrics.items():
118+
cvssv3_vector += f"/{k}:{v}"
119+
return "CVSS:3.0/" + cvssv3_vector[1::]

vulnerabilities/cvss2to3.py.ABOUT

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
about_resource: cvss2to3.py
2+
author: Marc Ruef @marcruef
3+
notes: convert_cvssv2_vector_to_cvssv3_vector function was written using Marc Ruef's answer from stackexchange question
4+
license_expression: cc-by-sa-3.0
5+
license_file: cvss2to3.py.LICENSE
6+
download_url: https://security.stackexchange.com/questions/127335/how-to-convert-risk-scores-cvssv1-cvssv2-cvssv3-owasp-risk-severity

0 commit comments

Comments
 (0)