|
| 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::] |
0 commit comments