Skip to content

Commit b0cb62b

Browse files
committed
Fix missing condition in convert_cvssv2_vector_to_cvssv3_vector function
Test function with nvd_cvss.csv data Remove function from severity_systems.py 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 b0cb62b

5 files changed

Lines changed: 106998 additions & 0 deletions

File tree

vulnerabilities/cvss2to3.py

Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
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.get("AV") == "L":
16+
# L => (L|P) (usually L)
17+
cvss3_metrics["AV"] = "L"
18+
19+
elif cvss2_metrics.get("AV") == "A":
20+
# A => A
21+
cvss3_metrics["AV"] = "A"
22+
23+
elif cvss2_metrics.get("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] = "H"
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 (
64+
cvss2_metrics.get("C") == "C"
65+
and cvss2_metrics.get("I") == "C"
66+
and cvss2_metrics.get("A") == "C"
67+
):
68+
cvss3_metrics["S"] = "C"
69+
else:
70+
cvss3_metrics["S"] = "U"
71+
72+
# E
73+
# ND => X , U => U, POC => P, F => F, H => H
74+
if cvss2_metrics.get("E") == "POC":
75+
cvss3_metrics["E"] = "P"
76+
77+
elif cvss2_metrics.get("E") == "ND":
78+
cvss3_metrics["E"] = "X"
79+
80+
elif cvss2_metrics.get("E") == "F":
81+
cvss3_metrics["E"] = "F"
82+
83+
elif cvss2_metrics.get("E") == "H":
84+
cvss3_metrics["E"] = "H"
85+
86+
elif cvss2_metrics.get("E") == "U":
87+
cvss3_metrics["E"] = "U"
88+
89+
# RL
90+
# ND => X, OF => O, TF => T, W => W, U => U
91+
if cvss2_metrics.get("RL") == "ND":
92+
cvss3_metrics["RL"] = "X"
93+
94+
elif cvss2_metrics.get("RL") == "OF":
95+
cvss3_metrics["RL"] = "X"
96+
97+
elif cvss2_metrics.get("RL") == "TF":
98+
cvss3_metrics["RL"] = "P"
99+
100+
elif cvss2_metrics.get("RL") == "W":
101+
cvss3_metrics["RL"] = "W"
102+
103+
elif cvss2_metrics.get("RL") == "U":
104+
cvss3_metrics["RL"] = "U"
105+
106+
# RC
107+
# C = > C, UR = > R, UC = > U, ND = > X
108+
if cvss2_metrics.get("RC") == "C":
109+
cvss3_metrics["RC"] = "C"
110+
111+
elif cvss2_metrics.get("RC") == "UR":
112+
cvss3_metrics["RC"] = "R"
113+
114+
elif cvss2_metrics.get("RC") == "UC":
115+
cvss3_metrics["RC"] = "U"
116+
117+
elif cvss2_metrics.get("RC") == "ND":
118+
cvss3_metrics["RC"] = "X"
119+
120+
cvssv3_vector = ""
121+
for k, v in cvss3_metrics.items():
122+
cvssv3_vector += f"/{k}:{v}"
123+
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)