Beispiel #1
0
 def test_INP08(self):
     process1 = Process("Process1")
     lambda1 = Lambda("Lambda1")
     web = Server("Web Server")
     process1.validatesInput = False
     process1.sanitizesInput = False
     lambda1.validatesInput = False
     lambda1.sanitizesInput = False
     web.validatesInput = False
     web.sanitizesInput = False
     threat = threats["INP08"]
     self.assertTrue(threat.apply(process1))
     self.assertTrue(threat.apply(lambda1))
     self.assertTrue(threat.apply(web))
Beispiel #2
0
 def test_CR01(self):
     user = Actor("User")
     web = Server("Web Server")
     web.protocol = 'HTTP'
     web.usesVPN = False
     web.usesSessionTokens = True
     user_to_web = Dataflow(user, web, "User enters comments (*)")
     user_to_web.protocol = 'HTTP'
     user_to_web.usesVPN = False
     user_to_web.usesSessionTokens = True
     ThreatObj = Threat(
         next(item for item in threats_json if item["SID"] == "CR01"))
     self.assertTrue(ThreatObj.apply(web))
     self.assertTrue(ThreatObj.apply(user_to_web))
Beispiel #3
0
 def test_AC01(self):
     web = Server("Web Server")
     process1 = Process("Process1")
     db = Datastore("DB")
     web.hasAccessControl = False
     web.authorizesSource = True
     process1.hasAccessControl = False
     process1.authorizesSource = False
     db.hasAccessControl = False
     db.authorizesSource = False
     ThreatObj = Threat(next(item for item in threats_json if item["SID"] == "AC01"))
     self.assertTrue(ThreatObj.apply(process1))
     self.assertTrue(ThreatObj.apply(web))
     self.assertTrue(ThreatObj.apply(db))
Beispiel #4
0
 def test_DO02(self):
     process1 = Process("Process1")
     lambda1 = Lambda("Lambda1")
     web = Server("Web Server")
     db = Datastore("DB")
     process1.handlesResourceConsumption = False
     lambda1.handlesResourceConsumption = False
     web.handlesResourceConsumption = False
     db.handlesResourceConsumption = False
     threat = threats["DO02"]
     self.assertTrue(threat.apply(process1))
     self.assertTrue(threat.apply(lambda1))
     self.assertTrue(threat.apply(web))
     self.assertTrue(threat.apply(db))
Beispiel #5
0
 def test_INP08(self):
     process1 = Process("Process1")
     lambda1 = Lambda("Lambda1")
     web = Server("Web Server")
     process1.validatesInput = False
     process1.sanitizesInput = False
     lambda1.validatesInput = False
     lambda1.sanitizesInput = False
     web.validatesInput = False
     web.sanitizesInput = False
     ThreatObj = Threat(next(item for item in threats_json if item["SID"] == "INP08"))
     self.assertTrue(ThreatObj.apply(process1))
     self.assertTrue(ThreatObj.apply(lambda1))
     self.assertTrue(ThreatObj.apply(web))
Beispiel #6
0
 def test_DO02(self):
     process1 = Process("Process1")
     lambda1 = Lambda("Lambda1")
     web = Server("Web Server")
     db = Datastore("DB")
     process1.handlesResourceConsumption = False
     lambda1.handlesResourceConsumption = False
     web.handlesResourceConsumption = False
     db.handlesResourceConsumption = False
     ThreatObj = Threat(next(item for item in threats_json if item["SID"] == "DO02"))
     self.assertTrue(ThreatObj.apply(process1))
     self.assertTrue(ThreatObj.apply(lambda1))
     self.assertTrue(ThreatObj.apply(web))
     self.assertTrue(ThreatObj.apply(db))
Beispiel #7
0
 def test_AC01(self):
     web = Server("Web Server")
     process1 = Process("Process1")
     db = Datastore("DB")
     web.hasAccessControl = False
     web.authorizesSource = True
     process1.hasAccessControl = False
     process1.authorizesSource = False
     db.hasAccessControl = False
     db.authorizesSource = False
     threat = threats["AC01"]
     self.assertTrue(threat.apply(process1))
     self.assertTrue(threat.apply(web))
     self.assertTrue(threat.apply(db))
Beispiel #8
0
 def test_CR02(self):
     user = Actor("User")
     web = Server("Web Server")
     web.protocol = "HTTP"
     web.controls.sanitizesInput = False
     web.controls.validatesInput = False
     web.usesSessionTokens = True
     user_to_web = Dataflow(user, web, "User enters comments (*)")
     user_to_web.protocol = "HTTP"
     user_to_web.controls.sanitizesInput = False
     user_to_web.controls.validatesInput = False
     user_to_web.usesSessionTokens = True
     threat = threats["CR02"]
     self.assertTrue(threat.apply(web))
     self.assertTrue(threat.apply(user_to_web))
Beispiel #9
0
    def test_multilevel_dfd(self):
        random.seed(0)
        dir_path = os.path.dirname(os.path.realpath(__file__))
        install_path = os.path.dirname(os.path.realpath(pytm.__file__))

        with open(os.path.join(dir_path, "dfd_level0.txt")) as x:
            level_0 = x.read().strip().replace("INSTALL_PATH", os.path.dirname(install_path))
        with open(os.path.join(dir_path, "dfd_level1.txt")) as x:
            level_1 = x.read().strip().replace("INSTALL_PATH", os.path.dirname(install_path))

        TM.reset()
        tm = TM("my test tm", description="aaa")
        tm.isOrdered = False
        internet = Boundary("Internet")
        server_db = Boundary("Server/DB")
        user = Actor("User", inBoundary=internet, levels=0)
        web = Server("Web Server")
        db = Datastore("SQL Database", inBoundary=server_db)
        Dataflow(user, web, "User enters comments (*)", note="bbb")
        Dataflow(web, db, "Insert query with comments", note="ccc")
        Dataflow(db, web, "Retrieve comments")
        Dataflow(web, user, "Show comments (*)")

        self.assertTrue(tm.check())
        output = tm.dfd(levels={0})
        with open(os.path.join(dir_path, "0.txt"), "w") as x:
            x.write(output)
        self.assertEqual(output, level_0)

        TM.reset()
        tm = TM("my test tm", description="aaa")
        tm.isOrdered = False
        internet = Boundary("Internet")
        server_db = Boundary("Server/DB")
        user = Actor("User", inBoundary=internet, levels=1)
        web = Server("Web Server")
        db = Datastore("SQL Database", inBoundary=server_db)
        Dataflow(user, web, "User enters comments (*)", note="bbb")
        Dataflow(web, db, "Insert query with comments", note="ccc")
        Dataflow(db, web, "Retrieve comments")
        Dataflow(web, user, "Show comments (*)")

        self.assertTrue(tm.check())
        output = tm.dfd(levels={1})
        with open(os.path.join(dir_path, "1.txt"), "w") as x:
            x.write(output)
        self.maxDiff = None
        self.assertEqual(output, level_1)
Beispiel #10
0
 def test_SC04(self):
     web = Server("Web Server")
     web.controls.sanitizesInput = False
     web.controls.validatesInput = False
     web.controls.encodesOutput = False
     threat = threats["SC04"]
     self.assertTrue(threat.apply(web))
Beispiel #11
0
 def test_SC03(self):
     web = Server("Web Server")
     web.controls.validatesInput = False
     web.controls.sanitizesInput = False
     web.controls.hasAccessControl = False
     threat = threats["SC03"]
     self.assertTrue(threat.apply(web))
Beispiel #12
0
 def test_DO03(self):
     user = Actor("User")
     web = Server("Web Server")
     user_to_web = Dataflow(user, web, "User enters comments (*)")
     user_to_web.data = "XML"
     threat = threats["DO03"]
     self.assertTrue(threat.apply(user_to_web))
Beispiel #13
0
 def test_DO03(self):
     user = Actor("User")
     web = Server("Web Server")  
     user_to_web = Dataflow(user, web, "User enters comments (*)")
     user_to_web.data = 'XML' 
     ThreatObj = Threat(next(item for item in threats_json if item["SID"] == "DO03"))
     self.assertTrue(ThreatObj.apply(user_to_web))
Beispiel #14
0
    def test_dfd_duplicates_raise(self):
        random.seed(0)

        TM.reset()
        tm = TM("my test tm", description="aaa", onDuplicates=Action.RESTRICT)
        internet = Boundary("Internet")
        server_db = Boundary("Server/DB")
        user = Actor("User", inBoundary=internet)
        web = Server("Web Server")
        db = Datastore("SQL Database", inBoundary=server_db)

        Dataflow(user, web, "User enters comments (*)")
        Dataflow(user, web, "User views comments")
        Dataflow(web, db, "Insert query with comments")
        Dataflow(web, db, "Select query")
        Dataflow(db, web, "Retrieve comments")
        Dataflow(web, user, "Show comments (*)")

        e = re.escape(
            "Duplicate Dataflow found between Actor(User) "
            "and Server(Web Server): Dataflow(User enters comments (*)) "
            "is same as Dataflow(User views comments)"
        )
        with self.assertRaisesRegex(ValueError, e):
            tm.check()
Beispiel #15
0
    def test_dfd(self):
        dir_path = os.path.dirname(os.path.realpath(__file__))
        with open(os.path.join(dir_path, 'dfd.dot')) as x:
            expected = x.read().strip()

        random.seed(0)

        TM.reset()
        tm = TM("my test tm", description="aaa")
        internet = Boundary("Internet")
        server_db = Boundary("Server/DB")
        user = Actor("User", inBoundary=internet)
        web = Server("Web Server")
        db = Datastore("SQL Database", inBoundary=server_db)

        Dataflow(user, web, "User enters comments (*)")
        Dataflow(web, db, "Insert query with comments")
        Dataflow(db, web, "Retrieve comments")
        Dataflow(web, user, "Show comments (*)")

        tm.check()
        with captured_output() as (out, err):
            tm.dfd()

        output = out.getvalue().strip()
        self.maxDiff = None
        self.assertEqual(output, expected)
Beispiel #16
0
    def test_seq_unused(self):
        random.seed(0)
        dir_path = os.path.dirname(os.path.realpath(__file__))
        with open(os.path.join(dir_path, "seq_unused.plantuml")) as x:
            expected = x.read().strip()

        TM.reset()
        tm = TM("my test tm", description="aaa", ignoreUnused=True)
        internet = Boundary("Internet")
        server_db = Boundary("Server/DB")
        user = Actor("User", inBoundary=internet)
        web = Server("Web Server")
        db = Datastore("SQL Database", inBoundary=server_db)
        Lambda("Unused Lambda")

        Dataflow(user, web, "User enters comments (*)", note="bbb")
        Dataflow(web, db, "Insert query with comments", note="ccc")
        Dataflow(db, web, "Retrieve comments")
        Dataflow(web, user, "Show comments (*)")

        self.assertTrue(tm.check())
        output = tm.seq()

        self.maxDiff = None
        self.assertEqual(output, expected)
Beispiel #17
0
    def test_resolve(self):
        random.seed(0)

        TM.reset()
        tm = TM("my test tm", description="aaa")
        internet = Boundary("Internet")
        server_db = Boundary("Server/DB")
        user = Actor("User", inBoundary=internet, inScope=False)
        web = Server("Web Server")
        db = Datastore("SQL Database", inBoundary=server_db)

        req = Dataflow(user, web, "User enters comments (*)")
        query = Dataflow(web, db, "Insert query with comments")
        results = Dataflow(db, web, "Retrieve comments")
        resp = Dataflow(web, user, "Show comments (*)")

        TM._BagOfThreats = [
            Threat(SID=klass, target=klass)
            for klass in ["Actor", "Server", "Datastore", "Dataflow"]
        ]
        tm.resolve()

        self.maxDiff = None
        self.assertListEqual([f.id for f in tm.findings], [
            'Server', 'Datastore', 'Dataflow', 'Dataflow', 'Dataflow',
            'Dataflow'
        ])
        self.assertListEqual([f.id for f in user.findings], [])
        self.assertListEqual([f.id for f in web.findings], ["Server"])
        self.assertListEqual([f.id for f in db.findings], ["Datastore"])
        self.assertListEqual([f.id for f in req.findings], ["Dataflow"])
        self.assertListEqual([f.id for f in query.findings], ["Dataflow"])
        self.assertListEqual([f.id for f in results.findings], ["Dataflow"])
        self.assertListEqual([f.id for f in resp.findings], ["Dataflow"])
Beispiel #18
0
    def test_report(self):
        random.seed(0)
        dir_path = os.path.dirname(os.path.realpath(__file__))
        with open(os.path.join(dir_path, "output.md")) as x:
            expected = x.read().strip()

        TM.reset()
        tm = TM("my test tm",
                description="aaa",
                threatsFile="pytm/threatlib/threats.json")
        tm.isOrdered = True
        internet = Boundary("Internet")
        server_db = Boundary("Server/DB")
        user = Actor("User", inBoundary=internet)
        web = Server("Web Server")
        func = Lambda("Lambda func")
        worker = Process("Task queue worker")
        db = Datastore("SQL Database", inBoundary=server_db)

        Dataflow(user,
                 web,
                 "User enters comments (*)",
                 note="bbb",
                 data="auth cookie")
        Dataflow(web, db, "Insert query with comments", note="ccc")
        Dataflow(web, func, "Call func")
        Dataflow(db, web, "Retrieve comments")
        Dataflow(web, user, "Show comments (*)")
        Dataflow(worker, db, "Query for tasks")

        self.assertTrue(tm.check())
        output = tm.report("docs/template.md")

        self.maxDiff = None
        self.assertEqual(output.strip(), expected.strip())
Beispiel #19
0
 def test_AC04(self):
     user = Actor("User")
     web = Server("Web Server")  
     user_to_web = Dataflow(user, web, "User enters comments (*)")
     user_to_web.data = 'XML' 
     user_to_web.authorizesSource = False
     ThreatObj = Threat(next(item for item in threats_json if item["SID"] == "AC04"))
     self.assertTrue(ThreatObj.apply(user_to_web))
Beispiel #20
0
 def test_DR01(self):
     web = Server("Web Server")
     db = Datastore("Database")
     insert = Dataflow(web, db, "Insert query")
     insert.data = Data("ssn", isPII=True, isStored=True)
     insert.isEncrypted = False
     threat = threats["DR01"]
     self.assertTrue(threat.apply(insert))
Beispiel #21
0
 def test_CR08(self):
     user = Actor("User")
     web = Server("Web Server")
     user_to_web = Dataflow(user, web, "User enters comments (*)")
     user_to_web.protocol = "HTTP"
     user_to_web.usesLatestTLSversion = False
     threat = threats["CR08"]
     self.assertTrue(threat.apply(user_to_web))
Beispiel #22
0
 def test_CR07(self):
     user = Actor("User")
     web = Server("Web Server")
     user_to_web = Dataflow(user, web, "User enters comments (*)")
     user_to_web.protocol = "HTTP"
     user_to_web.data = "XML"
     threat = threats["CR07"]
     self.assertTrue(threat.apply(user_to_web))
Beispiel #23
0
 def test_DE01(self):
     user = Actor("User")
     web = Server("Web Server")  
     user_to_web = Dataflow(user, web, "User enters comments (*)")
     user_to_web.protocol = 'HTTP'
     user_to_web.isEncrypted = False
     ThreatObj = Threat(next(item for item in threats_json if item["SID"] == "DE01")) 
     self.assertTrue(ThreatObj.apply(user_to_web))
Beispiel #24
0
 def test_AC04(self):
     user = Actor("User")
     web = Server("Web Server")
     user_to_web = Dataflow(user, web, "User enters comments (*)")
     user_to_web.data = "XML"
     user_to_web.authorizesSource = False
     threat = threats["AC04"]
     self.assertTrue(threat.apply(user_to_web))
Beispiel #25
0
 def test_DO04(self):
     user = Actor("User")
     web = Server("Web Server")
     user_to_web = Dataflow(user, web, "User enters comments (*)")
     user_to_web.data = "XML"
     user_to_web.handlesResources = False
     threat = threats["DO04"]
     self.assertTrue(threat.apply(user_to_web))
Beispiel #26
0
 def test_DE01(self):
     user = Actor("User")
     web = Server("Web Server")
     user_to_web = Dataflow(user, web, "User enters comments (*)")
     user_to_web.protocol = "HTTP"
     user_to_web.isEncrypted = False
     threat = threats["DE01"]
     self.assertTrue(threat.apply(user_to_web))
Beispiel #27
0
 def test_AC05(self):
     process1 = Process("Process1")
     web = Server("Web Server")
     process1.authenticatesDestination = False
     proc_to_web = Dataflow(process1, web, "Process calls a web API")
     proc_to_web.protocol = "HTTPS"
     proc_to_web.isEncrypted = True
     threat = threats["AC05"]
     self.assertTrue(threat.apply(proc_to_web))
Beispiel #28
0
 def test_AC04(self):
     user = Actor("User")
     web = Server("Web Server")
     user_to_web = Dataflow(user, web, "User enters comments (*)")
     xml = Data(name="user to web data", description="textual", format="XML")
     user_to_web.data = xml
     user_to_web.authorizesSource = False
     threat = threats["AC04"]
     self.assertTrue(threat.apply(user_to_web))
Beispiel #29
0
 def test_DO03(self):
     user = Actor("User")
     web = Server("Web Server")
     user_to_web = Dataflow(user, web, "User enters comments (*)")
     user_to_web.protocol = "HTTP"
     xml = Data(name="user to web data", description="textual", format="XML")
     user_to_web.data = xml
     threat = threats["DO03"]
     self.assertTrue(threat.apply(user_to_web))
Beispiel #30
0
 def test_CR08(self):
     user = Actor("User")
     web = Server("Web Server")
     user_to_web = Dataflow(user, web, "User enters comments (*)")
     user_to_web.protocol = 'HTTP'
     user_to_web.usesLatestTLSversion = False
     ThreatObj = Threat(
         next(item for item in threats_json if item["SID"] == "CR08"))
     self.assertTrue(ThreatObj.apply(user_to_web))