Skip to content

Commit cf79d80

Browse files
committed
move the cvssv2_converter.py to serverity_systems.py
Signed-off-by: ziad <ziadhany2016@gmail.com>
1 parent 739d1e5 commit cf79d80

6 files changed

Lines changed: 124 additions & 125 deletions

File tree

vulnerabilities/cvssv2_converter.py

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

vulnerabilities/cvssv2_converter.py..ABOUT

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

vulnerabilities/severity_systems.py

Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,3 +161,121 @@ def compute(self, scoring_elements: str) -> str:
161161
APACHE_TOMCAT,
162162
)
163163
}
164+
165+
166+
def convert_cvssv2_vector_to_cvssv3_vector(cvssv2_vector):
167+
"""
168+
Returns the CVSSv3 vector
169+
>>> 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"
170+
>>> cvssv3_vector = convert_cvssv2_vector_to_cvssv3_vector(cvssv2_vector)
171+
>>> 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'
172+
"""
173+
cvss2_metrics = CVSS2(cvssv2_vector).metrics
174+
cvss3_metrics = {}
175+
176+
# AV (P is new)
177+
if cvss2_metrics["AV"] == "L":
178+
# L => (L|P) (usually L)
179+
cvss3_metrics["AV"] = "L"
180+
181+
elif cvss2_metrics["AV"] == "A":
182+
# A => A
183+
cvss3_metrics["AV"] = "A"
184+
185+
elif cvss2_metrics["AV"] == "N":
186+
# N => N
187+
cvss3_metrics["AV"] = "N"
188+
189+
# AC split into AC and UI
190+
cvss3_metrics["UI"] = "R"
191+
if cvss2_metrics["AC"] == "L":
192+
cvss3_metrics["AC"] = "L"
193+
cvss3_metrics["UI"] = "N"
194+
195+
elif cvss2_metrics["AC"] == "M":
196+
cvss3_metrics["AC"] = "L"
197+
198+
elif cvss2_metrics["AC"] == "H":
199+
cvss3_metrics["AC"] = "H"
200+
201+
# Au => PR (needs manual optimization)
202+
if cvss2_metrics.get("Au") == "N":
203+
# N => N
204+
cvss3_metrics["PR"] = "N"
205+
206+
elif cvss2_metrics.get("Au") == "S":
207+
# S => (L|H) (usually L)
208+
cvss3_metrics["PR"] = "L"
209+
210+
elif cvss2_metrics.get("Au") == "M":
211+
# M => (H|L) (sometimes H)
212+
cvss3_metrics["PR"] = "H"
213+
214+
# C, I and A
215+
# C => H , P => L, N => N
216+
for key in ["C", "I", "A"]:
217+
if cvss2_metrics.get(key) == "N":
218+
cvss3_metrics[key] = "N"
219+
elif cvss2_metrics.get(key) == "P":
220+
cvss3_metrics[key] = "L"
221+
elif cvss2_metrics.get(key) == "C":
222+
cvss3_metrics[key] = "H"
223+
224+
# C:C/I:C/A:C derived by S:C
225+
if cvss2_metrics.get("C") and cvss2_metrics.get("I") and cvss2_metrics.get("A"):
226+
cvss3_metrics["S"] = "C"
227+
else:
228+
cvss3_metrics["S"] = "U"
229+
230+
# E
231+
# ND => X , U => U, POC => P, F => F, H => H
232+
if cvss2_metrics.get("E") == "POC":
233+
cvss3_metrics["E"] = "P"
234+
235+
elif cvss2_metrics.get("E") == "ND":
236+
cvss3_metrics["E"] = "X"
237+
238+
elif cvss2_metrics.get("E") == "F":
239+
cvss3_metrics["E"] = "F"
240+
241+
elif cvss2_metrics.get("E") == "H":
242+
cvss3_metrics["E"] = "H"
243+
244+
elif cvss2_metrics.get("E") == "U":
245+
cvss3_metrics["E"] = "U"
246+
247+
# RL
248+
# ND => X, OF => O, TF => T, W => W, U => U
249+
if cvss2_metrics.get("RL") == "ND":
250+
cvss3_metrics["RL"] = "X"
251+
252+
elif cvss2_metrics.get("RL") == "OF":
253+
cvss3_metrics["RL"] = "X"
254+
255+
elif cvss2_metrics.get("RL") == "TF":
256+
cvss3_metrics["RL"] = "P"
257+
258+
elif cvss2_metrics.get("RL") == "W":
259+
cvss3_metrics["RL"] = "W"
260+
261+
elif cvss2_metrics.get("RL") == "U":
262+
cvss3_metrics["RL"] = "U"
263+
264+
# RC
265+
# C = > C, UR = > R, UC = > U, ND = > X
266+
if cvss2_metrics.get("RC") == "C":
267+
cvss3_metrics["RC"] = "C"
268+
269+
elif cvss2_metrics.get("RC") == "UR":
270+
cvss3_metrics["RC"] = "R"
271+
272+
elif cvss2_metrics.get("RC") == "UC":
273+
cvss3_metrics["RC"] = "U"
274+
275+
elif cvss2_metrics.get("RC") == "ND":
276+
cvss3_metrics["RC"] = "X"
277+
278+
cvssv3_vector = ""
279+
for k, v in cvss3_metrics.items():
280+
cvssv3_vector += f"/{k}:{v}"
281+
return "CVSS:3.0/" + cvssv3_vector[1::]
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
about_resource: severity_systems.py convert_cvssv2_vector_to_cvssv3_vector function
2+
author: Marc Ruef @marcruef
3+
notes: convert_cvssv2_vector_to_cvssv3_vector function was written using Marc Ruef's answer from this post https://security.stackexchange.com/questions/127335/how-to-convert-risk-scores-cvssv1-cvssv2-cvssv3-owasp-risk-severity
4+
license_expression: CC BY-SA 3.0
5+
license_file: severity_systems.py.LICENSE
File renamed without changes.

vulnerabilities/tests/test_convert_cvsss_vectors.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import pytest
22

3-
from vulnerabilities.cvssv2_converter import convert_cvssv2_vector_to_cvssv3_vector
3+
from vulnerabilities.severity_systems import convert_cvssv2_vector_to_cvssv3_vector
44

55

66
@pytest.mark.parametrize(

0 commit comments

Comments
 (0)