Exemple #1
0
 def doprint_generic(self, obj, param1 = None):
     if isinstance(obj, LeakCounter):
         pass
     elif isinstance(obj, CallHistory):
         if obj.ctxt is not None:
             self.doprint_line(Type.FUNC_ENTRY, obj.ctxt.caller, [obj.ctxt.callee])
         if len(obj.dataleaks) > 0:
             for leak in sorted_keys(obj.dataleaks):
                 leak.doprint(self)
         if len(obj.cfleaks) > 0:
             for leak in sorted_keys(obj.cfleaks):
                 leak.doprint(self)
         for k in sorted_keys(obj.children):
             obj.children[k].doprint(self, param1)
         if obj.ctxt is not None:
             self.doprint_line(Type.FUNC_EXIT)
     elif isinstance(obj, CFLeak):
         self.doprint_line(Type.CFLEAK, obj.ip, obj.get_mergepoint())
     elif isinstance(obj, DataLeak):
         self.doprint_line(Type.DLEAK, obj.ip)
     else:
         debug(0, "Unknown instance %s", (obj.__class__))
         assert(False)
Exemple #2
0
 def doprint_generic(self, obj, param1=False):
     if isinstance(obj, LeakCounter):
         self.startNode("LeakStats")
         self.startNode("Differences")
         self.doprint_summary("cflow", obj.cflow_diff_total)
         self.doprint_summary("cflow-drop", obj.cflow_diff_total_dropped)
         self.doprint_summary("cflow-notest", obj.cflow_diff_total_untested)
         self.doprint_summary("data", obj.data_diff_total)
         self.doprint_summary("data-drop", obj.data_diff_total_dropped)
         self.doprint_summary("data-notest", obj.data_diff_total_untested)
         self.endNode("Differences")
         self.startNode("Leaks")
         self.startNode("Generic")
         self.doprint_summary("cflow", obj.cflow_leaks_generic)
         self.doprint_summary("data", obj.data_leaks_generic)
         self.endNode("Generic")
         combinedset = set(obj.cflow_leaks_specific.keys()).union(
             set(obj.data_leaks_specific.keys()))
         if len(combinedset) == 0:
             self.startNode("Specific")
             self.doprint_summary("cflow", 0)
             self.doprint_summary("data", 0)
             self.endNode("Specific")
         else:
             for sp in combinedset:
                 self.startNode("Specific")
                 self.doprint_line("leakage-model: %s" % str(sp))
                 if sp in obj.cflow_leaks_specific:
                     self.doprint_summary("cflow",
                                          obj.cflow_leaks_specific[sp])
                 else:
                     self.doprint_summary("cflow", 0)
                 if sp in obj.data_leaks_specific:
                     self.doprint_summary("data",
                                          obj.data_leaks_specific[sp])
                 else:
                     self.doprint_summary("data", 0)
                 self.endNode("Specific")
         self.endNode("Leaks")
         self.endNode("LeakStats")
     elif isinstance(obj, CallHistory):
         if obj.ctxt is not None:
             self.startNode(CONTEXT)
             self.doprint("CALL", obj.ctxt.caller, None)
             self.doprint("TO", obj.ctxt.callee, None)
         if param1:
             if len(obj.dataleaks) > 0:
                 self.startNode(DATALEAKS)
                 for leak in sorted_keys(obj.dataleaks):
                     leak.doprint(self)
                 self.endNode(DATALEAKS)
             if len(obj.cfleaks) > 0:
                 self.startNode(CFLEAKS)
                 for leak in sorted_keys(obj.cfleaks):
                     leak.doprint(self)
                 self.endNode(CFLEAKS)
         for k in sorted_keys(obj.children):
             obj.children[k].doprint(self, param1)
         if obj.ctxt is not None:
             self.endNode(CONTEXT)
     elif isinstance(obj, CFLeak):
         self.startNode(CFLEAK)
         self.doprint("", obj.ip, obj.entries if param1 else None)
         self.doprint_generic(obj.status)
         self.endNode(CFLEAK)
     elif isinstance(obj, DataLeak):
         self.startNode(DATALEAK)
         self.doprint("", obj.ip, obj.entries if param1 else None)
         self.doprint_generic(obj.status)
         if param1:
             keys = sorted_keys(obj.entries)
             if len(keys) > 0:
                 self.startNode("MIN")
                 self.doprint("", obj.entries[keys[0]].addr, None)
                 self.endNode("MIN")
                 if len(keys) >= 2:
                     self.startNode("MAX")
                     self.doprint("", obj.entries[keys[-1]].addr, None)
                     self.endNode("MAX")
         self.endNode(DATALEAK)
     elif isinstance(obj, CFLeakEntry):
         self.doprint_line(obj.__str__())
     elif isinstance(obj, DataLeakEntry):
         self.doprint_line(obj.__str__())
     elif isinstance(obj, LeakStatus):
         if len(obj.nsleak) > 0 or len(obj.spleak) > 0:
             self.startNode("result " + str(obj))
             for n in sorted(list(obj.nsleak)):
                 self.startEndNode("generic", str(n))
             for n in sorted(list(obj.spleak)):
                 self.startEndNode("specific", str(n))
             self.endNode("result")
         else:
             self.startEndNode("result", str(obj))
     elif isinstance(obj, LibHierarchy):
         self.startNode("LibHierarchy")
         for k in sorted_keys(obj.entries):
             obj.entries[k].doprint(self, param1)
         self.endNode("LibHierarchy")
     elif isinstance(obj, Library):
         self.startNode("Lib")
         self.doprint_line(obj.__str__())
         for k in sorted_keys(obj.entries):
             obj.entries[k].doprint(self, param1)
         LeakCounter.count(obj).doprint(self)
         self.endNode("Lib")
     elif isinstance(obj, FunctionLeak):
         self.startNode("Function")
         self.doprint_line(obj.__str__())
         if param1:
             if len(obj.dataleaks) > 0:
                 self.startNode(DATALEAKS)
                 for leak in sorted_keys(obj.dataleaks):
                     leak.doprint(self)
                 self.endNode(DATALEAKS)
             if len(obj.cfleaks) > 0:
                 self.startNode(CFLEAKS)
                 for leak in sorted_keys(obj.cfleaks):
                     leak.doprint(self)
                 self.endNode(CFLEAKS)
         self.endNode("Function")
     else:
         debug(0, "Unknown instance %s", (obj.__class__))
         debug(0, str(isinstance(obj, CallHistory)))
         debug(0, str(type(obj) is CallHistory))
         debug(0, str(id(type(obj))))
         debug(0, str(id(CallHistory)))
         assert (False)
Exemple #3
0
    def doprint_generic(self, obj, param1=False):
        if isinstance(obj, LeakCounter):
            self.startNode("LeakStats")
            self.startNode("Differences")
            self.doprint_summary("cflow", obj.cflow_diff_total)
            self.doprint_summary("cflow-drop", obj.cflow_diff_total_dropped)
            self.doprint_summary("cflow-notest", obj.cflow_diff_total_untested)
            self.doprint_summary("data", obj.data_diff_total)
            self.doprint_summary("data-drop", obj.data_diff_total_dropped)
            self.doprint_summary("data-notest", obj.data_diff_total_untested)
            self.endNode("Differences")
            self.startNode("Leaks")
            self.startNode("Generic")
            self.doprint_summary("cflow", obj.cflow_leaks_generic)
            self.doprint_summary("data", obj.data_leaks_generic)
            self.endNode("Generic")
            combinedset = set(obj.cflow_leaks_specific.keys()).union(
                set(obj.data_leaks_specific.keys()))
            if len(combinedset) == 0:
                self.startNode("Specific")
                self.doprint_summary("cflow", 0)
                self.doprint_summary("data", 0)
                self.endNode("Specific")
            else:
                for sp in combinedset:
                    self.startNode("Specific")
                    self.doprint_line("leakage-model: %s" % str(sp))
                    if sp in obj.cflow_leaks_specific:
                        self.doprint_summary("cflow",
                                             obj.cflow_leaks_specific[sp])
                    else:
                        self.doprint_summary("cflow", 0)
                    if sp in obj.data_leaks_specific:
                        self.doprint_summary("data",
                                             obj.data_leaks_specific[sp])
                    else:
                        self.doprint_summary("data", 0)
                    self.endNode("Specific")
            self.endNode("Leaks")
            self.endNode("LeakStats")
        elif isinstance(obj, CallHistory):
            if obj.ctxt is not None:
                self.startNode(CONTEXT)
                self.doprint("CALL", obj.ctxt.caller, None)
                self.doprint("TO", obj.ctxt.callee, None)
            if param1:
                if len(obj.dataleaks) > 0:
                    self.startNode(DATALEAKS)
                    for leak in sorted_keys(obj.dataleaks):
                        leak.doprint(self)
                    self.endNode(DATALEAKS)
                if len(obj.cfleaks) > 0:
                    self.startNode(CFLEAKS)
                    for leak in sorted_keys(obj.cfleaks):
                        leak.doprint(self)
                    self.endNode(CFLEAKS)
            for k in sorted_keys(obj.children):
                obj.children[k].doprint(self, param1)
            if obj.ctxt is not None:
                self.endNode(CONTEXT)
        elif isinstance(obj, CFLeak) or isinstance(obj, DataLeak):
            self.startNode(LEAK)
            self.doprint("", obj.ip, None)

            if len(obj.entries) > 0:
                self.startNode("entries")
                obj.entries.doprint(self)
                self.endNode("entries")

            if len(obj.evidence) > 0:
                self.startNode("evidences")

                key_indxs = [e.key_index for e in obj.evidence]
                evidences = [[] for _ in range(max(key_indxs) + 1)]
                for (idx, key_indx) in enumerate(key_indxs):
                    evidences[key_indx].append(obj.evidence[idx])

                for (idx, evidence) in enumerate(evidences):
                    if len(evidence) == 0:
                        continue
                    evidence = deepcopy(evidence)

                    obj_print = MergeMap(EvidenceEntry)
                    obj_print.merge(evidence)

                    node_plain = "phase2" if evidence[
                        0].source == 0 else "phase3"
                    if idx == 0:
                        node = f"{node_plain} origin='random'"
                    else:
                        key = evidence[0].key.decode()
                        node = f"{node_plain} origin='fixed' key='{key}'"
                    self.startNode(node)
                    obj_print.doprint(self)
                    self.endNode(node_plain)

                self.endNode("evidences")

            self.doprint_generic(obj.status)

            self.endNode(LEAK)
        elif isinstance(obj, CFLeakEntry):
            self.doprint_line(obj.__str__())
        elif isinstance(obj, DataLeakEntry):
            self.doprint_line(obj.__str__())
        elif isinstance(obj, EvidenceEntry):
            self.doprint_line(obj.__str_printer__())
        elif isinstance(obj, LeakStatus):
            if len(obj.nsleak) == 0 and len(obj.spleak) and 0:
                self.startEndNode("result", str(obj))
                return

            self.startNode(f"result {str(obj)}")

            # Print NSLeak
            status_leaks = Counter(sorted(obj.nsleak))
            for sl_key in status_leaks.keys():
                self.startEndNode(
                    "generic", f"{str(sl_key)} count='{status_leaks[sl_key]}'")
            # Print SPLeak
            for n in sorted(list(obj.spleak)):
                self.startEndNode("specific", str(n))

            self.endNode("result")

        elif isinstance(obj, LibHierarchy):
            self.startNode("LibHierarchy")
            for k in sorted_keys(obj.entries):
                obj.entries[k].doprint(self, param1)
            self.endNode("LibHierarchy")
        elif isinstance(obj, Library):
            self.startNode("Lib")
            self.doprint_line(obj.__str__())
            for k in sorted_keys(obj.entries):
                obj.entries[k].doprint(self, param1)
            LeakCounter.count(obj).doprint(self)
            self.endNode("Lib")
        elif isinstance(obj, FunctionLeak):
            self.startNode("Function")
            self.doprint_line(escape(obj.__str__()))
            if param1:
                if len(obj.dataleaks) > 0:
                    self.startNode(DATALEAKS)
                    for leak in sorted_keys(obj.dataleaks):
                        leak.doprint(self)
                    self.endNode(DATALEAKS)
                if len(obj.cfleaks) > 0:
                    self.startNode(CFLEAKS)
                    for leak in sorted_keys(obj.cfleaks):
                        leak.doprint(self)
                    self.endNode(CFLEAKS)
            self.endNode("Function")
        else:
            debug(0, "Unknown instance %s", (obj.__class__))
            debug(0, str(isinstance(obj, CallHistory)))
            debug(0, str(type(obj) is CallHistory))
            debug(0, str(id(type(obj))))
            debug(0, str(id(CallHistory)))
            assert False