regscale-cli 6.16.2.0__py3-none-any.whl → 6.16.4.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of regscale-cli might be problematic. Click here for more details.

Files changed (52) hide show
  1. regscale/__init__.py +1 -1
  2. regscale/core/app/internal/control_editor.py +26 -2
  3. regscale/core/app/internal/model_editor.py +39 -26
  4. regscale/core/app/utils/api_handler.py +4 -11
  5. regscale/integrations/commercial/crowdstrike.py +0 -1
  6. regscale/integrations/commercial/grype/scanner.py +37 -29
  7. regscale/integrations/commercial/opentext/commands.py +2 -0
  8. regscale/integrations/commercial/opentext/scanner.py +45 -31
  9. regscale/integrations/commercial/qualys.py +52 -61
  10. regscale/integrations/commercial/servicenow.py +1 -0
  11. regscale/integrations/commercial/sicura/commands.py +9 -14
  12. regscale/integrations/commercial/snyk.py +2 -2
  13. regscale/integrations/commercial/synqly/ticketing.py +29 -0
  14. regscale/integrations/commercial/tenablev2/click.py +25 -13
  15. regscale/integrations/commercial/tenablev2/scanner.py +12 -3
  16. regscale/integrations/commercial/trivy/scanner.py +14 -6
  17. regscale/integrations/commercial/veracode.py +1 -1
  18. regscale/integrations/commercial/wizv2/click.py +15 -37
  19. regscale/integrations/jsonl_scanner_integration.py +120 -16
  20. regscale/integrations/public/fedramp/click.py +8 -8
  21. regscale/integrations/public/fedramp/fedramp_cis_crm.py +499 -106
  22. regscale/integrations/public/fedramp/ssp_logger.py +2 -9
  23. regscale/integrations/scanner_integration.py +67 -27
  24. regscale/models/integration_models/cisa_kev_data.json +86 -12
  25. regscale/models/integration_models/flat_file_importer/__init__.py +29 -8
  26. regscale/models/integration_models/snyk.py +141 -15
  27. regscale/models/integration_models/synqly_models/capabilities.json +1 -1
  28. regscale/models/integration_models/tenable_models/integration.py +23 -3
  29. regscale/models/integration_models/veracode.py +91 -48
  30. regscale/models/regscale_models/control_implementation.py +18 -0
  31. regscale/models/regscale_models/control_objective.py +2 -1
  32. regscale/models/regscale_models/facility.py +10 -26
  33. regscale/models/regscale_models/functional_roles.py +38 -0
  34. regscale/models/regscale_models/issue.py +3 -1
  35. regscale/models/regscale_models/parameter.py +21 -3
  36. regscale/models/regscale_models/profile.py +22 -0
  37. regscale/models/regscale_models/profile_mapping.py +48 -3
  38. regscale/models/regscale_models/regscale_model.py +2 -0
  39. regscale/models/regscale_models/risk.py +38 -30
  40. regscale/models/regscale_models/security_plan.py +1 -0
  41. regscale/models/regscale_models/supply_chain.py +1 -1
  42. regscale/models/regscale_models/user.py +19 -6
  43. regscale/utils/threading/__init__.py +1 -0
  44. regscale/utils/threading/threadsafe_list.py +10 -0
  45. regscale/utils/threading/threadsafe_set.py +116 -0
  46. regscale/utils/version.py +3 -5
  47. {regscale_cli-6.16.2.0.dist-info → regscale_cli-6.16.4.0.dist-info}/METADATA +1 -1
  48. {regscale_cli-6.16.2.0.dist-info → regscale_cli-6.16.4.0.dist-info}/RECORD +52 -50
  49. {regscale_cli-6.16.2.0.dist-info → regscale_cli-6.16.4.0.dist-info}/LICENSE +0 -0
  50. {regscale_cli-6.16.2.0.dist-info → regscale_cli-6.16.4.0.dist-info}/WHEEL +0 -0
  51. {regscale_cli-6.16.2.0.dist-info → regscale_cli-6.16.4.0.dist-info}/entry_points.txt +0 -0
  52. {regscale_cli-6.16.2.0.dist-info → regscale_cli-6.16.4.0.dist-info}/top_level.txt +0 -0
@@ -1,11 +1,7 @@
1
- from regscale.integrations.public.fedramp.reporting import (
2
- write_events,
3
- log_error,
4
- log_event,
5
- )
6
-
7
1
  import logging
2
+
8
3
  from regscale.core.app.logz import create_logger
4
+ from regscale.integrations.public.fedramp.reporting import log_error, log_event, write_events
9
5
 
10
6
 
11
7
  class CaptureEventsHandler(logging.Handler):
@@ -39,7 +35,6 @@ class SSPLogger:
39
35
  return self.logger
40
36
 
41
37
  def info(self, event_msg: str, record_type: str = "", model_layer: str = ""):
42
- self.logger.info(event_msg)
43
38
  info = {
44
39
  "event_msg": event_msg,
45
40
  "record_type": record_type,
@@ -57,7 +52,6 @@ class SSPLogger:
57
52
  model_layer: str = "",
58
53
  missing_element: str = "",
59
54
  ):
60
- self.logger.error(event_msg)
61
55
  error = {
62
56
  "event_msg": event_msg,
63
57
  "missing_element": missing_element,
@@ -67,7 +61,6 @@ class SSPLogger:
67
61
  self.errors.append(log_error(**error, level="Error"))
68
62
 
69
63
  def warning(self, event_msg: str, record_type: str = "", model_layer: str = ""):
70
- self.logger.warning(event_msg)
71
64
  warning = {
72
65
  "event_msg": event_msg,
73
66
  "record_type": record_type,
@@ -269,6 +269,10 @@ class IntegrationAsset:
269
269
  other_cloud_identifier: Optional[str] = None
270
270
  patch_level: Optional[str] = None
271
271
  cpe: Optional[str] = None
272
+ is_latest_scan: Optional[bool] = None
273
+ is_authenticated_scan: Optional[bool] = None
274
+ system_administrator_id: Optional[str] = None
275
+ scanning_tool: Optional[str] = None
272
276
 
273
277
  source_data: Optional[Dict[str, Any]] = None
274
278
  url: Optional[str] = None
@@ -373,6 +377,7 @@ class IntegrationFinding:
373
377
  cvss_v2_score: Optional[float] = None
374
378
  ip_address: Optional[str] = None
375
379
  plugin_id: Optional[str] = None
380
+ plugin_text: Optional[str] = None
376
381
  dns: Optional[str] = None
377
382
  severity_int: int = 0
378
383
  security_check: Optional[str] = None
@@ -410,6 +415,7 @@ class IntegrationFinding:
410
415
  risk_adjustment: str = "No"
411
416
  operational_requirements: Optional[str] = None
412
417
  deviation_rationale: Optional[str] = None
418
+ is_cwe: bool = False
413
419
 
414
420
  poam_comments: Optional[str] = None
415
421
  vulnerability_id: Optional[int] = None
@@ -1067,6 +1073,10 @@ class ScannerIntegration(ABC):
1067
1073
  softwareVersion=asset.software_version,
1068
1074
  softwareName=asset.software_name,
1069
1075
  softwareVendor=asset.software_vendor,
1076
+ bLatestScan=asset.is_latest_scan,
1077
+ bAuthenticatedScan=asset.is_authenticated_scan,
1078
+ systemAdministratorId=asset.system_administrator_id,
1079
+ scanningTool=asset.scanning_tool,
1070
1080
  )
1071
1081
  if self.asset_identifier_field:
1072
1082
  setattr(new_asset, self.asset_identifier_field, asset.identifier)
@@ -1587,15 +1597,34 @@ class ScannerIntegration(ABC):
1587
1597
  bulk_update=True, defaults={"otherIdentifier": self._get_other_identifier(finding, is_poam)}
1588
1598
  )
1589
1599
 
1600
+ self._handle_property_creation_for_issue(issue, finding)
1601
+ return issue
1602
+
1603
+ def _handle_property_creation_for_issue(self, issue: regscale_models.Issue, finding: IntegrationFinding) -> None:
1604
+ """
1605
+ Handles property creation for an issue based on the finding data
1606
+
1607
+ :param regscale_models.Issue issue: The issue to handle properties for
1608
+ :param IntegrationFinding finding: The finding data
1609
+ :rtype: None
1610
+ """
1590
1611
  if poc := finding.point_of_contact:
1591
- _ = regscale_models.Property(
1612
+ regscale_models.Property(
1592
1613
  key="POC",
1593
1614
  value=poc,
1594
1615
  parentId=issue.id,
1595
1616
  parentModule="issues",
1596
- ).create_or_update(bulk_create=True, bulk_update=True)
1617
+ ).create_or_update()
1618
+ logger.debug("Added POC property %s to issue %s", poc, issue.id)
1597
1619
 
1598
- return issue
1620
+ if finding.is_cwe:
1621
+ regscale_models.Property(
1622
+ key="CWE",
1623
+ value=finding.plugin_id,
1624
+ parentId=issue.id,
1625
+ parentModule="issues",
1626
+ ).create_or_update()
1627
+ logger.debug("Added CWE property %s to issue %s", finding.plugin_id, issue.id)
1599
1628
 
1600
1629
  @staticmethod
1601
1630
  def get_consolidated_asset_identifier(
@@ -1719,15 +1748,16 @@ class ScannerIntegration(ABC):
1719
1748
  :param IntegrationFinding finding: The finding data that has failed
1720
1749
  :rtype: None
1721
1750
  """
1722
- logger.debug("Creating issue for failing finding %s", finding.external_id)
1723
- found_issue = self.create_or_update_issue_from_finding(
1724
- title=issue_title,
1725
- finding=finding,
1726
- )
1727
- # Update the control implementation status to NOT_IMPLEMENTED since we have a failing finding
1728
- if found_issue.controlImplementationIds:
1729
- for control_id in found_issue.controlImplementationIds:
1730
- self.update_control_implementation_status_after_close(control_id)
1751
+ if ScannerVariables.vulnerabilityCreation.lower() != "noissue":
1752
+ logger.debug("Creating issue for failing finding %s", finding.external_id)
1753
+ found_issue = self.create_or_update_issue_from_finding(
1754
+ title=issue_title,
1755
+ finding=finding,
1756
+ )
1757
+ # Update the control implementation status to NOT_IMPLEMENTED since we have a failing finding
1758
+ if found_issue.controlImplementationIds:
1759
+ for control_id in found_issue.controlImplementationIds:
1760
+ self.update_control_implementation_status_after_close(control_id)
1731
1761
 
1732
1762
  def handle_failing_checklist(
1733
1763
  self,
@@ -2013,6 +2043,7 @@ class ScannerIntegration(ABC):
2013
2043
  self._results["scan_history"] = scan_history.save()
2014
2044
  self.update_result_counts("issues", regscale_models.Issue.bulk_save(progress_context=self.finding_progress))
2015
2045
  self.close_outdated_issues(current_vulnerabilities)
2046
+ self._perform_batch_operations(self.finding_progress)
2016
2047
 
2017
2048
  return processed_findings_count
2018
2049
 
@@ -2074,7 +2105,7 @@ class ScannerIntegration(ABC):
2074
2105
  parentId=self.plan_id,
2075
2106
  parentModule=regscale_models.SecurityPlan.get_module_string(),
2076
2107
  scanningTool=self.title,
2077
- scanDate=get_current_datetime(),
2108
+ scanDate=self.scan_date if self.scan_date else get_current_datetime(),
2078
2109
  createdById=self.assessor_id,
2079
2110
  tenantsId=self.tenant_id,
2080
2111
  vLow=0,
@@ -2159,16 +2190,12 @@ class ScannerIntegration(ABC):
2159
2190
  if asset := self.get_asset_by_identifier(finding.asset_identifier):
2160
2191
  if vulnerability_id := self.handle_vulnerability(finding, asset, scan_history):
2161
2192
  current_vulnerabilities[asset.id].add(vulnerability_id)
2162
-
2163
- # Handle failing finding (creates/updates issues) for both checklist and vulnerability cases
2164
- if finding.status != regscale_models.IssueStatus.Closed:
2165
2193
  self.handle_failing_finding(
2166
2194
  issue_title=finding.issue_title or finding.title,
2167
2195
  finding=finding,
2168
2196
  )
2169
-
2170
- # Update scan history severity counts
2171
- self.set_severity_count_for_scan(finding.severity, scan_history)
2197
+ # Update scan history severity counts
2198
+ self.set_severity_count_for_scan(finding.severity, scan_history)
2172
2199
 
2173
2200
  def create_vulnerability_from_finding(
2174
2201
  self, finding: IntegrationFinding, asset: regscale_models.Asset, scan_history: regscale_models.ScanHistory
@@ -2206,7 +2233,8 @@ class ScannerIntegration(ABC):
2206
2233
  plugInName=finding.cve or finding.plugin_name, # Use CVE if available, otherwise use plugin name
2207
2234
  plugInId=finding.plugin_id,
2208
2235
  exploitAvailable=None, # Set this if you have information about exploit availability
2209
- plugInText=finding.observations, # or finding.evidence, whichever is more appropriate
2236
+ plugInText=finding.plugin_text
2237
+ or finding.observations, # or finding.evidence, whichever is more appropriate
2210
2238
  port=finding.port if hasattr(finding, "port") else None,
2211
2239
  protocol=finding.protocol if hasattr(finding, "protocol") else None,
2212
2240
  operatingSystem=asset.operating_system if hasattr(asset, "operating_system") else None,
@@ -2262,11 +2290,12 @@ class ScannerIntegration(ABC):
2262
2290
  vulnerability = self.create_vulnerability_from_finding(finding, asset, scan_history)
2263
2291
  finding.vulnerability_id = vulnerability.id
2264
2292
 
2265
- # Handle associated issue
2266
- self.create_or_update_issue_from_finding(
2267
- title=finding.title,
2268
- finding=finding,
2269
- )
2293
+ if ScannerVariables.vulnerabilityCreation.lower() != "noissue":
2294
+ # Handle associated issue
2295
+ self.create_or_update_issue_from_finding(
2296
+ title=finding.title,
2297
+ finding=finding,
2298
+ )
2270
2299
 
2271
2300
  return vulnerability.id
2272
2301
 
@@ -2548,7 +2577,7 @@ class ScannerIntegration(ABC):
2548
2577
  :rtype: int
2549
2578
  """
2550
2579
  logger.info("Syncing %s findings...", kwargs.get("title", cls.title))
2551
- instance = cls(plan_id=plan_id)
2580
+ instance = cls(plan_id=plan_id, **kwargs)
2552
2581
  instance.set_keys(**kwargs)
2553
2582
  # If a progress object was passed, use it instead of creating a new one
2554
2583
  instance.finding_progress = kwargs.pop("progress") if "progress" in kwargs else create_progress_object()
@@ -2572,9 +2601,17 @@ class ScannerIntegration(ABC):
2572
2601
  logger.info("All findings have been processed successfully.")
2573
2602
 
2574
2603
  if scan_history := instance._results.get("scan_history"):
2604
+ open_count = scan_history.vCritical + scan_history.vHigh + scan_history.vMedium + scan_history.vLow
2605
+ closed_count = findings_processed - open_count
2575
2606
  logger.info(
2576
- "Processed %d findings: %d Critical(s), %d High(s), %d Moderate(s), %d Low(s).",
2607
+ "Processed %d total findings. Open vulnerabilities: %d & Closed vulnerabilities: %d",
2577
2608
  findings_processed,
2609
+ open_count,
2610
+ closed_count,
2611
+ )
2612
+ logger.info(
2613
+ "%d Open vulnerabilities: Critical(s): %d, High(s): %d, Medium(s): %d, Low(s): %d",
2614
+ open_count,
2578
2615
  scan_history.vCritical,
2579
2616
  scan_history.vHigh,
2580
2617
  scan_history.vMedium,
@@ -2623,6 +2660,8 @@ class ScannerIntegration(ABC):
2623
2660
  created_count = instance._results.get("assets", {}).get("created_count", 0)
2624
2661
  updated_count = instance._results.get("assets", {}).get("updated_count", 0)
2625
2662
  dedupe_count = assets_processed - (created_count + updated_count)
2663
+ # Ensure dedupe_count is always a positive value
2664
+ dedupe_count = dedupe_count if dedupe_count >= 0 else dedupe_count * -1
2626
2665
  logger.info(
2627
2666
  "%d assets processed and %d asset(s) deduped. %d asset(s) created & %d asset(s) updated in RegScale.",
2628
2667
  assets_processed,
@@ -2770,6 +2809,7 @@ class ScannerIntegration(ABC):
2770
2809
  :return: None
2771
2810
  :rtype: None
2772
2811
  """
2812
+ logger.info(f"Updating scan history with scan_date {self.scan_date}")
2773
2813
  scan_history.scanDate = datetime_str(self.scan_date)
2774
2814
  scan_history.save()
2775
2815
 
@@ -1,9 +1,83 @@
1
1
  {
2
2
  "title": "CISA Catalog of Known Exploited Vulnerabilities",
3
- "catalogVersion": "2025.03.24",
4
- "dateReleased": "2025-03-24T18:01:34.066Z",
5
- "count": 1308,
3
+ "catalogVersion": "2025.04.03",
4
+ "dateReleased": "2025-04-03T12:34:57.2906Z",
5
+ "count": 1313,
6
6
  "vulnerabilities": [
7
+ {
8
+ "cveID": "CVE-2025-24813",
9
+ "vendorProject": "Apache",
10
+ "product": "Tomcat",
11
+ "vulnerabilityName": "Apache Tomcat Path Equivalence Vulnerability",
12
+ "dateAdded": "2025-04-01",
13
+ "shortDescription": "Apache Tomcat contains a path equivalence vulnerability that allows a remote attacker to execute code, disclose information, or inject malicious content via a partial PUT request.",
14
+ "requiredAction": "Apply mitigations per vendor instructions, follow applicable BOD 22-01 guidance for cloud services, or discontinue use of the product if mitigations are unavailable.",
15
+ "dueDate": "2025-04-22",
16
+ "knownRansomwareCampaignUse": "Unknown",
17
+ "notes": "https:\/\/lists.apache.org\/thread\/j5fkjv2k477os90nczf2v9l61fb0kkgq ; https:\/\/nvd.nist.gov\/vuln\/detail\/CVE-2025-24813",
18
+ "cwes": [
19
+ "CWE-44",
20
+ "CWE-502"
21
+ ]
22
+ },
23
+ {
24
+ "cveID": "CVE-2024-20439",
25
+ "vendorProject": "Cisco",
26
+ "product": "Smart Licensing Utility",
27
+ "vulnerabilityName": "Cisco Smart Licensing Utility Static Credential Vulnerability",
28
+ "dateAdded": "2025-03-31",
29
+ "shortDescription": "Cisco Smart Licensing Utility contains a static credential vulnerability that allows an unauthenticated, remote attacker to log in to an affected system and gain administrative credentials.",
30
+ "requiredAction": "Apply mitigations per vendor instructions, follow applicable BOD 22-01 guidance for cloud services, or discontinue use of the product if mitigations are unavailable.",
31
+ "dueDate": "2025-04-21",
32
+ "knownRansomwareCampaignUse": "Unknown",
33
+ "notes": "https:\/\/sec.cloudapps.cisco.com\/security\/center\/content\/CiscoSecurityAdvisory\/cisco-sa-cslu-7gHMzWmw ; https:\/\/nvd.nist.gov\/vuln\/detail\/CVE-2024-20439",
34
+ "cwes": [
35
+ "CWE-912"
36
+ ]
37
+ },
38
+ {
39
+ "cveID": "CVE-2025-2783",
40
+ "vendorProject": "Google",
41
+ "product": "Chromium Mojo",
42
+ "vulnerabilityName": "Google Chromium Mojo Sandbox Escape Vulnerability",
43
+ "dateAdded": "2025-03-27",
44
+ "shortDescription": "Google Chromium Mojo on Windows contains a sandbox escape vulnerability caused by a logic error, which results from an incorrect handle being provided in unspecified circumstances. This vulnerability could affect multiple web browsers that utilize Chromium, including, but not limited to, Google Chrome, Microsoft Edge, and Opera.",
45
+ "requiredAction": "Apply mitigations per vendor instructions, follow applicable BOD 22-01 guidance for cloud services, or discontinue use of the product if mitigations are unavailable.",
46
+ "dueDate": "2025-04-17",
47
+ "knownRansomwareCampaignUse": "Unknown",
48
+ "notes": "https:\/\/chromereleases.googleblog.com\/2025\/03\/stable-channel-update-for-desktop_25.html ; https:\/\/nvd.nist.gov\/vuln\/detail\/CVE-2025-2783",
49
+ "cwes": []
50
+ },
51
+ {
52
+ "cveID": "CVE-2019-9875",
53
+ "vendorProject": "Sitecore",
54
+ "product": "CMS and Experience Platform (XP)",
55
+ "vulnerabilityName": "Sitecore CMS and Experience Platform (XP) Deserialization Vulnerability",
56
+ "dateAdded": "2025-03-26",
57
+ "shortDescription": "Sitecore CMS and Experience Platform (XP) contain a deserialization vulnerability in the Sitecore.Security.AntiCSRF module that allows an authenticated attacker to execute arbitrary code by sending a serialized .NET object in the HTTP POST parameter __CSRFTOKEN.",
58
+ "requiredAction": "Apply mitigations per vendor instructions, follow applicable BOD 22-01 guidance for cloud services, or discontinue use of the product if mitigations are unavailable.",
59
+ "dueDate": "2025-04-16",
60
+ "knownRansomwareCampaignUse": "Unknown",
61
+ "notes": "https:\/\/support.sitecore.com\/kb?id=kb_article_view&sysparm_article=KB0038556 ; https:\/\/nvd.nist.gov\/vuln\/detail\/CVE-2019-9875",
62
+ "cwes": [
63
+ "CWE-502"
64
+ ]
65
+ },
66
+ {
67
+ "cveID": "CVE-2019-9874",
68
+ "vendorProject": "Sitecore",
69
+ "product": "CMS and Experience Platform (XP)",
70
+ "vulnerabilityName": "Sitecore CMS and Experience Platform (XP) Deserialization Vulnerability",
71
+ "dateAdded": "2025-03-26",
72
+ "shortDescription": "Sitecore CMS and Experience Platform (XP) contain a deserialization vulnerability in the Sitecore.Security.AntiCSRF module that allows an unauthenticated attacker to execute arbitrary code by sending a serialized .NET object in the HTTP POST parameter __CSRFTOKEN.",
73
+ "requiredAction": "Apply mitigations per vendor instructions, follow applicable BOD 22-01 guidance for cloud services, or discontinue use of the product if mitigations are unavailable.",
74
+ "dueDate": "2025-04-16",
75
+ "knownRansomwareCampaignUse": "Unknown",
76
+ "notes": "https:\/\/support.sitecore.com\/kb?id=kb_article_view&sysparm_article=KB0334035 ; https:\/\/nvd.nist.gov\/vuln\/detail\/CVE-2019-9874",
77
+ "cwes": [
78
+ "CWE-502"
79
+ ]
80
+ },
7
81
  {
8
82
  "cveID": "CVE-2025-30154",
9
83
  "vendorProject": "reviewdog",
@@ -11,10 +85,10 @@
11
85
  "vulnerabilityName": "reviewdog\/action-setup GitHub Action Embedded Malicious Code Vulnerability",
12
86
  "dateAdded": "2025-03-24",
13
87
  "shortDescription": "reviewdog action-setup GitHub Action contains an embedded malicious code vulnerability that dumps exposed secrets to Github Actions Workflow Logs.",
14
- "requiredAction": "Apply mitigations per vendor instructions, follow applicable BOD 22-01 guidance for cloud services, or discontinue use of the product if mitigations are unavailable.",
88
+ "requiredAction": "Apply mitigations as set forth in the CISA instructions linked below. Apply mitigations per vendor instructions, follow applicable BOD 22-01 guidance for cloud services, or discontinue use of the product if mitigations are unavailable.",
15
89
  "dueDate": "2025-04-14",
16
90
  "knownRansomwareCampaignUse": "Unknown",
17
- "notes": "This vulnerability affects a common open-source project, third-party library, or a protocol used by different products. For more information, please see: https:\/\/github.com\/reviewdog\/reviewdog\/security\/advisories\/GHSA-qmg3-hpqr-gqvc ; https:\/\/nvd.nist.gov\/vuln\/detail\/CVE-2025-30154",
91
+ "notes": "This vulnerability affects a common open-source project, third-party library, or a protocol used by different products. For more information, please see: CISA Mitigation Instructions: https:\/\/www.cisa.gov\/news-events\/alerts\/2025\/03\/18\/supply-chain-compromise-third-party-tj-actionschanged-files-cve-2025-30066-and-reviewdogaction ; Additional References: https:\/\/github.com\/reviewdog\/reviewdog\/security\/advisories\/GHSA-qmg3-hpqr-gqvc ; https:\/\/nvd.nist.gov\/vuln\/detail\/CVE-2025-30154",
18
92
  "cwes": [
19
93
  "CWE-506"
20
94
  ]
@@ -71,10 +145,10 @@
71
145
  "vulnerabilityName": "tj-actions\/changed-files GitHub Action Embedded Malicious Code Vulnerability",
72
146
  "dateAdded": "2025-03-18",
73
147
  "shortDescription": "tj-actions\/changed-files GitHub Action contains an embedded malicious code vulnerability that allows a remote attacker to discover secrets by reading Github Actions Workflow Logs. These secrets may include, but are not limited to, valid AWS access keys, GitHub personal access tokens (PATs), npm tokens, and private RSA keys.",
74
- "requiredAction": "Apply mitigations per vendor instructions, follow applicable BOD 22-01 guidance for cloud services, or discontinue use of the product if mitigations are unavailable.",
148
+ "requiredAction": "Apply mitigations as set forth in the CISA instructions linked below. Apply mitigations per vendor instructions, follow applicable BOD 22-01 guidance for cloud services, or discontinue use of the product if mitigations are unavailable.",
75
149
  "dueDate": "2025-04-08",
76
150
  "knownRansomwareCampaignUse": "Unknown",
77
- "notes": "This vulnerability affects a common open-source project, third-party library, or a protocol used by different products. For more information, please see: https:\/\/github.com\/tj-actions\/changed-files\/blob\/45fb12d7a8bedb4da42342e52fe054c6c2c3fd73\/README.md?plain=1#L20-L28 ; https:\/\/nvd.nist.gov\/vuln\/detail\/CVE-2025-30066",
151
+ "notes": "This vulnerability affects a common open-source project, third-party library, or a protocol used by different products. For more information, please see: CISA Mitigation Instructions: https:\/\/www.cisa.gov\/news-events\/alerts\/2025\/03\/18\/supply-chain-compromise-third-party-tj-actionschanged-files-cve-2025-30066-and-reviewdogaction ; Additional References: https:\/\/github.com\/tj-actions\/changed-files\/blob\/45fb12d7a8bedb4da42342e52fe054c6c2c3fd73\/README.md?plain=1#L20-L28 ; https:\/\/nvd.nist.gov\/vuln\/detail\/CVE-2025-30066",
78
152
  "cwes": [
79
153
  "CWE-506"
80
154
  ]
@@ -209,7 +283,7 @@
209
283
  "shortDescription": "Microsoft Windows Management Console (MMC) contains an improper neutralization vulnerability that allows an unauthorized attacker to bypass a security feature locally.",
210
284
  "requiredAction": "Apply mitigations per vendor instructions, follow applicable BOD 22-01 guidance for cloud services, or discontinue use of the product if mitigations are unavailable.",
211
285
  "dueDate": "2025-04-01",
212
- "knownRansomwareCampaignUse": "Unknown",
286
+ "knownRansomwareCampaignUse": "Known",
213
287
  "notes": "https:\/\/msrc.microsoft.com\/update-guide\/en-US\/vulnerability\/CVE-2025-26633 ; https:\/\/nvd.nist.gov\/vuln\/detail\/CVE-2025-26633",
214
288
  "cwes": [
215
289
  "CWE-707"
@@ -2964,7 +3038,7 @@
2964
3038
  {
2965
3039
  "cveID": "CVE-2024-4761",
2966
3040
  "vendorProject": "Google",
2967
- "product": "Chromium Visuals",
3041
+ "product": "Chromium V8",
2968
3042
  "vulnerabilityName": "Google Chromium V8 Out-of-Bounds Memory Write Vulnerability",
2969
3043
  "dateAdded": "2024-05-16",
2970
3044
  "shortDescription": "Google Chromium V8 Engine contains an unspecified out-of-bounds memory write vulnerability via a crafted HTML page. This vulnerability could affect multiple web browsers that utilize Chromium, including, but not limited to, Google Chrome, Microsoft Edge, and Opera. ",
@@ -7689,7 +7763,7 @@
7689
7763
  "shortDescription": "Synacor Zimbra Collaboration Suite (ZCS) contains flaw in the mboximport functionality, allowing an authenticated attacker to upload arbitrary files to perform remote code execution. This vulnerability was chained with CVE-2022-37042 which allows for unauthenticated remote code execution.",
7690
7764
  "requiredAction": "Apply updates per vendor instructions.",
7691
7765
  "dueDate": "2022-09-01",
7692
- "knownRansomwareCampaignUse": "Unknown",
7766
+ "knownRansomwareCampaignUse": "Known",
7693
7767
  "notes": "https:\/\/blog.zimbra.com\/2022\/08\/authentication-bypass-in-mailboximportservlet-vulnerability\/; https:\/\/nvd.nist.gov\/vuln\/detail\/CVE-2022-27925",
7694
7768
  "cwes": [
7695
7769
  "CWE-22"
@@ -7704,7 +7778,7 @@
7704
7778
  "shortDescription": "Synacor Zimbra Collaboration Suite (ZCS) contains an authentication bypass vulnerability in MailboxImportServlet. This vulnerability was chained with CVE-2022-27925 which allows for unauthenticated remote code execution.",
7705
7779
  "requiredAction": "Apply updates per vendor instructions.",
7706
7780
  "dueDate": "2022-09-01",
7707
- "knownRansomwareCampaignUse": "Unknown",
7781
+ "knownRansomwareCampaignUse": "Known",
7708
7782
  "notes": "https:\/\/blog.zimbra.com\/2022\/08\/authentication-bypass-in-mailboximportservlet-vulnerability\/; https:\/\/nvd.nist.gov\/vuln\/detail\/CVE-2022-37042",
7709
7783
  "cwes": [
7710
7784
  "CWE-23"
@@ -14619,7 +14693,7 @@
14619
14693
  "cveID": "CVE-2020-6572",
14620
14694
  "vendorProject": "Google",
14621
14695
  "product": "Chrome Media",
14622
- "vulnerabilityName": "Google Chrome Media Prior to 81.0.4044.92 Use-After-Free Vulnerability",
14696
+ "vulnerabilityName": "Google Chrome Media Use-After-Free Vulnerability",
14623
14697
  "dateAdded": "2022-01-10",
14624
14698
  "shortDescription": "Google Chrome Media contains a use-after-free vulnerability that allows a remote attacker to execute code via a crafted HTML page.",
14625
14699
  "requiredAction": "Apply updates per vendor instructions.",
@@ -82,7 +82,7 @@ class FlatFileIntegration(ScannerIntegration):
82
82
  """
83
83
  self.asset_identifier_field = asset_identifier_field
84
84
 
85
- def fetch_assets(self, *args: Any, **kwargs: Any) -> Iterator["IntegrationAsset"]:
85
+ def fetch_assets(self, *args: Tuple, **kwargs: dict) -> Iterator["IntegrationAsset"]:
86
86
  """
87
87
  Fetches assets from FlatFileImporter
88
88
 
@@ -220,16 +220,19 @@ class FlatFileImporter(ABC):
220
220
  )
221
221
  self.clean_up()
222
222
 
223
- def parse_finding(self, vuln: Vulnerability) -> Optional["IntegrationFinding"]:
223
+ def parse_finding(self, vuln: Union[Vulnerability, "IntegrationFinding"]) -> Optional["IntegrationFinding"]:
224
224
  """
225
225
  Parses a vulnerability object into an IntegrationFinding object
226
226
 
227
- :param Vulnerability vuln: A vulnerability object
227
+ :param Union[Vulnerability, IntegrationFinding] vuln: A vulnerability object
228
228
  :return: The parsed IntegrationFinding or None if parsing fails
229
229
  :rtype: Optional[IntegrationFinding]
230
230
  """
231
231
  from regscale.integrations.scanner_integration import IntegrationFinding
232
232
 
233
+ if isinstance(vuln, IntegrationFinding):
234
+ return vuln
235
+
233
236
  try:
234
237
  asset_id = vuln.dns or vuln.ipAddress
235
238
  if not asset_id:
@@ -237,9 +240,9 @@ class FlatFileImporter(ABC):
237
240
 
238
241
  severity = self.finding_severity_map.get(vuln.severity.capitalize(), regscale_models.IssueSeverity.Low)
239
242
  status = self.map_status_to_issue_status(vuln.status)
240
- cve: Optional[str] = vuln.cve if vuln.cve else ""
241
- extract_vuln: Any = self.extract_ghsa_strings(vuln.plugInName or "")
242
- plugin_name = vuln.plugInName if vuln.plugInName else vuln.title
243
+ cve: Optional[str] = getattr(vuln, "cve", "")
244
+ extract_vuln: Any = self.extract_ghsa_strings(getattr(vuln, "plugInName", ""))
245
+ plugin_name = getattr(vuln, "plugInName", getattr(vuln, "title", ""))
243
246
  if not self.assert_valid_cve(cve):
244
247
  if isinstance(extract_vuln, list):
245
248
  cve = ", ".join(extract_vuln)
@@ -286,16 +289,19 @@ class FlatFileImporter(ABC):
286
289
  self.attributes.logger.error("Error parsing Wiz finding: %s", str(e), exc_info=True)
287
290
  return None
288
291
 
289
- def parse_asset(self, asset: Asset) -> "IntegrationAsset":
292
+ def parse_asset(self, asset: Union[Asset, "IntegrationAsset"]) -> "IntegrationAsset":
290
293
  """
291
294
  Converts Asset -> IntegrationAsset
292
295
 
293
- :param Asset asset: The asset to parse
296
+ :param Union[Asset, IntegrationAsset] asset: The asset to parse
294
297
  :return: The parsed IntegrationAsset
295
298
  :rtype: IntegrationAsset
296
299
  """
297
300
  from regscale.integrations.scanner_integration import IntegrationAsset
298
301
 
302
+ if isinstance(asset, IntegrationAsset):
303
+ return asset
304
+
299
305
  return IntegrationAsset(
300
306
  name=asset.name,
301
307
  external_id=asset.otherTrackingNumber,
@@ -514,6 +520,8 @@ class FlatFileImporter(ABC):
514
520
  """
515
521
  Process the assets in the data
516
522
  """
523
+ from regscale.integrations.scanner_integration import IntegrationAsset
524
+
517
525
  # The passed function creates asset objects. Convert to IntegrationAsset here
518
526
  if isinstance(self.file_data, list):
519
527
  for dat in self.file_data:
@@ -523,6 +531,8 @@ class FlatFileImporter(ABC):
523
531
  if isinstance(self.data["assets"], Iterator):
524
532
  self.integration_assets = self.data["assets"]
525
533
  return None
534
+ elif isinstance(self.data["assets"], IntegrationAsset):
535
+ self.data["assets"] = [self.data["assets"]]
526
536
  self.integration_assets = (self.parse_asset(asset) for asset in self.data["assets"])
527
537
 
528
538
  def process_asset_data(self, dat: Any, func: Callable) -> None:
@@ -712,6 +722,17 @@ class FlatFileImporter(ABC):
712
722
 
713
723
  with create_progress_object() as vuln_progress:
714
724
  vuln_task = vuln_progress.add_task("Processing vulnerabilities...", total=len(self.file_data))
725
+ try:
726
+ res = func(self.file_data)
727
+ if isinstance(res, list):
728
+ self.integration_findings = res
729
+ self.data["vulns"] = res
730
+ vuln_progress.update(vuln_task, completed=len(self.file_data))
731
+ return
732
+ except Exception as e:
733
+ self.attributes.logger.debug(
734
+ "Cannot process vulns as a whole, now iterating all data to parse vulns: %s", str(e)
735
+ )
715
736
  for ix, dat in enumerate(self.file_data):
716
737
  vuln = func(dat, index=ix)
717
738
  if not vuln: