Skip to content

Commit 3af4b40

Browse files
committed
Fix missing parts in the vector
Add some tests Signed-off-by: ziadhany <ziadhany2016@gmail.com>
1 parent 2dc6588 commit 3af4b40

2 files changed

Lines changed: 50 additions & 9 deletions

File tree

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import pytest
2+
3+
from vulnerabilities.utils import convert_cvssv2_vector_to_cvssv3_vector
4+
5+
6+
@pytest.mark.parametrize(
7+
"cvssv2_vector,cvssv3_vector",
8+
[
9+
("AV:A/AC:H/Au:S/C:P/I:P/A:P", "CVSS:3.0/AV:A/UI:R/AC:H/PR:L/C:L/I:L/A:L/S:C"),
10+
("AV:L/AC:L/Au:N/C:N/I:N/A:P", "CVSS:3.0/AV:L/UI:N/AC:L/PR:N/C:N/I:N/A:L/S:C"),
11+
("AV:L/AC:L/Au:N/C:P/I:P/A:C", "CVSS:3.0/AV:L/UI:N/AC:L/PR:N/C:L/I:L/A:H/S:C"),
12+
("AV:L/AC:L/Au:N/C:P/I:P/A:N", "CVSS:3.0/AV:L/UI:N/AC:L/PR:N/C:L/I:L/A:N/S:C"),
13+
("AV:L/AC:L/Au:N/C:P/I:P/A:P", "CVSS:3.0/AV:L/UI:N/AC:L/PR:N/C:L/I:L/A:L/S:C"),
14+
("AV:N/AC:L/Au:N/C:P/I:N/A:N", "CVSS:3.0/AV:N/UI:N/AC:L/PR:N/C:L/I:N/A:N/S:C"),
15+
("AV:N/AC:L/Au:N/C:P/I:P/A:P", "CVSS:3.0/AV:N/UI:N/AC:L/PR:N/C:L/I:L/A:L/S:C"),
16+
("AV:N/AC:M/Au:N/C:N/I:P/A:N", "CVSS:3.0/AV:N/UI:R/AC:L/PR:N/C:N/I:L/A:N/S:C"),
17+
("AV:N/AC:M/Au:N/C:P/I:N/A:N", "CVSS:3.0/AV:N/UI:R/AC:L/PR:N/C:L/I:N/A:N/S:C"),
18+
],
19+
)
20+
def convert_cvssv2_to_cvssv3(cvssv2_vector, cvssv3_vector):
21+
assert convert_cvssv2_vector_to_cvssv3_vector(cvssv2_vector) == cvssv3_vector

vulnerabilities/utils.py

Lines changed: 29 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -510,7 +510,7 @@ def convert_cvssv2_vector_to_cvssv3_vector(cvssv2_vector):
510510
Returns the CVSSv3 vector
511511
>>> 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"
512512
>>> cvssv3_vector = convert_cvssv2_vector_to_cvssv3_vector(cvssv2_vector)
513-
>>> assert cvssv3_vector == 'AV:L/AC:L/PR:H/C:N/I:L/A:H/S:C/E:U/RL:W/RC:X'
513+
>>> 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'
514514
"""
515515
cvss2_metrics = CVSS2(cvssv2_vector).metrics
516516
cvss3_metrics = {}
@@ -520,16 +520,26 @@ def convert_cvssv2_vector_to_cvssv3_vector(cvssv2_vector):
520520
# L => (L|P) (usually L)
521521
cvss3_metrics["AV"] = "L"
522522

523+
elif cvss2_metrics["AV"] == "A":
524+
# A => A
525+
cvss3_metrics["AV"] = "A"
526+
527+
elif cvss2_metrics["AV"] == "N":
528+
# N => N
529+
cvss3_metrics["AV"] = "N"
530+
523531
# AC split into AC and UI
532+
cvss3_metrics["UI"] = "R"
524533
if cvss2_metrics["AC"] == "L":
525534
cvss3_metrics["AC"] = "L"
535+
cvss3_metrics["UI"] = "N"
536+
537+
elif cvss2_metrics["AC"] == "M":
538+
cvss3_metrics["AC"] = "L"
526539

527540
elif cvss2_metrics["AC"] == "H":
528541
cvss3_metrics["AC"] = "H"
529542

530-
# What about M and UI ?
531-
# TODO
532-
533543
# Au => PR (needs manual optimization)
534544
if cvss2_metrics.get("Au") == "N":
535545
# N => N
@@ -567,8 +577,14 @@ def convert_cvssv2_vector_to_cvssv3_vector(cvssv2_vector):
567577
elif cvss2_metrics.get("E") == "ND":
568578
cvss3_metrics["E"] = "X"
569579

570-
else:
571-
cvss3_metrics["E"] = cvss2_metrics.get("E") # F => F, H => H, U => U
580+
elif cvss2_metrics.get("E") == "F":
581+
cvss3_metrics["E"] = "F"
582+
583+
elif cvss2_metrics.get("E") == "H":
584+
cvss3_metrics["E"] = "H"
585+
586+
elif cvss2_metrics.get("E") == "U":
587+
cvss3_metrics["E"] = "U"
572588

573589
# RL
574590
# ND => X, OF => O, TF => T, W => W, U => U
@@ -580,8 +596,12 @@ def convert_cvssv2_vector_to_cvssv3_vector(cvssv2_vector):
580596

581597
elif cvss2_metrics.get("RL") == "TF":
582598
cvss3_metrics["RL"] = "P"
583-
else:
584-
cvss3_metrics["RL"] = cvss2_metrics.get("RL") # W => W, U => U
599+
600+
elif cvss2_metrics.get("RL") == "W":
601+
cvss3_metrics["RL"] = "W"
602+
603+
elif cvss2_metrics.get("RL") == "U":
604+
cvss3_metrics["RL"] = "U"
585605

586606
# RC
587607
# C = > C, UR = > R, UC = > U, ND = > X
@@ -600,4 +620,4 @@ def convert_cvssv2_vector_to_cvssv3_vector(cvssv2_vector):
600620
cvssv3_vector = ""
601621
for k, v in cvss3_metrics.items():
602622
cvssv3_vector += f"/{k}:{v}"
603-
return cvssv3_vector[1::]
623+
return "CVSS:3.0/" + cvssv3_vector[1::]

0 commit comments

Comments
 (0)