@@ -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