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