|
21 | 21 | # You can also use folder names for broader exclusions (e.g., "test" excludes all test folders) |
22 | 22 | EXCLUDE_PATHS = [ |
23 | 23 | # Specific path exclusions |
24 | | - "deps/v8/tools/turbolizer", |
| 24 | + "deps/v8/tools", |
25 | 25 |
|
26 | 26 | # General folder name exclusions (will match any folder with this name) |
27 | 27 | "test", |
@@ -179,37 +179,80 @@ def parse_audit_results(self, audit_data: Dict, package_dir: Path, vulnerability |
179 | 179 | severity = vuln_data.get("severity", "unknown") |
180 | 180 | via = vuln_data.get("via", []) |
181 | 181 | fix_available = vuln_data.get("fixAvailable", False) |
| 182 | + range_info = vuln_data.get("range", "unknown") |
182 | 183 |
|
183 | | - # Handle different via formats |
| 184 | + # Handle different via formats - create separate vulnerabilities for each advisory |
184 | 185 | if isinstance(via, list) and via: |
185 | | - # Get the first vulnerability ID from via |
186 | | - first_via = via[0] |
187 | | - if isinstance(first_via, dict): |
188 | | - vuln_id = first_via.get("source", f"npm-{vuln_name}") |
189 | | - url = first_via.get("url", f"https://npmjs.com/advisories/{vuln_id}") |
190 | | - else: |
191 | | - vuln_id = str(first_via) |
192 | | - url = f"https://npmjs.com/advisories/{vuln_id}" |
| 186 | + for via_item in via: |
| 187 | + if isinstance(via_item, dict): |
| 188 | + # Extract individual advisory information |
| 189 | + advisory_id = via_item.get("source") |
| 190 | + advisory_url = via_item.get("url") |
| 191 | + advisory_title = via_item.get("title", "") |
| 192 | + advisory_severity = via_item.get("severity", severity) |
| 193 | + |
| 194 | + # Use advisory ID as vulnerability ID, fallback to package name |
| 195 | + if advisory_id: |
| 196 | + vuln_id = str(advisory_id) |
| 197 | + else: |
| 198 | + vuln_id = f"npm-{vuln_name}" |
| 199 | + |
| 200 | + # Use proper GitHub advisory URL if available |
| 201 | + if advisory_url: |
| 202 | + url = advisory_url |
| 203 | + else: |
| 204 | + url = f"https://github.com/advisories?query={vuln_name}" |
| 205 | + |
| 206 | + # Create vulnerability with advisory-specific information |
| 207 | + vulnerability = vulnerability_class( |
| 208 | + id=vuln_id, |
| 209 | + url=url, |
| 210 | + dependency=vuln_name, |
| 211 | + version=str(range_info), |
| 212 | + source="npm", |
| 213 | + severity=advisory_severity, |
| 214 | + via=[advisory_title] if advisory_title else [], |
| 215 | + fix_available=bool(fix_available), |
| 216 | + main_dep_name=main_dep_name, |
| 217 | + main_dep_path=main_dep_path |
| 218 | + ) |
| 219 | + vulnerabilities.append(vulnerability) |
| 220 | + else: |
| 221 | + # Handle string via items (legacy format) |
| 222 | + vuln_id = str(via_item) |
| 223 | + url = f"https://github.com/advisories?query={vuln_id}" |
| 224 | + |
| 225 | + vulnerability = vulnerability_class( |
| 226 | + id=vuln_id, |
| 227 | + url=url, |
| 228 | + dependency=vuln_name, |
| 229 | + version=str(range_info), |
| 230 | + source="npm", |
| 231 | + severity=severity, |
| 232 | + via=[str(via_item)], |
| 233 | + fix_available=bool(fix_available), |
| 234 | + main_dep_name=main_dep_name, |
| 235 | + main_dep_path=main_dep_path |
| 236 | + ) |
| 237 | + vulnerabilities.append(vulnerability) |
193 | 238 | else: |
| 239 | + # No via information, create basic vulnerability |
194 | 240 | vuln_id = f"npm-{vuln_name}" |
195 | | - url = f"https://npmjs.com/package/{vuln_name}" |
196 | | - |
197 | | - # Get version range |
198 | | - range_info = vuln_data.get("range", "unknown") |
199 | | - |
200 | | - vulnerability = vulnerability_class( |
201 | | - id=vuln_id, |
202 | | - url=url, |
203 | | - dependency=vuln_name, |
204 | | - version=str(range_info), |
205 | | - source="npm", |
206 | | - severity=severity, |
207 | | - via=[str(v) for v in via] if via else [], |
208 | | - fix_available=bool(fix_available), |
209 | | - main_dep_name=main_dep_name, |
210 | | - main_dep_path=main_dep_path |
211 | | - ) |
212 | | - vulnerabilities.append(vulnerability) |
| 241 | + url = f"https://github.com/advisories?query={vuln_name}" |
| 242 | + |
| 243 | + vulnerability = vulnerability_class( |
| 244 | + id=vuln_id, |
| 245 | + url=url, |
| 246 | + dependency=vuln_name, |
| 247 | + version=str(range_info), |
| 248 | + source="npm", |
| 249 | + severity=severity, |
| 250 | + via=[], |
| 251 | + fix_available=bool(fix_available), |
| 252 | + main_dep_name=main_dep_name, |
| 253 | + main_dep_path=main_dep_path |
| 254 | + ) |
| 255 | + vulnerabilities.append(vulnerability) |
213 | 256 |
|
214 | 257 | except Exception as e: |
215 | 258 | logger.error(f"Error parsing vulnerability {vuln_name}: {e}") |
|
0 commit comments