9
9
from vulntrain .utils import (
10
10
strip_markdown ,
11
11
extract_cpe ,
12
+ extract_cpe_csaf ,
12
13
extract_cvss_cve ,
13
14
extract_cvss_from_github_advisory ,
14
15
extract_cvss_from_pysec ,
16
+ extract_cvss_from_csaf ,
15
17
)
16
18
17
19
@@ -120,6 +122,40 @@ def extract_pysec(self, vuln: dict[str, Any]) -> dict[str, Any]:
120
122
"cvss_v2_0" : cvss_scores .get ("cvss_v2_0" , None ),
121
123
}
122
124
125
+ def extract_csaf (self , vuln : dict [str , Any ]) -> dict [str , Any ]:
126
+
127
+ cvss_scores = extract_cvss_from_csaf (vuln )
128
+
129
+ description = ""
130
+ description = " " .join (
131
+ [
132
+ note ["text" ]
133
+ for vulnerability in vuln .get ("vulnerabilities" , [])
134
+ for note in vulnerability .get ("notes" , [])
135
+ if note .get ("category" ) == "summary"
136
+ ]
137
+ )
138
+ if not description :
139
+ description = next (
140
+ (
141
+ note ["text" ]
142
+ for note in vuln .get ("document" , {}).get ("notes" , [])
143
+ if note .get ("category" ) == "summary"
144
+ ),
145
+ "" ,
146
+ )
147
+
148
+ return {
149
+ "id" : vuln ["document" ]["tracking" ]["id" ],
150
+ "title" : vuln ["document" ]["title" ],
151
+ "description" : description ,
152
+ "cpes" : extract_cpe_csaf (vuln ),
153
+ "cvss_v4_0" : cvss_scores .get ("cvss_v4_0" , None ),
154
+ "cvss_v3_1" : cvss_scores .get ("cvss_v3_1" , None ),
155
+ "cvss_v3_0" : cvss_scores .get ("cvss_v3_0" , None ),
156
+ "cvss_v2_0" : cvss_scores .get ("cvss_v2_0" , None ),
157
+ }
158
+
123
159
def __call__ (self ) -> Generator [dict [str , Any ], None , None ]:
124
160
count = 0
125
161
for source in self .sources :
@@ -130,6 +166,8 @@ def __call__(self) -> Generator[dict[str, Any], None, None]:
130
166
extractor = self .extract_ghsa
131
167
case "pysec" :
132
168
extractor = self .extract_pysec
169
+ case str () as s if s .startswith ("csaf_" ):
170
+ extractor = self .extract_csaf
133
171
case _:
134
172
print ("No parser for this source." )
135
173
continue
0 commit comments