From 83a14c5081f43a0498e60ec22e9f088da421a870 Mon Sep 17 00:00:00 2001
From: Gioacchino Vino <gioacchino.vino@infn.it>
Date: Tue, 28 May 2024 15:48:23 +0200
Subject: [PATCH 01/14] Review code

---
 files/gvm_library.py | 23 +++++++++++++----------
 1 file changed, 13 insertions(+), 10 deletions(-)

diff --git a/files/gvm_library.py b/files/gvm_library.py
index e78a9d4..ed8dbf6 100644
--- a/files/gvm_library.py
+++ b/files/gvm_library.py
@@ -11,6 +11,7 @@ import yaml
 from functools import reduce
 import os
 import git
+import pandas as pd
 
 # GVM Xpath Constants
 GVM_XPATH_ID = '@id'
@@ -461,16 +462,18 @@ class Task:
         with open(filename, "wb") as fh:
             fh.write(base64.b64decode(code))
 
-    def get_report(self) -> List[Tuple[str,str,str,str]]:
+    def get_report(self) -> pd.DataFrame:
         res = self.client.get_report(self.report_id,
                                      report_format_id=ReportFormats.anonymous_xml,
                                      ignore_pagination=True,
                                      details="1")
-        o_ids: list[str] = res.xpath('report/report/results/result/nvt/@oid')
-        severities: list[str] = res.xpath('report/report/results/result/nvt/severities/@score')
+        oids: list[str] = res.xpath('report/report/results/result/nvt/@oid')
+        sev: list[str] = res.xpath('report/report/results/result/nvt/severities/@score')
         treats: list[str] = res.xpath('report/report/results/result/threat/text()')
         ports: list[str] = res.xpath('report/report/results/result/port/text()')
-        return [ResultReport(o,s,t,p) for o,s,t,p in zip(o_ids, severities, treats, ports)]
+        df = pd.DataFrame({"oids": oids, "sev": sev, "threats": treats, "ports": ports})    
+        df['sev'] = df['sev'].astype(float)
+        return df
     
 class GVMClient():
     """
@@ -605,8 +608,8 @@ class ReportManager():
             else:
                 self.os_oids = os_oids
                 try:
-                    self.os_all_oids = list(reduce(lambda x,y: x + y,
-                                                   os_oids.values()))
+                    self.os_all_oids = tuple(set(reduce(lambda x,y: x + y,
+                                                   os_oids.values())))
                     logging.debug("Imported os security oids")
                     logging.debug(pretty_json(self.os_all_oids))
 
@@ -614,7 +617,7 @@ class ReportManager():
                     logging.warning("Impossible extract oids from imported yaml")
                     self.os_all_oids = []
 
-    def extract_oids(self, lines: List[str]) -> Set[str]:
+    def extract_oids(self, lines: List[str]) -> Tuple[str]:
         oids: List[str] = list()
         for line in lines:
             line = line.strip()
@@ -622,7 +625,7 @@ class ReportManager():
             if len(v_line := line.split(" ")[0]) > 0:
                 oids.append(v_line)
 
-        return set(oids)
+        return tuple(set(oids))
         
     def import_security_oids(self) -> None:
         user = os.environ.get(self.SS_SEC_USER)
@@ -656,7 +659,7 @@ class ReportManager():
             logging.debug("known oids")
             logging.debug(pretty_json(self.known_oids))
 
-    def import_report(self, host: str, report: List[ResultReport]):
+    def import_report(self, host: str, report: pd.DataFrame) -> None:
         self.imported_oids[host] = report
 
     def init_glob_vars(self):
@@ -695,7 +698,7 @@ class ReportManager():
             self.report[self.REPORT_DEPLOYMENT] = {self.REPORT_SEVERITY: r.severity,
                                                    self.REPORT_THREAT: r.threat}
 
-    def classify_reports(self) -> None:
+    def classify_reports(self) -> None: ######################################<<<<<<<<<<<<<<<<<<########
 
         # Init global aggregated variables
         self.init_glob_vars()
-- 
GitLab


From 47272ba737ab3ecdcac557abeaab70973bef87d1 Mon Sep 17 00:00:00 2001
From: Gioacchino Vino <gioacchino.vino@infn.it>
Date: Tue, 28 May 2024 16:33:32 +0200
Subject: [PATCH 02/14] Implement advanced vulnerability classification

---
 files/scan.py | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/files/scan.py b/files/scan.py
index e2f98f2..e856838 100644
--- a/files/scan.py
+++ b/files/scan.py
@@ -168,9 +168,9 @@ for host,ports in endpoints.items():
                        "threat": f"Scan Error. task.id: {task.id}"}
         report_manager.import_report(host,task_report)
 
-    task.delete()
-    target.delete()
-    port_list.delete()
+    #task.delete()
+    #target.delete()
+    #port_list.delete()
 
 report_manager.classify_reports()
 logging.info("Reports")
-- 
GitLab


From 105bf8b95aa571179a6c91b856d309edcaee215a Mon Sep 17 00:00:00 2001
From: Gioacchino Vino <gioacchino.vino@infn.it>
Date: Tue, 28 May 2024 17:41:56 +0200
Subject: [PATCH 03/14] Implement advanced vulnerability classification

---
 files/gvm_library.py | 23 +++++++++++------------
 files/scan.py        |  4 +---
 2 files changed, 12 insertions(+), 15 deletions(-)

diff --git a/files/gvm_library.py b/files/gvm_library.py
index ed8dbf6..011b29f 100644
--- a/files/gvm_library.py
+++ b/files/gvm_library.py
@@ -462,18 +462,17 @@ class Task:
         with open(filename, "wb") as fh:
             fh.write(base64.b64decode(code))
 
-    def get_report(self) -> pd.DataFrame:
+    def get_report(self) -> Dict[str,Tuple]:
         res = self.client.get_report(self.report_id,
                                      report_format_id=ReportFormats.anonymous_xml,
                                      ignore_pagination=True,
                                      details="1")
-        oids: list[str] = res.xpath('report/report/results/result/nvt/@oid')
-        sev: list[str] = res.xpath('report/report/results/result/nvt/severities/@score')
-        treats: list[str] = res.xpath('report/report/results/result/threat/text()')
-        ports: list[str] = res.xpath('report/report/results/result/port/text()')
-        df = pd.DataFrame({"oids": oids, "sev": sev, "threats": treats, "ports": ports})    
-        df['sev'] = df['sev'].astype(float)
-        return df
+        oids: tuple[str] = tuple(res.xpath('report/report/results/result/nvt/@oid'))
+        sev: tuple[str] = tuple(res.xpath('report/report/results/result/nvt/severities/@score'))
+        threat: tuple[str] = tuple(res.xpath('report/report/results/result/threat/text()'))
+        ports: tuple[str] = tuple(res.xpath('report/report/results/result/port/text()'))
+        sev = tuple(map(float,sev))
+        return {"oids":oids, "severity":sev, "threat":threat, "ports":ports}
     
 class GVMClient():
     """
@@ -652,16 +651,16 @@ class ReportManager():
                 with open(filename, 'r') as file:
                     known_oids += self.extract_oids(file.readlines())
 
-            self.accepted_oids = accepted_oids
-            self.known_oids = known_oids
+            self.accepted_oids = tuple(sorted(accepted_oids))
+            self.known_oids = tuple(sorted(known_oids))
             logging.debug("accepted oids")
             logging.debug(pretty_json(self.accepted_oids))
             logging.debug("known oids")
             logging.debug(pretty_json(self.known_oids))
 
-    def import_report(self, host: str, report: pd.DataFrame) -> None:
+    def import_report(self, host: str, report: Dict[str,Tuple]) -> None:
         self.imported_oids[host] = report
-
+        
     def init_glob_vars(self):
         self.report = dict()
         self.report[self.REPORT_DEPLOYMENT] = {self.REPORT_SEVERITY: self.DEFAULT_SEVERITY,
diff --git a/files/scan.py b/files/scan.py
index e856838..37e66b9 100644
--- a/files/scan.py
+++ b/files/scan.py
@@ -164,9 +164,7 @@ for host,ports in endpoints.items():
                          filename = f"{report_filename}.txt")
         report_manager.import_report(host,task.get_report())
     else:
-        task_report = {"severity": ReportManager.MAX_SEVERITY, 
-                       "threat": f"Scan Error. task.id: {task.id}"}
-        report_manager.import_report(host,task_report)
+        logging.warning(f"Scan Error. task.id: {task.id}")
 
     #task.delete()
     #target.delete()
-- 
GitLab


From b41f8c309ac2dd2568a79839418b0d25d389b17e Mon Sep 17 00:00:00 2001
From: Gioacchino Vino <gioacchino.vino@infn.it>
Date: Tue, 28 May 2024 17:46:00 +0200
Subject: [PATCH 04/14] Implement advanced vulnerability classification

---
 files/gvm_library.py | 5 +++++
 files/scan.py        | 2 ++
 2 files changed, 7 insertions(+)

diff --git a/files/gvm_library.py b/files/gvm_library.py
index 011b29f..2b7be5f 100644
--- a/files/gvm_library.py
+++ b/files/gvm_library.py
@@ -661,6 +661,11 @@ class ReportManager():
     def import_report(self, host: str, report: Dict[str,Tuple]) -> None:
         self.imported_oids[host] = report
         
+
+    def show_imported_reports(self) -> None:
+        logging.debug(pretty_json(self.imported_oids))
+        
+        
     def init_glob_vars(self):
         self.report = dict()
         self.report[self.REPORT_DEPLOYMENT] = {self.REPORT_SEVERITY: self.DEFAULT_SEVERITY,
diff --git a/files/scan.py b/files/scan.py
index 37e66b9..1d9a6f6 100644
--- a/files/scan.py
+++ b/files/scan.py
@@ -170,6 +170,8 @@ for host,ports in endpoints.items():
     #target.delete()
     #port_list.delete()
 
+report_manager.show_imported_reports()
+
 report_manager.classify_reports()
 logging.info("Reports")
 logging.info(report_manager.get_summary())
-- 
GitLab


From 0145af993261ed50ae7c9945a9aa0b446b260e33 Mon Sep 17 00:00:00 2001
From: Gioacchino Vino <gioacchino.vino@infn.it>
Date: Tue, 28 May 2024 17:47:59 +0200
Subject: [PATCH 05/14] Implement advanced vulnerability classification

---
 files/gvm_library.py | 10 ++++------
 1 file changed, 4 insertions(+), 6 deletions(-)

diff --git a/files/gvm_library.py b/files/gvm_library.py
index 2b7be5f..9c05744 100644
--- a/files/gvm_library.py
+++ b/files/gvm_library.py
@@ -467,11 +467,11 @@ class Task:
                                      report_format_id=ReportFormats.anonymous_xml,
                                      ignore_pagination=True,
                                      details="1")
-        oids: tuple[str] = tuple(res.xpath('report/report/results/result/nvt/@oid'))
+        oids: tuple[str] = tuple(sorted(res.xpath('report/report/results/result/nvt/@oid')))
         sev: tuple[str] = tuple(res.xpath('report/report/results/result/nvt/severities/@score'))
-        threat: tuple[str] = tuple(res.xpath('report/report/results/result/threat/text()'))
-        ports: tuple[str] = tuple(res.xpath('report/report/results/result/port/text()'))
-        sev = tuple(map(float,sev))
+        threat: tuple[str] = tuple(sorted(res.xpath('report/report/results/result/threat/text()')))
+        ports: tuple[str] = tuple(sorted(res.xpath('report/report/results/result/port/text()')))
+        sev = tuple(sorted(map(float,sev)))
         return {"oids":oids, "severity":sev, "threat":threat, "ports":ports}
     
 class GVMClient():
@@ -661,11 +661,9 @@ class ReportManager():
     def import_report(self, host: str, report: Dict[str,Tuple]) -> None:
         self.imported_oids[host] = report
         
-
     def show_imported_reports(self) -> None:
         logging.debug(pretty_json(self.imported_oids))
         
-        
     def init_glob_vars(self):
         self.report = dict()
         self.report[self.REPORT_DEPLOYMENT] = {self.REPORT_SEVERITY: self.DEFAULT_SEVERITY,
-- 
GitLab


From c8411cb17f9fd320e9634f357f2a9457302090fc Mon Sep 17 00:00:00 2001
From: Gioacchino Vino <gioacchino.vino@infn.it>
Date: Tue, 28 May 2024 17:48:30 +0200
Subject: [PATCH 06/14] Implement advanced vulnerability classification

---
 files/gvm_library.py | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/files/gvm_library.py b/files/gvm_library.py
index 9c05744..cb574e1 100644
--- a/files/gvm_library.py
+++ b/files/gvm_library.py
@@ -467,11 +467,11 @@ class Task:
                                      report_format_id=ReportFormats.anonymous_xml,
                                      ignore_pagination=True,
                                      details="1")
-        oids: tuple[str] = tuple(sorted(res.xpath('report/report/results/result/nvt/@oid')))
+        oids: tuple[str] = tuple(res.xpath('report/report/results/result/nvt/@oid'))
         sev: tuple[str] = tuple(res.xpath('report/report/results/result/nvt/severities/@score'))
-        threat: tuple[str] = tuple(sorted(res.xpath('report/report/results/result/threat/text()')))
-        ports: tuple[str] = tuple(sorted(res.xpath('report/report/results/result/port/text()')))
-        sev = tuple(sorted(map(float,sev)))
+        threat: tuple[str] = tuple(res.xpath('report/report/results/result/threat/text()'))
+        ports: tuple[str] = tuple(res.xpath('report/report/results/result/port/text()'))
+        sev = tuple(map(float,sev))
         return {"oids":oids, "severity":sev, "threat":threat, "ports":ports}
     
 class GVMClient():
-- 
GitLab


From a8063368f2fab6b51bcb65b6b3c156e4f4a3f701 Mon Sep 17 00:00:00 2001
From: Gioacchino Vino <gioacchino.vino@infn.it>
Date: Tue, 28 May 2024 17:52:40 +0200
Subject: [PATCH 07/14] Implement advanced vulnerability classification

---
 files/gvm_library.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/files/gvm_library.py b/files/gvm_library.py
index cb574e1..b216c6a 100644
--- a/files/gvm_library.py
+++ b/files/gvm_library.py
@@ -662,7 +662,7 @@ class ReportManager():
         self.imported_oids[host] = report
         
     def show_imported_reports(self) -> None:
-        logging.debug(pretty_json(self.imported_oids))
+        logging.debug( json.dumps(self.imported_oids))     
         
     def init_glob_vars(self):
         self.report = dict()
-- 
GitLab


From 21cb3c67795d53cec7f4947c391f03fe673b5ca8 Mon Sep 17 00:00:00 2001
From: Gioacchino Vino <gioacchino.vino@infn.it>
Date: Wed, 29 May 2024 17:14:01 +0200
Subject: [PATCH 08/14] Implement advanced vulnerability classification

---
 files/gvm_library.py | 145 +++++++++++++++++++++----------------------
 files/scan.py        |   2 -
 2 files changed, 72 insertions(+), 75 deletions(-)

diff --git a/files/gvm_library.py b/files/gvm_library.py
index b216c6a..1d25fb3 100644
--- a/files/gvm_library.py
+++ b/files/gvm_library.py
@@ -471,7 +471,7 @@ class Task:
         sev: tuple[str] = tuple(res.xpath('report/report/results/result/nvt/severities/@score'))
         threat: tuple[str] = tuple(res.xpath('report/report/results/result/threat/text()'))
         ports: tuple[str] = tuple(res.xpath('report/report/results/result/port/text()'))
-        sev = tuple(map(float,sev))
+        sev: tuple[float] = tuple(map(float,sev))
         return {"oids":oids, "severity":sev, "threat":threat, "ports":ports}
     
 class GVMClient():
@@ -538,6 +538,7 @@ class ReportManager():
     REPORT_GLOBAL = "global"
     REPORT_SEVERITY = "severity"
     REPORT_THREAT = "threat"
+    REPORT_PORTS = "ports"
 
     # OIDS Classes
     OID_ACCEPTED = 'accepted-oids'
@@ -563,6 +564,13 @@ class ReportManager():
     SS_SEC_ACCEPTED_FILES = ['accepted.txt']
     SS_SEC_KNOWN_FILES = ['held.txt', 'new.txt', 'overridden.txt']
 
+    # Classification configuration
+    LABEL_COLUMN = "label"
+    LABEL_NEW_VULNS = "NEW"
+    LABEL_ACKNOWLEDGED_VULNS = "ACKNOWLEDGED"
+    LABEL_REJECTED_VULNS = "REJECTED"
+    LABEL_OS_RELATED_VULNS = "OS_RELATED"
+
     def __init__(self, os_name: str, is_os: bool) -> None:
         logging.info("Report Manager Iniziatation started...")
         self.os_name = os_name
@@ -662,83 +670,79 @@ class ReportManager():
         self.imported_oids[host] = report
         
     def show_imported_reports(self) -> None:
-        logging.debug( json.dumps(self.imported_oids))     
-        
-    def init_glob_vars(self):
-        self.report = dict()
-        self.report[self.REPORT_DEPLOYMENT] = {self.REPORT_SEVERITY: self.DEFAULT_SEVERITY,
-                                               self.REPORT_THREAT: self.DEFAULT_THREAT}
-        self.oids = dict()
-
-    def init_host_vars(self,host: str): 
-        self.oids[host] = {self.OID_ACCEPTED: [],
-                           self.OID_DROPPED: [],
-                           self.OID_NEW: []}
+        logging.debug(json.dumps(self.imported_oids))     
         
-        if not self.is_os:
-            self.oids[host][self.OID_OS] = []
 
-        self.report[host] = dict()
-        self.report[host][self.REPORT_GLOBAL] = {self.REPORT_SEVERITY: self.DEFAULT_SEVERITY,
-                                                 self.REPORT_THREAT: self.DEFAULT_THREAT}
+    def classify_reports(self) -> None: 
+        TO_SOLVE_VULNS = [self.LABEL_NEW_VULNS,self.LABEL_ACKNOWLEDGED_VULNS]
 
-    def update_summary(self,host, r: ResultReport) -> None:
+        to_solve   = pd.Series({"oids": self.accepted_oids})
+        to_exclude = pd.Series({"oids": self.known_oids})
+        os_vulns   = pd.Series({"oids": self.os_all_oids})
 
-        # Evaluate max port severity per host
-        if r.port not in self.report[host] or \
-                r.severity > self.report[host][r.port][self.REPORT_SEVERITY]:
-            self.report[host][r.port] = {self.REPORT_SEVERITY: r.severity,
-                                    self.REPORT_THREAT: r.threat}
+        self.report, self.oids = dict(), dict()
+        self.report[self.REPORT_DEPLOYMENT] = {self.REPORT_SEVERITY: self.DEFAULT_SEVERITY}
 
-        # Evaluate max global severity per host
-        if r.severity > self.report[host][self.REPORT_GLOBAL][self.REPORT_SEVERITY]:
-            self.report[host][self.REPORT_GLOBAL] = {self.REPORT_SEVERITY: r.severity,
-                                                     self.REPORT_THREAT: r.threat}
+        for host, host_report in self.imported_oids.items():
+            self.oids[host], self.report[host] = dict(), dict()
 
-        # Evaluate Global max severity
-        if r.severity > self.report[self.REPORT_DEPLOYMENT][self.REPORT_SEVERITY]:
-            self.report[self.REPORT_DEPLOYMENT] = {self.REPORT_SEVERITY: r.severity,
-                                                   self.REPORT_THREAT: r.threat}
+            # Create Pandas DataFrame from GreenBone report
+            vulns = pd.DataFrame(host_report)
 
-    def classify_reports(self) -> None: ######################################<<<<<<<<<<<<<<<<<<########
+            # Add Label column
+            vulns[self.LABEL_COLUMN] = self.LABEL_NEW_VULNS
 
-        # Init global aggregated variables
-        self.init_glob_vars()
+            # Remove not important Vulnerabilties   
+            vulns = vulns[vulns.severity >= self.SEVERITY_THR]
 
-        for host, host_report in self.imported_oids.items():
-            # Init aggregated variables per host
-            self.init_host_vars(host)
-            for res_report in host_report:
-                logging.debug(res_report)
-
-                # Skip if oid is not relevant
-                if res_report.severity < self.SEVERITY_THR: 
-                    self.update_summary(host, res_report)
-                    logging.debug("LOW SEVERITY -> SKIPPED")
-                    continue
-
-                # Classify oid
-                if not self.is_os and res_report.oid in self.os_all_oids:
-                    self.oids[host][self.OID_OS] += [res_report]
-                    logging.debug("OS RELATED")
-                elif res_report.oid in self.accepted_oids:
-                    self.oids[host][self.OID_ACCEPTED].append(res_report)
-                    self.update_summary(host, res_report)
-                    logging.debug("ACCEPTED")
-                elif res_report.oid in self.known_oids:
-                    self.oids[host][self.OID_DROPPED].append(res_report)
-                    logging.debug("DROPPED")
-                else:
-                    self.oids[host][self.OID_NEW].append(res_report)
-                    self.update_summary(host, res_report)
-                    logging.debug("NEW")
+            # Label Acknowledged Vulnerabilities
+            vulns.loc[vulns.oids.isin(to_solve.oids),
+                      self.LABEL_COLUMN] = self.LABEL_ACKNOWLEDGED_VULNS
+
+            # Label Excluded Vulnerabilities
+            vulns.loc[vulns.oids.isin(to_exclude.oids),
+                      self.LABEL_COLUMN] = self.LABEL_REJECTED_VULNS
+
+            if not self.is_os:
+                # Label Os Vulnerabilities
+                vulns.loc[vulns.oids.isin(os_vulns.oids),
+                          self.LABEL_COLUMN] = self.LABEL_OS_RELATED_VULNS
                 
-                for host,data in self.oids.items():
-                    for k,v_list in data.items():
-                        for o in v_list:
-                            logging.debug((host,k,o.oid,o.severity,o.threat,o.port))
+                # Collect Os Vulnerability oids
+                self.oids[host][self.LABEL_OS_RELATED_VULNS] = \
+                    vulns[vulns.label == self.LABEL_OS_RELATED_VULNS].oids.to_list()
+
+            # Collect Acknowledged Vulnerability oids
+            self.oids[host][self.LABEL_ACKNOWLEDGED_VULNS] = \
+                vulns[vulns.label == self.LABEL_ACKNOWLEDGED_VULNS].oids.to_list()
+            
+            # Collect Rejected Vulnerability oids
+            self.oids[host][self.LABEL_REJECTED_VULNS] = \
+                vulns[vulns.label == self.LABEL_REJECTED_VULNS].oids.to_list()
+            
+            # Collect New Vulnerability oids
+            self.oids[host][self.LABEL_NEW_VULNS] = \
+                vulns[vulns.label == self.LABEL_NEW_VULNS].oids.to_list()
+            
+            # Collect Acknowledged and New Vulnerabilities to create To-Solve Dataframe
+            to_solve = vulns[vulns[self.LABEL_COLUMN].isin(TO_SOLVE_VULNS)]
+
+            # Extract Max Severity per "ports" parameter
+            for ports, sev in to_solve.groupby(self.REPORT_PORTS).severity.max().items():
+                self.report[host][ports] = {self.REPORT_SEVERITY: sev}
+            
+            # Compute Host Max Severity
+            max_severity = to_solve.severity.max()
+            self.report[host][self.REPORT_GLOBAL] = {self.REPORT_SEVERITY: max_severity}
+            
+            # Check if Host Max Severity is greater the Deployment Max Severity
+            if max_severity > self.report[self.REPORT_DEPLOYMENT][self.REPORT_SEVERITY]:
+                self.report[self.REPORT_DEPLOYMENT][self.REPORT_SEVERITY] = max_severity
+
+            logging.debug(f"HOST: {host}")
+            logging.debug(f"\n{vulns}")
 
-        # Extract global estimation
+        # Check if the Deployment Max Severity whether relevent or not
         if self.report[self.REPORT_DEPLOYMENT][self.REPORT_SEVERITY] < self.SEVERITY_THR:
             self.report[self.REPORT_GLOBAL] = self.MSG_OK
         else:
@@ -748,12 +752,7 @@ class ReportManager():
         return pretty_json(self.report)
 
     def get_classified_oids(self) -> str:
-        json_oids = dict()
-        for host, data in self.oids.items():
-            json_oids[host] = dict()
-            for key, oids in data.items():
-                json_oids[host][key] = [str(o) for o in oids]
-        return pretty_json(json_oids)
+        return pretty_json(self.oids)
 
     def create_msg(self, r: ResultReport):
         msg =  f"    Detected oid: {r.oid}, severity: {r.severity}"
diff --git a/files/scan.py b/files/scan.py
index 1d9a6f6..d3d87f7 100644
--- a/files/scan.py
+++ b/files/scan.py
@@ -21,8 +21,6 @@ SUMMARY_FILENAME = "summary-report.json"
 OIDS_FILENAME = "oids.json"
 LOG_FILENAME = "log_scan.log"
 
-
-
 parser = argparse.ArgumentParser(
     description='Scan endpoints and machines')
             
-- 
GitLab


From cc976db01976f39c04a7b49ed5e2393170df4f0d Mon Sep 17 00:00:00 2001
From: Gioacchino Vino <gioacchino.vino@infn.it>
Date: Wed, 29 May 2024 17:26:18 +0200
Subject: [PATCH 09/14] Implement advanced vulnerability classification

---
 files/gvm_library.py | 12 +++++-------
 1 file changed, 5 insertions(+), 7 deletions(-)

diff --git a/files/gvm_library.py b/files/gvm_library.py
index 1d25fb3..bf5263a 100644
--- a/files/gvm_library.py
+++ b/files/gvm_library.py
@@ -670,9 +670,12 @@ class ReportManager():
         self.imported_oids[host] = report
         
     def show_imported_reports(self) -> None:
-        logging.debug(json.dumps(self.imported_oids))     
+        logging.debug("IMPORTED REPORTS")
+        for host, report in self.imported_oids:
+            logging.debug(f"HOST: {host}")
+            logging.debug(f"\n{pd.DataFrame(report)}")
+        logging.debug("")     
         
-
     def classify_reports(self) -> None: 
         TO_SOLVE_VULNS = [self.LABEL_NEW_VULNS,self.LABEL_ACKNOWLEDGED_VULNS]
 
@@ -754,11 +757,6 @@ class ReportManager():
     def get_classified_oids(self) -> str:
         return pretty_json(self.oids)
 
-    def create_msg(self, r: ResultReport):
-        msg =  f"    Detected oid: {r.oid}, severity: {r.severity}"
-        msg += f", threat: {r.threat} and port: {r.port}\n"
-        return msg
-
     def write_data(self,
                    summary_filename: str,
                    oids_filename: str):
-- 
GitLab


From 286c5208c31e30bdda0b29fcff9d4d10d4cde378 Mon Sep 17 00:00:00 2001
From: Gioacchino Vino <gioacchino.vino@infn.it>
Date: Wed, 29 May 2024 17:26:53 +0200
Subject: [PATCH 10/14] Implement advanced vulnerability classification

---
 files/gvm_library.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/files/gvm_library.py b/files/gvm_library.py
index bf5263a..0a78248 100644
--- a/files/gvm_library.py
+++ b/files/gvm_library.py
@@ -671,7 +671,7 @@ class ReportManager():
         
     def show_imported_reports(self) -> None:
         logging.debug("IMPORTED REPORTS")
-        for host, report in self.imported_oids:
+        for host, report in self.imported_oids.items():
             logging.debug(f"HOST: {host}")
             logging.debug(f"\n{pd.DataFrame(report)}")
         logging.debug("")     
-- 
GitLab


From bf386cd8016dc4f428e0adcccdad7c9d9f5a8edf Mon Sep 17 00:00:00 2001
From: Gioacchino Vino <gioacchino.vino@infn.it>
Date: Wed, 29 May 2024 17:28:03 +0200
Subject: [PATCH 11/14] Implement advanced vulnerability classification

---
 files/gvm_library.py | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/files/gvm_library.py b/files/gvm_library.py
index 0a78248..b02ae05 100644
--- a/files/gvm_library.py
+++ b/files/gvm_library.py
@@ -677,6 +677,8 @@ class ReportManager():
         logging.debug("")     
         
     def classify_reports(self) -> None: 
+        logging.debug("\n\nCLASSIFIED OIDS")
+
         TO_SOLVE_VULNS = [self.LABEL_NEW_VULNS,self.LABEL_ACKNOWLEDGED_VULNS]
 
         to_solve   = pd.Series({"oids": self.accepted_oids})
-- 
GitLab


From 715f10005b16ef9328f0faa431694bc6b483347d Mon Sep 17 00:00:00 2001
From: Gioacchino Vino <gioacchino.vino@infn.it>
Date: Wed, 29 May 2024 17:40:47 +0200
Subject: [PATCH 12/14] Implement advanced vulnerability classification

---
 files/gvm_library.py | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/files/gvm_library.py b/files/gvm_library.py
index b02ae05..200e8aa 100644
--- a/files/gvm_library.py
+++ b/files/gvm_library.py
@@ -614,7 +614,8 @@ class ReportManager():
                 self.os_all_oids = []
             else:
                 self.os_oids = os_oids
-                try:
+                self.os_all_oids = os_oids[self.os_name]
+                """try:
                     self.os_all_oids = tuple(set(reduce(lambda x,y: x + y,
                                                    os_oids.values())))
                     logging.debug("Imported os security oids")
@@ -622,7 +623,7 @@ class ReportManager():
 
                 except Exception as e:
                     logging.warning("Impossible extract oids from imported yaml")
-                    self.os_all_oids = []
+                    self.os_all_oids = []"""
 
     def extract_oids(self, lines: List[str]) -> Tuple[str]:
         oids: List[str] = list()
@@ -670,7 +671,7 @@ class ReportManager():
         self.imported_oids[host] = report
         
     def show_imported_reports(self) -> None:
-        logging.debug("IMPORTED REPORTS")
+        logging.debug("\nIMPORTED REPORTS")
         for host, report in self.imported_oids.items():
             logging.debug(f"HOST: {host}")
             logging.debug(f"\n{pd.DataFrame(report)}")
-- 
GitLab


From fac79a9d8c67346c92a89530d54037575b9c17be Mon Sep 17 00:00:00 2001
From: Gioacchino Vino <gioacchino.vino@infn.it>
Date: Wed, 29 May 2024 17:42:33 +0200
Subject: [PATCH 13/14] Implement advanced vulnerability classification

---
 files/gvm_library.py | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/files/gvm_library.py b/files/gvm_library.py
index 200e8aa..ced0d39 100644
--- a/files/gvm_library.py
+++ b/files/gvm_library.py
@@ -615,6 +615,9 @@ class ReportManager():
             else:
                 self.os_oids = os_oids
                 self.os_all_oids = os_oids[self.os_name]
+                logging.debug("Imported os security oids")
+                logging.debug(pretty_json(self.os_all_oids))
+                
                 """try:
                     self.os_all_oids = tuple(set(reduce(lambda x,y: x + y,
                                                    os_oids.values())))
-- 
GitLab


From 29ac69f85b697240abcafb5234ed7c09ab57debf Mon Sep 17 00:00:00 2001
From: Gioacchino Vino <gioacchino.vino@infn.it>
Date: Wed, 29 May 2024 17:47:49 +0200
Subject: [PATCH 14/14] Implement advanced vulnerability classification

---
 files/gvm_library.py | 58 ++++++++++++++++----------------------------
 1 file changed, 21 insertions(+), 37 deletions(-)

diff --git a/files/gvm_library.py b/files/gvm_library.py
index ced0d39..7d6b1d1 100644
--- a/files/gvm_library.py
+++ b/files/gvm_library.py
@@ -540,12 +540,6 @@ class ReportManager():
     REPORT_THREAT = "threat"
     REPORT_PORTS = "ports"
 
-    # OIDS Classes
-    OID_ACCEPTED = 'accepted-oids'
-    OID_NEW = 'new-oids'
-    OID_DROPPED = 'dropped-oids'
-    OID_OS = 'os-related-oids'
-
     # OS security repository configuration
     OS_GIT_REPO = "baltig.infn.it/infn-cloud/os_security_checks.git"
     OS_SEC_BRANCH = "new-oids"
@@ -561,8 +555,8 @@ class ReportManager():
     SS_SEC_TOKEN = "GIT_SEC_TOKEN"
     SS_SEC_DEST_DIR = "ss-repo"
     SS_SEC_CHILD_DIR = "queues"
-    SS_SEC_ACCEPTED_FILES = ['accepted.txt']
-    SS_SEC_KNOWN_FILES = ['held.txt', 'new.txt', 'overridden.txt']
+    SS_SEC_ACKNOWLEDGED_OIDS_FILES = ['accepted.txt']
+    SS_SEC_REJECTED_OIDS_FILES = ['held.txt', 'new.txt', 'overridden.txt']
 
     # Classification configuration
     LABEL_COLUMN = "label"
@@ -614,19 +608,9 @@ class ReportManager():
                 self.os_all_oids = []
             else:
                 self.os_oids = os_oids
-                self.os_all_oids = os_oids[self.os_name]
+                self.os_all_oids = os_oids.get(self.os_name,[])
                 logging.debug("Imported os security oids")
                 logging.debug(pretty_json(self.os_all_oids))
-                
-                """try:
-                    self.os_all_oids = tuple(set(reduce(lambda x,y: x + y,
-                                                   os_oids.values())))
-                    logging.debug("Imported os security oids")
-                    logging.debug(pretty_json(self.os_all_oids))
-
-                except Exception as e:
-                    logging.warning("Impossible extract oids from imported yaml")
-                    self.os_all_oids = []"""
 
     def extract_oids(self, lines: List[str]) -> Tuple[str]:
         oids: List[str] = list()
@@ -647,28 +631,28 @@ class ReportManager():
             git.Repo.clone_from(repo_url, self.SS_SEC_DEST_DIR)
         except Exception as e:
             logging.warning(f"Impossible clone the ss scans repository, {e}")
-            self.accepted_oids = []
-            self.known_oids = []
+            self.acknowledged_oids = []
+            self.rejected_oids = []
         else:
-            accepted_oids: List[str] = []
-            known_oids: List[str] = []
+            acknowledged_oids: List[str] = []
+            rejected_oids: List[str] = []
 
-            for f in self.SS_SEC_ACCEPTED_FILES:
+            for f in self.SS_SEC_ACKNOWLEDGED_OIDS_FILES:
                 filename = os.path.join(files_dir,f)
                 with open(filename, 'r') as file:
-                    accepted_oids += self.extract_oids(file.readlines())
+                    acknowledged_oids += self.extract_oids(file.readlines())
             
-            for f in self.SS_SEC_KNOWN_FILES:
+            for f in self.SS_SEC_REJECTED_OIDS_FILES:
                 filename = os.path.join(files_dir,f)
                 with open(filename, 'r') as file:
-                    known_oids += self.extract_oids(file.readlines())
+                    rejected_oids += self.extract_oids(file.readlines())
 
-            self.accepted_oids = tuple(sorted(accepted_oids))
-            self.known_oids = tuple(sorted(known_oids))
-            logging.debug("accepted oids")
-            logging.debug(pretty_json(self.accepted_oids))
-            logging.debug("known oids")
-            logging.debug(pretty_json(self.known_oids))
+            self.acknowledged_oids = tuple(sorted(acknowledged_oids))
+            self.rejected_oids = tuple(sorted(rejected_oids))
+            logging.debug("Acknowledged Oids")
+            logging.debug(pretty_json(self.acknowledged_oids))
+            logging.debug("Rejected Oids")
+            logging.debug(pretty_json(self.rejected_oids))
 
     def import_report(self, host: str, report: Dict[str,Tuple]) -> None:
         self.imported_oids[host] = report
@@ -685,8 +669,8 @@ class ReportManager():
 
         TO_SOLVE_VULNS = [self.LABEL_NEW_VULNS,self.LABEL_ACKNOWLEDGED_VULNS]
 
-        to_solve   = pd.Series({"oids": self.accepted_oids})
-        to_exclude = pd.Series({"oids": self.known_oids})
+        to_solve   = pd.Series({"oids": self.acknowledged_oids})
+        to_exclude = pd.Series({"oids": self.rejected_oids})
         os_vulns   = pd.Series({"oids": self.os_all_oids})
 
         self.report, self.oids = dict(), dict()
@@ -784,8 +768,8 @@ class ReportManager():
         # Overwrite the detected oids to the host oids
         self.os_oids[self.os_name] = []
         for _ , data in self.oids.items():
-            self.os_oids[self.os_name] += [a.oid for a in data[self.OID_ACCEPTED]]
-            self.os_oids[self.os_name] += [n.oid for n in data[self.OID_NEW]]
+            self.os_oids[self.os_name] += [a.oid for a in data[self.LABEL_ACKNOWLEDGED_VULNS]]
+            self.os_oids[self.os_name] += [n.oid for n in data[self.LABEL_NEW_VULNS]]
         with open(self.os_file, 'w') as f:
             yaml.dump(self.os_oids, f)
 
-- 
GitLab