Ejemplo n.º 1
0
    def check_vulns(self):
        vulns = []
        for possible_flow in self.tracked_patterns:
            for pat_name, tracked in possible_flow.items():
                if len(tracked['sources']) > 0 and len(tracked['sinks']) > 0:
                    for sink in tracked['sinks']:
                        # [:] makes a copy of the array, so the reported vuln isn't changed
                        # after being reported
                        vuln_name = pat_name
                        src = tracked['sources'][:]
                        san = tracked['sanitizers'][:]
                        snk = [sink][:]

                        vuln = Vulnerability(vuln_name, src, san, snk)
                        duplicated = False

                        for rv in self.reported_vuls:
                            duplicated = False
                            if str(rv) == str(vuln):
                                duplicated = True
                                break
                        if not duplicated:
                            self.reported_vuls.append(vuln)
                            vulns.append(vuln)
                    # clear already reported sinks
                    tracked['sinks'] = []
        return vulns
Ejemplo n.º 2
0
 def start_element(self, name, attrs):
     if name == self.VULNERABILITY:
         self.vul = Vulnerability()
         self.vul.setName(attrs[self.VULNERABILITY_NAME])
     elif name == self.VULNERABILITY_DESCRIPTION:
         self.tag = self.VULNERABILITY_DESCRIPTION
     elif name == self.VULNERABILITY_SOLUTION:
         #self.tag = self.VULNERABILITY_SOLUTION
         self.vul.setSolution(attrs["text"])
     elif name == self.VULNERABILITY_REFERENCES:
         self.references = {}
     elif name == self.VULNERABILITY_REFERENCE:
         self.tag = self.VULNERABILITY_REFERENCE
     elif name == self.VULNERABILITY_REFERENCE_TITLE:
         self.tag = self.VULNERABILITY_REFERENCE_TITLE
     elif name == self.VULNERABILITY_REFERENCE_URL:
         self.tag = self.VULNERABILITY_REFERENCE_URL
Ejemplo n.º 3
0
 def register_vuln(self, vuln=None, name=None, i18n_name=None, category=None, description=None, solution=None,
                   risk_level=None):
     if not vuln:
         vuln = Vulnerability(name=name, i18n_name=i18n_name, category=category, description=description,
                              solution=solution,
                              risk_level=risk_level)
     report = self.db.filter(name=vuln.name, plugin_name=self.plugin_name)
     if len(report):
         return
     report = VulnReport(vuln, plugin_name=self.plugin_name)
     self.db.add(report)
Ejemplo n.º 4
0
def parseVulRow(tableRow):
    tdElems = tableRow.find_all('td')
    strs = list(tdElems[0].strings)
    lenovoCode = clearSpecialChars(strs[0])
    description = clearSpecialChars(strs[1])

    aElems = tdElems[0].find_all('a')
    link = lenovoSupportHome + aElems[0]['href']

    firstDate = clearSpecialChars(tdElems[1].string)
    lastDate = clearSpecialChars(tdElems[2].string)

    ve = Vulnerability(lenovoCode, description, link, firstDate, lastDate)
    vulCollection[lenovoCode] = ve
Ejemplo n.º 5
0
 def start_element(self, name, attrs):
     if name == self.VULNERABILITY:
         self.vul = Vulnerability()
         self.vul.setName(attrs[self.VULNERABITITY_NAME])
     elif name == self.VULNERABILITY_DESCRIPTION:
         self.tag = self.VULNERABILITY_DESCRIPTION
     elif name == self.VULNERABILITY_SOLUTION:
         #self.tag = self.VULNERABILITY_SOLUTION
         self.vul.setSolution(attrs["text"])
     elif name == self.VULNERABILITY_REFERENCES:
         self.references = {}
     elif name == self.VULNERABILITY_REFERENCE:
         self.tag = self.VULNERABILITY_REFERENCE
     elif name == self.VULNERABILITY_REFERENCE_TITLE:
         self.tag = self.VULNERABILITY_REFERENCE_TITLE
     elif name == self.VULNERABILITY_REFERENCE_URL:
         self.tag = self.VULNERABILITY_REFERENCE_URL
Ejemplo n.º 6
0
 def setUp(self) -> None:
     self.v1 = Vulnerability()
     self.v1.set_vector("AV:A/AC:H/PR:L/UI:R/S:U/C:L/I:L/A:L")
     self.v1.set_metric("E", "P")
     self.v1.set_metric("RL", "T")
     self.v1.set_metric("RC", "X")
     self.v1.set_metric("MAC", "H")
     self.v1.set_metric("MUI", "R")
     self.v1.set_metric("MI", "N")
     # AV:A/AC:H/PR:L/UI:R/S:U/C:L/I:L/A:L/E:P/RL:T/RC:X/CR:X/IR:X/AR:X/MAV:X/MAC:H/MPR:X/MUI:R/MS:X/MC:X/MI:N/MA:X 4.3 3.9 3.1
     self.v2 = Vulnerability()
     self.v2.set_vector("AV:N/AC:H/PR:L/UI:R/S:U/C:N/I:N/A:L")
     self.v2.set_metric("RL", "U")
     self.v2.set_metric("CR", "L")
     self.v2.set_metric("IR", "L")
     self.v2.set_metric("MAV", "A")
     self.v2.set_metric("MAC", "H")
     self.v2.set_metric("MPR", "N")
     self.v2.set_metric("MUI", "R")
     self.v2.set_metric("MS", "U")
     # AV:N/AC:H/PR:L/UI:R/S:U/C:N/I:N/A:L/E:X/RL:U/RC:X/CR:L/IR:L/AR:X/MAV:A/MAC:H/MPR:N/MUI:R/MS:U/MC:X/MI:X/MA:X 2.6 2.6 2.6
     self.v3 = Vulnerability()
     self.v3.set_vector("AV:L/AC:H/PR:L/UI:N/S:U/C:L/I:L/A:H")
     self.v3.set_metric("E", "P")
     self.v3.set_metric("AR", "H")
     self.v3.set_metric("MPR", "H")
     self.v3.set_metric("MUI", "N")
     self.v3.set_metric("MS", "U")
     # AV:L/AC:H/PR:L/UI:N/S:U/C:L/I:L/A:H/E:P/RL:X/RC:X/CR:X/IR:X/AR:H/MAV:X/MAC:X/MPR:H/MUI:N/MS:U/MC:X/MI:X/MA:X 5.8 5.5 6.0
     self.v4 = Vulnerability()
     self.v4.set_vector("AV:N/AC:H/PR:N/UI:R/S:C/C:N/I:N/A:H")
     self.v4.set_metric("E", "P")
     self.v4.set_metric("RL", "U")
     self.v4.set_metric("AR", "H")
     self.v4.set_metric("MUI", "R")
     self.v4.set_metric("MS", "U")
     self.v4.set_metric("MC", "L")
     self.v4.set_metric("MI", "N")
     self.v4.set_metric("MA", "N")
     # AV:N/AC:H/PR:N/UI:R/S:C/C:N/I:N/A:H/E:P/RL:U/RC:X/CR:X/IR:X/AR:H/MAV:X/MAC:X/MPR:X/MUI:R/MS:U/MC:L/MI:N/MA:N 6.1 5.8 3.0
     self.v5 = Vulnerability()
     self.v5.set_vector("AV:L/AC:L/PR:H/UI:R/S:C/C:H/I:L/A:H")
     self.v5.set_metric("E", "P")
     self.v5.set_metric("RL", "O")
     self.v5.set_metric("IR", "M")
     self.v5.set_metric("MAV", "N")
     self.v5.set_metric("MAC", "H")
     self.v5.set_metric("MC", "L")
     self.v5.set_metric("MA", "N")
     # AV:L/AC:L/PR:H/UI:R/S:C/C:H/I:L/A:H/E:P/RL:O/RC:X/CR:X/IR:M/AR:X/MAV:N/MAC:H/MPR:X/MUI:X/MS:X/MC:L/MI:X/MA:N 7.7 6.9 3.6
     self.v6 = Vulnerability()
     self.v6.set_vector("AV:L/AC:H/PR:N/UI:R/S:U/C:N/I:H/A:H")
     self.v6.set_metric("RL", "W")
     self.v6.set_metric("RC", "R")
     self.v6.set_metric("IR", "M")
     self.v6.set_metric("MAV", "N")
     self.v6.set_metric("MAC", "H")
     self.v6.set_metric("MPR", "L")
     self.v6.set_metric("MUI", "N")
     self.v6.set_metric("MC", "L")
     self.v6.set_metric("MI", "L")
     self.v6.set_metric("MA", "L")
     # AV:L/AC:H/PR:N/UI:R/S:U/C:N/I:H/A:H/E:X/RL:W/RC:R/CR:X/IR:M/AR:X/MAV:N/MAC:H/MPR:L/MUI:N/MS:X/MC:L/MI:L/MA:L 6.3 5.9 4.7
     self.v7 = Vulnerability()
     self.v7.set_vector("AV:A/AC:L/PR:H/UI:R/S:C/C:H/I:L/A:N")
     self.v7.set_metric("RL", "U")
     self.v7.set_metric("RC", "U")
     self.v7.set_metric("MAV", "N")
     self.v7.set_metric("MUI", "N")
     self.v7.set_metric("MA", "L")
     # AV:A/AC:L/PR:H/UI:R/S:C/C:H/I:L/A:N/E:X/RL:U/RC:U/CR:X/IR:X/AR:X/MAV:N/MAC:X/MPR:X/MUI:N/MS:X/MC:X/MI:X/MA:L 6.5 6.0 7.6
     self.v8 = Vulnerability()
     self.v8.set_vector("AV:L/AC:H/PR:L/UI:N/S:U/C:H/I:H/A:H")
     self.v8.set_metric("E", "F")
     self.v8.set_metric("RL", "T")
     self.v8.set_metric("IR", "L")
     self.v8.set_metric("MAV", "N")
     self.v8.set_metric("MAC", "L")
     self.v8.set_metric("MUI", "N")
     self.v8.set_metric("MC", "L")
     self.v8.set_metric("MI", "N")
     self.v8.set_metric("MA", "L")
     # AV:L/AC:H/PR:L/UI:N/S:U/C:H/I:H/A:H/E:F/RL:T/RC:X/CR:X/IR:L/AR:X/MAV:N/MAC:L/MPR:X/MUI:N/MS:X/MC:L/MI:N/MA:L 7.0 6.6 5.1
     self.v9 = Vulnerability()
     self.v9.set_vector("AV:A/AC:L/PR:H/UI:R/S:U/C:L/I:N/A:N")
     self.v9.set_metric("E", "U")
     self.v9.set_metric("RL", "O")
     self.v9.set_metric("IR", "L")
     self.v9.set_metric("MAV", "N")
     self.v9.set_metric("MAC", "L")
     self.v9.set_metric("MUI", "R")
     self.v9.set_metric("MI", "L")
     # AV:A/AC:L/PR:H/UI:R/S:U/C:L/I:N/A:N/E:U/RL:O/RC:X/CR:X/IR:L/AR:X/MAV:N/MAC:L/MPR:X/MUI:R/MS:X/MC:X/MI:L/MA:X 2.1 1.9 2.6
     self.v10 = Vulnerability()
     self.v10.set_vector("AV:P/AC:H/PR:N/UI:R/S:C/C:H/I:H/A:N")
     self.v10.set_metric("RL", "W")
     self.v10.set_metric("IR", "L")
     self.v10.set_metric("CR", "H")
     self.v10.set_metric("MAV", "N")
     self.v10.set_metric("MAC", "H")
     self.v10.set_metric("MPR", "H")
     self.v10.set_metric("MUI", "R")
     self.v10.set_metric("MC", "L")
     self.v10.set_metric("MI", "N")
     self.v10.set_metric("MA", "N")
     # AV:P/AC:H/PR:N/UI:R/S:C/C:H/I:H/A:N/E:X/RL:W/RC:X/CR:H/IR:L/AR:X/MAV:N/MAC:H/MPR:H/MUI:R/MS:X/MC:L/MI:N/MA:N 6.7 6.5 3.4
     self.v11 = Vulnerability()
     self.v11.set_vector("AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H")
     self.v11.set_metric("E", "P")
     self.v11.set_metric("RL", "T")
     self.v11.set_metric("RC", "R")
     self.v11.set_metric("CR", "H")
     self.v11.set_metric("IR", "H")
     self.v11.set_metric("AR", "H")
     self.v11.set_metric("MAV", "A")
     self.v11.set_metric("MAC", "H")
     self.v11.set_metric("MPR", "L")
     self.v11.set_metric("MUI", "R")
     self.v11.set_metric("MS", "C")
     self.v11.set_metric("MC", "H")
     self.v11.set_metric("MI", "H")
     self.v11.set_metric("MA", "H")
Ejemplo n.º 7
0
class TestVulnerability(unittest.TestCase):
    def setUp(self) -> None:
        self.v1 = Vulnerability()
        self.v1.set_vector("AV:A/AC:H/PR:L/UI:R/S:U/C:L/I:L/A:L")
        self.v1.set_metric("E", "P")
        self.v1.set_metric("RL", "T")
        self.v1.set_metric("RC", "X")
        self.v1.set_metric("MAC", "H")
        self.v1.set_metric("MUI", "R")
        self.v1.set_metric("MI", "N")
        # AV:A/AC:H/PR:L/UI:R/S:U/C:L/I:L/A:L/E:P/RL:T/RC:X/CR:X/IR:X/AR:X/MAV:X/MAC:H/MPR:X/MUI:R/MS:X/MC:X/MI:N/MA:X 4.3 3.9 3.1
        self.v2 = Vulnerability()
        self.v2.set_vector("AV:N/AC:H/PR:L/UI:R/S:U/C:N/I:N/A:L")
        self.v2.set_metric("RL", "U")
        self.v2.set_metric("CR", "L")
        self.v2.set_metric("IR", "L")
        self.v2.set_metric("MAV", "A")
        self.v2.set_metric("MAC", "H")
        self.v2.set_metric("MPR", "N")
        self.v2.set_metric("MUI", "R")
        self.v2.set_metric("MS", "U")
        # AV:N/AC:H/PR:L/UI:R/S:U/C:N/I:N/A:L/E:X/RL:U/RC:X/CR:L/IR:L/AR:X/MAV:A/MAC:H/MPR:N/MUI:R/MS:U/MC:X/MI:X/MA:X 2.6 2.6 2.6
        self.v3 = Vulnerability()
        self.v3.set_vector("AV:L/AC:H/PR:L/UI:N/S:U/C:L/I:L/A:H")
        self.v3.set_metric("E", "P")
        self.v3.set_metric("AR", "H")
        self.v3.set_metric("MPR", "H")
        self.v3.set_metric("MUI", "N")
        self.v3.set_metric("MS", "U")
        # AV:L/AC:H/PR:L/UI:N/S:U/C:L/I:L/A:H/E:P/RL:X/RC:X/CR:X/IR:X/AR:H/MAV:X/MAC:X/MPR:H/MUI:N/MS:U/MC:X/MI:X/MA:X 5.8 5.5 6.0
        self.v4 = Vulnerability()
        self.v4.set_vector("AV:N/AC:H/PR:N/UI:R/S:C/C:N/I:N/A:H")
        self.v4.set_metric("E", "P")
        self.v4.set_metric("RL", "U")
        self.v4.set_metric("AR", "H")
        self.v4.set_metric("MUI", "R")
        self.v4.set_metric("MS", "U")
        self.v4.set_metric("MC", "L")
        self.v4.set_metric("MI", "N")
        self.v4.set_metric("MA", "N")
        # AV:N/AC:H/PR:N/UI:R/S:C/C:N/I:N/A:H/E:P/RL:U/RC:X/CR:X/IR:X/AR:H/MAV:X/MAC:X/MPR:X/MUI:R/MS:U/MC:L/MI:N/MA:N 6.1 5.8 3.0
        self.v5 = Vulnerability()
        self.v5.set_vector("AV:L/AC:L/PR:H/UI:R/S:C/C:H/I:L/A:H")
        self.v5.set_metric("E", "P")
        self.v5.set_metric("RL", "O")
        self.v5.set_metric("IR", "M")
        self.v5.set_metric("MAV", "N")
        self.v5.set_metric("MAC", "H")
        self.v5.set_metric("MC", "L")
        self.v5.set_metric("MA", "N")
        # AV:L/AC:L/PR:H/UI:R/S:C/C:H/I:L/A:H/E:P/RL:O/RC:X/CR:X/IR:M/AR:X/MAV:N/MAC:H/MPR:X/MUI:X/MS:X/MC:L/MI:X/MA:N 7.7 6.9 3.6
        self.v6 = Vulnerability()
        self.v6.set_vector("AV:L/AC:H/PR:N/UI:R/S:U/C:N/I:H/A:H")
        self.v6.set_metric("RL", "W")
        self.v6.set_metric("RC", "R")
        self.v6.set_metric("IR", "M")
        self.v6.set_metric("MAV", "N")
        self.v6.set_metric("MAC", "H")
        self.v6.set_metric("MPR", "L")
        self.v6.set_metric("MUI", "N")
        self.v6.set_metric("MC", "L")
        self.v6.set_metric("MI", "L")
        self.v6.set_metric("MA", "L")
        # AV:L/AC:H/PR:N/UI:R/S:U/C:N/I:H/A:H/E:X/RL:W/RC:R/CR:X/IR:M/AR:X/MAV:N/MAC:H/MPR:L/MUI:N/MS:X/MC:L/MI:L/MA:L 6.3 5.9 4.7
        self.v7 = Vulnerability()
        self.v7.set_vector("AV:A/AC:L/PR:H/UI:R/S:C/C:H/I:L/A:N")
        self.v7.set_metric("RL", "U")
        self.v7.set_metric("RC", "U")
        self.v7.set_metric("MAV", "N")
        self.v7.set_metric("MUI", "N")
        self.v7.set_metric("MA", "L")
        # AV:A/AC:L/PR:H/UI:R/S:C/C:H/I:L/A:N/E:X/RL:U/RC:U/CR:X/IR:X/AR:X/MAV:N/MAC:X/MPR:X/MUI:N/MS:X/MC:X/MI:X/MA:L 6.5 6.0 7.6
        self.v8 = Vulnerability()
        self.v8.set_vector("AV:L/AC:H/PR:L/UI:N/S:U/C:H/I:H/A:H")
        self.v8.set_metric("E", "F")
        self.v8.set_metric("RL", "T")
        self.v8.set_metric("IR", "L")
        self.v8.set_metric("MAV", "N")
        self.v8.set_metric("MAC", "L")
        self.v8.set_metric("MUI", "N")
        self.v8.set_metric("MC", "L")
        self.v8.set_metric("MI", "N")
        self.v8.set_metric("MA", "L")
        # AV:L/AC:H/PR:L/UI:N/S:U/C:H/I:H/A:H/E:F/RL:T/RC:X/CR:X/IR:L/AR:X/MAV:N/MAC:L/MPR:X/MUI:N/MS:X/MC:L/MI:N/MA:L 7.0 6.6 5.1
        self.v9 = Vulnerability()
        self.v9.set_vector("AV:A/AC:L/PR:H/UI:R/S:U/C:L/I:N/A:N")
        self.v9.set_metric("E", "U")
        self.v9.set_metric("RL", "O")
        self.v9.set_metric("IR", "L")
        self.v9.set_metric("MAV", "N")
        self.v9.set_metric("MAC", "L")
        self.v9.set_metric("MUI", "R")
        self.v9.set_metric("MI", "L")
        # AV:A/AC:L/PR:H/UI:R/S:U/C:L/I:N/A:N/E:U/RL:O/RC:X/CR:X/IR:L/AR:X/MAV:N/MAC:L/MPR:X/MUI:R/MS:X/MC:X/MI:L/MA:X 2.1 1.9 2.6
        self.v10 = Vulnerability()
        self.v10.set_vector("AV:P/AC:H/PR:N/UI:R/S:C/C:H/I:H/A:N")
        self.v10.set_metric("RL", "W")
        self.v10.set_metric("IR", "L")
        self.v10.set_metric("CR", "H")
        self.v10.set_metric("MAV", "N")
        self.v10.set_metric("MAC", "H")
        self.v10.set_metric("MPR", "H")
        self.v10.set_metric("MUI", "R")
        self.v10.set_metric("MC", "L")
        self.v10.set_metric("MI", "N")
        self.v10.set_metric("MA", "N")
        # AV:P/AC:H/PR:N/UI:R/S:C/C:H/I:H/A:N/E:X/RL:W/RC:X/CR:H/IR:L/AR:X/MAV:N/MAC:H/MPR:H/MUI:R/MS:X/MC:L/MI:N/MA:N 6.7 6.5 3.4
        self.v11 = Vulnerability()
        self.v11.set_vector("AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H")
        self.v11.set_metric("E", "P")
        self.v11.set_metric("RL", "T")
        self.v11.set_metric("RC", "R")
        self.v11.set_metric("CR", "H")
        self.v11.set_metric("IR", "H")
        self.v11.set_metric("AR", "H")
        self.v11.set_metric("MAV", "A")
        self.v11.set_metric("MAC", "H")
        self.v11.set_metric("MPR", "L")
        self.v11.set_metric("MUI", "R")
        self.v11.set_metric("MS", "C")
        self.v11.set_metric("MC", "H")
        self.v11.set_metric("MI", "H")
        self.v11.set_metric("MA", "H")

    def test_enter_wrong_metric_for_base_score(self):
        v_wrong = Vulnerability()
        self.assertRaises(ValueError, v_wrong.set_vector,
                          "AV:N/AC:H/PR:L/UI:R/S:U/C:L/I:X/A:L")

    def test_enter_wrong_order_for_base_score(self):
        v_wrong = Vulnerability()
        self.assertRaises(ValueError, v_wrong.set_vector,
                          "AV:A/AC:H/PR:L/UI:R/S:U/C:L/A:L")

    def test_enter_more_more_than_base_score(self):
        v_wrong = Vulnerability()
        self.assertRaises(ValueError, v_wrong.set_vector,
                          "AV:A/AC:H/PR:L/UI:R/S:U/C:L:I:X/A:L/MAV/AC")

    def test_enter_base_score_in_wrong_order(self):
        v_wrong = Vulnerability()
        self.assertRaises(ValueError, v_wrong.set_vector,
                          "AV:A/AC:H/PR:L/UI:R/S:U/I:L/C:L/A:L")

    def test_enter_wrong_metric_value(self):
        v_wrong = Vulnerability()
        self.assertRaises(ValueError, v_wrong.set_metric, "AV", "K")

    def test_enter_wrong_metric_key(self):
        v_wrong = Vulnerability()
        self.assertRaises(KeyError, v_wrong.set_metric, "AX", "N")

    def test_get_environmental_score(self):
        self.assertEqual(self.v1.get_env_score(), 3.1)
        self.assertEqual(self.v2.get_env_score(), 2.6)
        self.assertEqual(self.v3.get_env_score(), 6.0)
        self.assertEqual(self.v4.get_env_score(), 3.0)
        self.assertEqual(self.v5.get_env_score(), 3.6)
        self.assertEqual(self.v6.get_env_score(), 4.7)
        self.assertEqual(self.v7.get_env_score(), 7.6)
        self.assertEqual(self.v8.get_env_score(), 5.1)
        self.assertEqual(self.v9.get_env_score(), 2.6)
        self.assertEqual(self.v10.get_env_score(), 3.4)
        self.assertEqual(self.v11.get_env_score(), 6.7)

    def test_get_temporal_score(self):
        self.assertEqual(self.v1.get_temp_score(), 3.9)
        self.assertEqual(self.v2.get_temp_score(), 2.6)
        self.assertEqual(self.v3.get_temp_score(), 5.5)
        self.assertEqual(self.v4.get_temp_score(), 5.8)
        self.assertEqual(self.v5.get_temp_score(), 6.9)
        self.assertEqual(self.v6.get_temp_score(), 5.9)
        self.assertEqual(self.v7.get_temp_score(), 6.0)
        self.assertEqual(self.v8.get_temp_score(), 6.6)
        self.assertEqual(self.v9.get_temp_score(), 1.9)
        self.assertEqual(self.v10.get_temp_score(), 6.5)
        self.assertEqual(self.v11.get_temp_score(), 8.5)

    def test_get_base_score(self):
        self.assertEqual(self.v1.get_base_score(), 4.3)
        self.assertEqual(self.v2.get_base_score(), 2.6)
        self.assertEqual(self.v3.get_base_score(), 5.8)
        self.assertEqual(self.v4.get_base_score(), 6.1)
        self.assertEqual(self.v5.get_base_score(), 7.7)
        self.assertEqual(self.v6.get_base_score(), 6.3)
        self.assertEqual(self.v7.get_base_score(), 6.5)
        self.assertEqual(self.v8.get_base_score(), 7.0)
        self.assertEqual(self.v9.get_base_score(), 2.1)
        self.assertEqual(self.v10.get_base_score(), 6.7)
        self.assertEqual(self.v11.get_base_score(), 9.8)

    def test_total_score(self):
        self.assertEqual(self.v1.get_total_score(), 3.1)
        self.assertEqual(self.v2.get_total_score(), 2.6)
        self.assertEqual(self.v3.get_total_score(), 6.0)
        self.assertEqual(self.v4.get_total_score(), 3.0)
        self.assertEqual(self.v5.get_total_score(), 3.6)
        self.assertEqual(self.v6.get_total_score(), 4.7)
        self.assertEqual(self.v7.get_total_score(), 7.6)
        self.assertEqual(self.v8.get_total_score(), 5.1)
        self.assertEqual(self.v9.get_total_score(), 2.6)
        self.assertEqual(self.v10.get_total_score(), 3.4)
        self.assertEqual(self.v11.get_total_score(), 6.7)
Ejemplo n.º 8
0
 def test_enter_wrong_metric_key(self):
     v_wrong = Vulnerability()
     self.assertRaises(KeyError, v_wrong.set_metric, "AX", "N")
Ejemplo n.º 9
0
 def test_enter_wrong_metric_value(self):
     v_wrong = Vulnerability()
     self.assertRaises(ValueError, v_wrong.set_metric, "AV", "K")
Ejemplo n.º 10
0
 def test_enter_base_score_in_wrong_order(self):
     v_wrong = Vulnerability()
     self.assertRaises(ValueError, v_wrong.set_vector,
                       "AV:A/AC:H/PR:L/UI:R/S:U/I:L/C:L/A:L")
Ejemplo n.º 11
0
 def test_enter_more_more_than_base_score(self):
     v_wrong = Vulnerability()
     self.assertRaises(ValueError, v_wrong.set_vector,
                       "AV:A/AC:H/PR:L/UI:R/S:U/C:L:I:X/A:L/MAV/AC")
Ejemplo n.º 12
0
 def __init__(self):
     self._model = Vulnerability()
     self.username = ""
     self.password = ""
     self.msg = ""
     self.check_auth = False
Ejemplo n.º 13
0
        print(f"Host {self.ip}")
        print(f"OS fingerprint: {self.os} - {self.version}")
        if not len(self.ports):
            print(f"Ports: none")
            return
        print(f"Ports: ")
        for p in self.ports.values():
            p.print()


if __name__ == "__main__":
    print(f"### device.py example ###\n")

    d = Device("127.0.0.1", "Windows 10", "Build 1901")

    p = Port(25, "tcp")
    p.service = "smtp"
    p.software = "postfix"
    p.version = "2.13"
    v = Vulnerability()
    v.software = p.software
    v.version = p.version
    v.type = "RCE"
    v.description = "sample RCE desc"
    v.addExploit("https://cve.truc/exp1")
    v.addExploit("https://cve.truc/exp2")
    p.addVuln(v)

    d.addPort(p)

    d.print()
def populateList(root, hosts):

    reporthostnodes = root.findall('.//ReportHost')

    for reporthostnode in reporthostnodes:
        #find host info
        hostip = reporthostnode.attrib['name']
        hostos = None
        hostfqdn = None
        hostmac = None

        hosttags = reporthostnode.findall('HostProperties/tag')
        for hosttag in hosttags:
            if (hosttag.attrib['name'] == "operating-system"):
                hostos = hosttag.text
            if (hosttag.attrib['name'] == "host-fqdn"):
                hostfqdn = hosttag.text
            if (hosttag.attrib['name'] == "mac-address"):
                hostmac = hosttag.text

            host = Host(hostip, hostos, hostfqdn, hostmac)

        reportitems = reporthostnode.findall('ReportItem')

        for reportitem in reportitems:

            port = name = protocol = severity = description = cve = synopsis = solution = pub_date = None
            base_score = 0.0

            port = reportitem.attrib['port']
            name = reportitem.attrib['pluginName']
            protocol = reportitem.attrib['protocol']
            severity = reportitem.attrib['severity']
            description = reportitem.find('description').text
            synopsis = reportitem.find('synopsis').text
            solution = reportitem.find('solution').text

            cve_obj = reportitem.find('cve')
            if cve_obj is not None:
                cve = cve_obj.text

            base_score_obj = reportitem.find('cvss_base_score')
            if base_score_obj is not None:
                base_score = base_score_obj.text

            pub_date_obj = reportitem.find('vuln_publication_date')
            if pub_date_obj is not None:
                pub_date = pub_date_obj.text

            vuln = Vulnerability()
            vuln.name = name
            vuln.port = port
            vuln.protocol = protocol
            vuln.description = description
            vuln.severity = severity
            vuln.cve = cve
            vuln.base_score = base_score
            vuln.synopsis = synopsis
            vuln.solution = solution
            vuln.pub_date = pub_date

            host.addVulnerability(vuln)
        hosts.append(host)
Ejemplo n.º 15
0
class VulnerabilityXMLParser:

    VULNERABILITY = "vulnerability"
    VULNERABILITY_NAME = "name"
    VULNERABILITY_DESCRIPTION = "description"
    VULNERABILITY_SOLUTION = "solution"
    VULNERABILITY_REFERENCE = "reference"
    VULNERABILITY_REFERENCES = "references"
    VULNERABILITY_REFERENCE_TITLE = "title"
    VULNERABILITY_REFERENCE_URL = "url"

    vulnerabilities = []
    vul = None
    references = {}
    title = ""
    url = ""
    tag = ""

    def __init__(self):
        self._parser = expat.ParserCreate()
        self._parser.StartElementHandler = self.start_element
        self._parser.EndElementHandler = self.end_element
        self._parser.CharacterDataHandler = self.char_data

    def parse(self, fileName):
        f = None
        try:
            f = open(fileName)
            content = f.read()
            self.feed(content)
        finally:
            if f is not None:
                f.close()

    def feed(self, data):
        self._parser.Parse(data, 0)

    def close(self):
        self._parser.Parse("", 1)
        del self._parser

    def start_element(self, name, attrs):
        if name == self.VULNERABILITY:
            self.vul = Vulnerability()
            self.vul.setName(attrs[self.VULNERABILITY_NAME])
        elif name == self.VULNERABILITY_DESCRIPTION:
            self.tag = self.VULNERABILITY_DESCRIPTION
        elif name == self.VULNERABILITY_SOLUTION:
            #self.tag = self.VULNERABILITY_SOLUTION
            self.vul.setSolution(attrs["text"])
        elif name == self.VULNERABILITY_REFERENCES:
            self.references = {}
        elif name == self.VULNERABILITY_REFERENCE:
            self.tag = self.VULNERABILITY_REFERENCE
        elif name == self.VULNERABILITY_REFERENCE_TITLE:
            self.tag = self.VULNERABILITY_REFERENCE_TITLE
        elif name == self.VULNERABILITY_REFERENCE_URL:
            self.tag = self.VULNERABILITY_REFERENCE_URL

    def end_element(self, name):
        if name == self.VULNERABILITY:
            self.vulnerabilities.append(self.vul)
        elif name == self.VULNERABILITY_REFERENCE:
            self.references[self.title] = self.url
        elif name == self.VULNERABILITY_REFERENCES:
            self.vul.setReferences(self.references)

    def char_data(self, data):
        if self.tag == self.VULNERABILITY_DESCRIPTION:
            self.vul.setDescription(data)
#    elif self.tag==self.VULNERABILITY_SOLUTION:
#      self.vul.setSolution(data)
        elif self.tag == self.VULNERABILITY_REFERENCE_TITLE:
            self.title = data
        elif self.tag == self.VULNERABILITY_REFERENCE_URL:
            self.url = data
        self.tag = ""

    def getVulnerabilities(self):
        return self.vulnerabilities
Ejemplo n.º 16
0
class VulnerabilityXMLParser:
    VULNERABILITY = "vulnerability"
    VULNERABITITY_NAME = "name"
    VULNERABILITY_DESCRIPTION = "description"
    VULNERABILITY_SOLUTION = "solution"
    VULNERABILITY_REFERENCE = "reference"
    VULNERABILITY_REFERENCES = "references"
    VULNERABILITY_REFERENCE_TITLE = "title"
    VULNERABILITY_REFERENCE_URL = "url"

    vulnerabilities = []
    vul = None
    references = {}
    title = ""
    url = ""
    tag = ""

    def __init__(self):
        self._parser = expat.ParserCreate()
        self._parser.StartElementHandler = self.start_element
        self._parser.EndElementHandler = self.end_element
        self._parser.CharacterDataHandler = self.char_data

    def parse(self, fileName):
        f = None
        try:
            f = open(fileName)
            content = f.read()
            self.feed(content)
        finally:
            if f != None:
                f.close()

    def feed(self, data):
        self._parser.Parse(data, 0)

    def close(self):
        self._parser.Parse("", 1)
        del self._parser

    def start_element(self, name, attrs):
        if name == self.VULNERABILITY:
            self.vul = Vulnerability()
            self.vul.setName(attrs[self.VULNERABITITY_NAME])
        elif name == self.VULNERABILITY_DESCRIPTION:
            self.tag = self.VULNERABILITY_DESCRIPTION
        elif name == self.VULNERABILITY_SOLUTION:
            #self.tag = self.VULNERABILITY_SOLUTION
            self.vul.setSolution(attrs["text"])
        elif name == self.VULNERABILITY_REFERENCES:
            self.references = {}
        elif name == self.VULNERABILITY_REFERENCE:
            self.tag = self.VULNERABILITY_REFERENCE
        elif name == self.VULNERABILITY_REFERENCE_TITLE:
            self.tag = self.VULNERABILITY_REFERENCE_TITLE
        elif name == self.VULNERABILITY_REFERENCE_URL:
            self.tag = self.VULNERABILITY_REFERENCE_URL

    def end_element(self, name):
        if name == self.VULNERABILITY:
            self.vulnerabilities.append(self.vul)
        elif name == self.VULNERABILITY_REFERENCE:
            self.references[self.title] = self.url
        elif name == self.VULNERABILITY_REFERENCES:
            self.vul.setReferences(self.references)

    def char_data(self, data):
        if self.tag == self.VULNERABILITY_DESCRIPTION:
            self.vul.setDescription(data)
        #    elif self.tag==self.VULNERABILITY_SOLUTION:
        #      self.vul.setSolution(data)
        elif self.tag == self.VULNERABILITY_REFERENCE_TITLE:
            self.title = data
        elif self.tag == self.VULNERABILITY_REFERENCE_URL:
            self.url = data
        self.tag = ""

    def getVulnerabilities(self):
        return self.vulnerabilities
Ejemplo n.º 17
0
 def test_enter_wrong_metric_for_base_score(self):
     v_wrong = Vulnerability()
     self.assertRaises(ValueError, v_wrong.set_vector,
                       "AV:N/AC:H/PR:L/UI:R/S:U/C:L/I:X/A:L")
Ejemplo n.º 18
0
class Controller:
    """
    Controller of the Model View Controller

    ...

    Attributes
    ----------
    model: Vulnerability
        a variable to save all information about the Vulnerability

    username: str
        username is required for login

    password: str
        password is required for login

    msg: str
        msg is required for the login View

    Methods
    -------
    says(sound=None)
        Prints the animals name and what sound it makes

    gui_loop(self)
        the main loop of the calculator application, the root is a Tk Window

    start(self)
        authentication that is required to get access to the program

    check_auth_gui(self)
        is checking if a auth.json (contains userdata) is in the template folder. if true
            the programm will start with the login window otherwise with the sign up window

    set_user(self, user):
        setting the current user

    set_password(self, password):
        setting the current password

    set_msg(self, msg):
        setting the message that is required 

    print_json(self)
        creates an .json file. the name of the file is the same as for model.get_name().    
            the file is saved inside the output folder.

    print_txt(self)
        creates an .json file. the name of the file is the same as for model.get_name().    
            the file is saved inside the output folder.

    get_vector(self) -> str
        return the CVSS 3.1 Vector

    set_metric(self, base_string, value=None)
        is changing the values of the vector. if the value is None (default) the  program is 
            got the base score from the view and is setting it for the model. otherwise
            its just a single metric which sets the value for the base_string 

    get_metric(self, env): -> str
        returns the value of the selected metric BASE, ENV, TEMP

    get_base_score(self):
        returns the base_score

    get_env_score(self):
        return the environmental score

    get_temp_score(self):
        return the temp  score

    set_asset(self):
        set the name of the asset

    set_vul(self):
        set the name  of the vulnerability

    get_user(self):
        get the name of the user

    get_password(self):
        get the name of the password
    """
    def __init__(self):
        self._model = Vulnerability()
        self.username = ""
        self.password = ""
        self.msg = ""
        self.check_auth = False

    def gui_loop(self):
        root = Tk()
        #get_credentials(root, self)
        root.resizable(False, False)
        root.title('cvsslator')
        self._view = CreationView(root, self)
        root.mainloop()

    def start(self):
        self.msg = "LOGIN"
        self.check_auth_gui()

    def check_auth_gui(self):

        if os.path.isfile('../templates/auth.json'):

            GetCredentials(self, self.msg)

            if self.username == "" and self.password == "":
                return False
            else:
                hash_object = hashlib.sha256(self.password.encode('ascii'))
                hash_password = str(hash_object.hexdigest())

                with open('../templates/auth.json') as auth:
                    credentials = json.load(auth)

                if self.username == credentials[
                        'user'] and hash_password == credentials['password']:
                    self.username = ""
                    self.password = ""
                    self.gui_loop()
                    return True

                else:
                    self.username = ""
                    self.password = ""
                    self.msg = "Unknown Combination!"
                    self.check_auth_gui()
                    return False
        else:

            CreateUser(self)

            if self.check_auth:

                hash_object = hashlib.sha256(self.password.encode('ascii'))
                hash_password = str(hash_object.hexdigest())

                credentials = {
                    'user': self.username,
                    'password': hash_password
                }

                with open('../templates/auth.json', 'w') as auth:
                    json.dump(credentials, auth)

                self.username = ""
                self.password = ""

                self.gui_loop()
                return "set"
            else:
                return False

    def set_user(self, username):
        self.username = username

    def set_password(self, password):
        self.password = password

    def set_msg(self, msg):
        self.msg = msg

    def print_json(self):
        with open('../templates/template_output_json.json') as out:
            try:
                JSON_OUT = json.load(out)
            except json.decoder.JSONDecodeError:
                return False

        JSON_OUT['asset_name'] = self._model.get_asset_name()
        JSON_OUT['vuln_name'] = self._model.get_vulnerability_name()
        JSON_OUT['vektor'] = self._model.get_vector()
        JSON_OUT['base_score'] = self._model.get_base_score()
        JSON_OUT['temp_score'] = self._model.get_temp_score()
        JSON_OUT['env_score'] = self._model.get_env_score()
        JSON_OUT['total_score'] = self._model.get_total_score()

        if self._model.get_asset_name() != "N/D":
            create_name = '../output/' + self._model.get_asset_name(
            ) + '_output.json'
        else:
            create_name = "../output/unknown_output.json"

        with open(create_name, 'w') as out2:
            out2.write(json.dumps(JSON_OUT, indent=4))

        return True

    def print_txt(self):
        with open('../templates/template_output_txt.txt', 'r') as file:
            TXT_OUT = file.read()
            TXT_OUT = TXT_OUT.replace('$asset_name$',
                                      self._model.get_asset_name())
            TXT_OUT = TXT_OUT.replace('$vul_name$',
                                      self._model.get_vulnerability_name())
            TXT_OUT = TXT_OUT.replace('$vektor$',
                                      str(self._model.get_vector()))
            TXT_OUT = TXT_OUT.replace('$base_score$',
                                      str(self._model.get_base_score()))
            TXT_OUT = TXT_OUT.replace('$temp_score$',
                                      str(self._model.get_temp_score()))
            TXT_OUT = TXT_OUT.replace('$env_score$',
                                      str(self._model.get_env_score()))
            TXT_OUT = TXT_OUT.replace('$total_score$',
                                      str(self._model.get_total_score()))

            if self._model.get_asset_name() != "N/D":
                create_name = '../output/' + self._model.get_asset_name(
                ) + '_output.txt'
            else:
                create_name = "../output/unknown_output.txt"

            with open(create_name, 'w') as output:
                output.write(TXT_OUT)

    def get_vector(self):
        return self._model.get_vector()

    def set_metric(self, base_string, value=None):
        if value == None:
            self._model.set_vector(base_string)
        else:
            self._model.set_metric(base_string, value)

    def get_metric(self, type):
        if type == "BASE":
            return self._model.get_base_vector()
        elif type == "TEMP":
            return self._model.get_temp_vector()
        elif type == "ENV":
            return self._model.get_env_vector()
        else:
            pass

    def get_base_score(self):
        return self._model.get_base_score()

    def get_env_score(self):
        return self._model.get_env_score()

    def get_temp_score(self):
        return self._model.get_temp_score()

    def set_vul(self, value):
        if value == "":
            self._model.set_asset_name("N/D")
        else:
            self._model.set_vulnerability_name(value)

    def set_asset(self, value):
        if value == "":
            self._model.set_asset_name("N/D")
        else:
            self._model.set_asset_name(value)

    def get_user(self):
        return self.username

    def get_password(self):
        return self.password