prowler-cloud 5.12.3__py3-none-any.whl → 5.13.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.
Files changed (528) hide show
  1. dashboard/assets/markdown-styles.css +34 -0
  2. dashboard/compliance/c5_aws.py +43 -0
  3. dashboard/compliance/ccc_aws.py +36 -0
  4. dashboard/compliance/ccc_azure.py +36 -0
  5. dashboard/compliance/ccc_gcp.py +36 -0
  6. dashboard/compliance/cis_3_0_oci.py +41 -0
  7. dashboard/pages/overview.py +66 -16
  8. prowler/CHANGELOG.md +60 -0
  9. prowler/__main__.py +128 -14
  10. prowler/compliance/aws/aws_account_security_onboarding_aws.json +1 -0
  11. prowler/compliance/aws/aws_audit_manager_control_tower_guardrails_aws.json +1 -0
  12. prowler/compliance/aws/aws_foundational_security_best_practices_aws.json +2 -1
  13. prowler/compliance/aws/aws_foundational_technical_review_aws.json +1 -0
  14. prowler/compliance/aws/aws_well_architected_framework_reliability_pillar_aws.json +1 -0
  15. prowler/compliance/aws/aws_well_architected_framework_security_pillar_aws.json +1 -0
  16. prowler/compliance/aws/c5_aws.json +10744 -0
  17. prowler/compliance/aws/ccc_aws.json +6206 -0
  18. prowler/compliance/aws/cis_1.4_aws.json +1 -0
  19. prowler/compliance/aws/cis_1.5_aws.json +1 -0
  20. prowler/compliance/aws/cis_2.0_aws.json +1 -0
  21. prowler/compliance/aws/cis_3.0_aws.json +1 -0
  22. prowler/compliance/aws/cis_4.0_aws.json +1 -0
  23. prowler/compliance/aws/cis_5.0_aws.json +1 -0
  24. prowler/compliance/aws/cisa_aws.json +1 -0
  25. prowler/compliance/aws/ens_rd2022_aws.json +1 -0
  26. prowler/compliance/aws/fedramp_low_revision_4_aws.json +1 -0
  27. prowler/compliance/aws/fedramp_moderate_revision_4_aws.json +1 -0
  28. prowler/compliance/aws/ffiec_aws.json +1 -0
  29. prowler/compliance/aws/gdpr_aws.json +1 -0
  30. prowler/compliance/aws/gxp_21_cfr_part_11_aws.json +1 -0
  31. prowler/compliance/aws/gxp_eu_annex_11_aws.json +1 -0
  32. prowler/compliance/aws/hipaa_aws.json +1 -0
  33. prowler/compliance/aws/iso27001_2013_aws.json +1 -0
  34. prowler/compliance/aws/iso27001_2022_aws.json +1 -0
  35. prowler/compliance/aws/kisa_isms_p_2023_aws.json +1 -0
  36. prowler/compliance/aws/kisa_isms_p_2023_korean_aws.json +1 -0
  37. prowler/compliance/aws/mitre_attack_aws.json +287 -11
  38. prowler/compliance/aws/nis2_aws.json +1 -0
  39. prowler/compliance/aws/nist_800_171_revision_2_aws.json +1 -0
  40. prowler/compliance/aws/nist_800_53_revision_4_aws.json +1 -0
  41. prowler/compliance/aws/nist_800_53_revision_5_aws.json +1 -0
  42. prowler/compliance/aws/nist_csf_1.1_aws.json +1 -0
  43. prowler/compliance/aws/pci_3.2.1_aws.json +2 -1
  44. prowler/compliance/aws/pci_4.0_aws.json +1 -0
  45. prowler/compliance/aws/prowler_threatscore_aws.json +1 -0
  46. prowler/compliance/aws/rbi_cyber_security_framework_aws.json +1 -0
  47. prowler/compliance/aws/soc2_aws.json +1 -0
  48. prowler/compliance/azure/ccc_azure.json +6147 -0
  49. prowler/compliance/azure/cis_2.0_azure.json +1 -0
  50. prowler/compliance/azure/cis_2.1_azure.json +1 -0
  51. prowler/compliance/azure/cis_3.0_azure.json +1 -0
  52. prowler/compliance/azure/cis_4.0_azure.json +1 -0
  53. prowler/compliance/azure/ens_rd2022_azure.json +1 -0
  54. prowler/compliance/azure/iso27001_2022_azure.json +1 -0
  55. prowler/compliance/azure/mitre_attack_azure.json +131 -5
  56. prowler/compliance/azure/nis2_azure.json +1 -0
  57. prowler/compliance/azure/pci_4.0_azure.json +1 -0
  58. prowler/compliance/azure/prowler_threatscore_azure.json +1 -0
  59. prowler/compliance/azure/soc2_azure.json +1 -0
  60. prowler/compliance/gcp/ccc_gcp.json +6077 -0
  61. prowler/compliance/gcp/cis_2.0_gcp.json +1 -0
  62. prowler/compliance/gcp/cis_3.0_gcp.json +1 -0
  63. prowler/compliance/gcp/cis_4.0_gcp.json +1 -0
  64. prowler/compliance/gcp/ens_rd2022_gcp.json +1 -0
  65. prowler/compliance/gcp/iso27001_2022_gcp.json +1 -0
  66. prowler/compliance/gcp/mitre_attack_gcp.json +287 -11
  67. prowler/compliance/gcp/nis2_gcp.json +1 -0
  68. prowler/compliance/gcp/pci_4.0_gcp.json +1 -0
  69. prowler/compliance/gcp/prowler_threatscore_gcp.json +1 -0
  70. prowler/compliance/gcp/soc2_gcp.json +1 -0
  71. prowler/compliance/github/cis_1.0_github.json +1 -0
  72. prowler/compliance/kubernetes/cis_1.10_kubernetes.json +1 -0
  73. prowler/compliance/kubernetes/cis_1.11_kubernetes.json +1 -0
  74. prowler/compliance/kubernetes/cis_1.8_kubernetes.json +1 -0
  75. prowler/compliance/kubernetes/iso27001_2022_kubernetes.json +1 -0
  76. prowler/compliance/kubernetes/pci_4.0_kubernetes.json +1 -0
  77. prowler/compliance/llm/__init__.py +0 -0
  78. prowler/compliance/m365/cis_4.0_m365.json +1 -0
  79. prowler/compliance/m365/iso27001_2022_m365.json +1 -0
  80. prowler/compliance/m365/prowler_threatscore_m365.json +1 -0
  81. prowler/compliance/nhn/iso27001_2022_nhn.json +1 -0
  82. prowler/compliance/oci/__init__.py +0 -0
  83. prowler/compliance/oci/cis_3.0_oci.json +1141 -0
  84. prowler/config/config.py +5 -1
  85. prowler/config/llm_config.yaml +175015 -0
  86. prowler/config/oraclecloud_mutelist_example.yaml +61 -0
  87. prowler/lib/check/check.py +9 -1
  88. prowler/lib/check/compliance.py +1 -0
  89. prowler/lib/check/compliance_models.py +33 -3
  90. prowler/lib/check/models.py +96 -8
  91. prowler/lib/check/utils.py +8 -2
  92. prowler/lib/cli/parser.py +6 -4
  93. prowler/lib/outputs/compliance/aws_well_architected/aws_well_architected.py +4 -0
  94. prowler/lib/outputs/compliance/aws_well_architected/models.py +2 -0
  95. prowler/lib/outputs/compliance/c5/__init__.py +0 -0
  96. prowler/lib/outputs/compliance/c5/c5.py +98 -0
  97. prowler/lib/outputs/compliance/c5/c5_aws.py +92 -0
  98. prowler/lib/outputs/compliance/c5/models.py +30 -0
  99. prowler/lib/outputs/compliance/ccc/__init__.py +0 -0
  100. prowler/lib/outputs/compliance/ccc/ccc_aws.py +95 -0
  101. prowler/lib/outputs/compliance/ccc/ccc_azure.py +95 -0
  102. prowler/lib/outputs/compliance/ccc/ccc_gcp.py +95 -0
  103. prowler/lib/outputs/compliance/ccc/models.py +90 -0
  104. prowler/lib/outputs/compliance/cis/cis_aws.py +4 -0
  105. prowler/lib/outputs/compliance/cis/cis_azure.py +4 -0
  106. prowler/lib/outputs/compliance/cis/cis_gcp.py +4 -0
  107. prowler/lib/outputs/compliance/cis/cis_github.py +4 -0
  108. prowler/lib/outputs/compliance/cis/cis_kubernetes.py +4 -0
  109. prowler/lib/outputs/compliance/cis/cis_m365.py +4 -0
  110. prowler/lib/outputs/compliance/cis/cis_oci.py +106 -0
  111. prowler/lib/outputs/compliance/cis/models.py +56 -0
  112. prowler/lib/outputs/compliance/compliance.py +10 -0
  113. prowler/lib/outputs/compliance/compliance_output.py +4 -1
  114. prowler/lib/outputs/compliance/ens/ens_aws.py +4 -0
  115. prowler/lib/outputs/compliance/ens/ens_azure.py +4 -0
  116. prowler/lib/outputs/compliance/ens/ens_gcp.py +4 -0
  117. prowler/lib/outputs/compliance/ens/models.py +6 -0
  118. prowler/lib/outputs/compliance/generic/generic.py +4 -0
  119. prowler/lib/outputs/compliance/generic/models.py +2 -0
  120. prowler/lib/outputs/compliance/iso27001/iso27001_aws.py +4 -0
  121. prowler/lib/outputs/compliance/iso27001/iso27001_azure.py +4 -0
  122. prowler/lib/outputs/compliance/iso27001/iso27001_gcp.py +4 -0
  123. prowler/lib/outputs/compliance/iso27001/iso27001_kubernetes.py +4 -0
  124. prowler/lib/outputs/compliance/iso27001/iso27001_m365.py +4 -0
  125. prowler/lib/outputs/compliance/iso27001/iso27001_nhn.py +4 -0
  126. prowler/lib/outputs/compliance/iso27001/models.py +12 -0
  127. prowler/lib/outputs/compliance/kisa_ismsp/kisa_ismsp_aws.py +4 -0
  128. prowler/lib/outputs/compliance/kisa_ismsp/models.py +2 -0
  129. prowler/lib/outputs/compliance/mitre_attack/mitre_attack_aws.py +4 -0
  130. prowler/lib/outputs/compliance/mitre_attack/mitre_attack_azure.py +4 -0
  131. prowler/lib/outputs/compliance/mitre_attack/mitre_attack_gcp.py +4 -0
  132. prowler/lib/outputs/compliance/mitre_attack/models.py +6 -0
  133. prowler/lib/outputs/compliance/prowler_threatscore/models.py +8 -0
  134. prowler/lib/outputs/compliance/prowler_threatscore/prowler_threatscore.py +46 -4
  135. prowler/lib/outputs/compliance/prowler_threatscore/prowler_threatscore_aws.py +4 -0
  136. prowler/lib/outputs/compliance/prowler_threatscore/prowler_threatscore_azure.py +4 -0
  137. prowler/lib/outputs/compliance/prowler_threatscore/prowler_threatscore_gcp.py +4 -0
  138. prowler/lib/outputs/compliance/prowler_threatscore/prowler_threatscore_m365.py +4 -0
  139. prowler/lib/outputs/csv/csv.py +3 -0
  140. prowler/lib/outputs/finding.py +22 -0
  141. prowler/lib/outputs/html/html.py +192 -7
  142. prowler/lib/outputs/jira/jira.py +284 -47
  143. prowler/lib/outputs/ocsf/ocsf.py +1 -4
  144. prowler/lib/outputs/outputs.py +6 -0
  145. prowler/lib/outputs/summary_table.py +10 -0
  146. prowler/providers/aws/aws_regions_by_service.json +221 -44
  147. prowler/providers/aws/lib/quick_inventory/quick_inventory.py +3 -0
  148. prowler/providers/aws/lib/security_hub/security_hub.py +12 -2
  149. prowler/providers/aws/services/accessanalyzer/accessanalyzer_enabled/accessanalyzer_enabled.metadata.json +27 -13
  150. prowler/providers/aws/services/accessanalyzer/accessanalyzer_enabled_without_findings/accessanalyzer_enabled_without_findings.metadata.json +32 -13
  151. prowler/providers/aws/services/account/account_maintain_current_contact_details/account_maintain_current_contact_details.metadata.json +23 -11
  152. prowler/providers/aws/services/account/account_maintain_different_contact_details_to_security_billing_and_operations/account_maintain_different_contact_details_to_security_billing_and_operations.metadata.json +24 -12
  153. prowler/providers/aws/services/account/account_security_contact_information_is_registered/account_security_contact_information_is_registered.metadata.json +19 -11
  154. prowler/providers/aws/services/account/account_security_questions_are_registered_in_the_aws_account/account_security_questions_are_registered_in_the_aws_account.metadata.json +14 -10
  155. prowler/providers/aws/services/acm/acm_certificates_expiration_check/acm_certificates_expiration_check.metadata.json +17 -9
  156. prowler/providers/aws/services/acm/acm_certificates_transparency_logs_enabled/acm_certificates_transparency_logs_enabled.metadata.json +16 -12
  157. prowler/providers/aws/services/acm/acm_certificates_with_secure_key_algorithms/acm_certificates_with_secure_key_algorithms.metadata.json +21 -12
  158. prowler/providers/aws/services/apigateway/apigateway_restapi_authorizers_enabled/apigateway_restapi_authorizers_enabled.metadata.json +23 -16
  159. prowler/providers/aws/services/apigateway/apigateway_restapi_cache_encrypted/apigateway_restapi_cache_encrypted.metadata.json +22 -12
  160. prowler/providers/aws/services/apigateway/apigateway_restapi_client_certificate_enabled/apigateway_restapi_client_certificate_enabled.metadata.json +26 -18
  161. prowler/providers/aws/services/apigateway/apigateway_restapi_logging_enabled/apigateway_restapi_logging_enabled.metadata.json +30 -19
  162. prowler/providers/aws/services/apigateway/apigateway_restapi_public/apigateway_restapi_public.metadata.json +24 -16
  163. prowler/providers/aws/services/apigateway/apigateway_restapi_public_with_authorizer/apigateway_restapi_public_with_authorizer.metadata.json +31 -18
  164. prowler/providers/aws/services/apigateway/apigateway_restapi_tracing_enabled/apigateway_restapi_tracing_enabled.metadata.json +20 -12
  165. prowler/providers/aws/services/apigateway/apigateway_restapi_waf_acl_attached/apigateway_restapi_waf_acl_attached.metadata.json +24 -18
  166. prowler/providers/aws/services/apigatewayv2/apigatewayv2_api_access_logging_enabled/apigatewayv2_api_access_logging_enabled.metadata.json +18 -12
  167. prowler/providers/aws/services/apigatewayv2/apigatewayv2_api_authorizers_enabled/apigatewayv2_api_authorizers_enabled.metadata.json +21 -12
  168. prowler/providers/aws/services/appstream/appstream_fleet_default_internet_access_disabled/appstream_fleet_default_internet_access_disabled.metadata.json +23 -15
  169. prowler/providers/aws/services/appstream/appstream_fleet_maximum_session_duration/appstream_fleet_maximum_session_duration.metadata.json +15 -12
  170. prowler/providers/aws/services/appstream/appstream_fleet_session_disconnect_timeout/appstream_fleet_session_disconnect_timeout.metadata.json +17 -14
  171. prowler/providers/aws/services/appstream/appstream_fleet_session_idle_disconnect_timeout/appstream_fleet_session_idle_disconnect_timeout.metadata.json +20 -15
  172. prowler/providers/aws/services/appsync/appsync_field_level_logging_enabled/appsync_field_level_logging_enabled.metadata.json +21 -12
  173. prowler/providers/aws/services/appsync/appsync_graphql_api_no_api_key_authentication/appsync_graphql_api_no_api_key_authentication.metadata.json +20 -13
  174. prowler/providers/aws/services/athena/athena_workgroup_encryption/athena_workgroup_encryption.metadata.json +24 -12
  175. prowler/providers/aws/services/athena/athena_workgroup_enforce_configuration/athena_workgroup_enforce_configuration.metadata.json +20 -13
  176. prowler/providers/aws/services/athena/athena_workgroup_logging_enabled/athena_workgroup_logging_enabled.metadata.json +21 -12
  177. prowler/providers/aws/services/autoscaling/autoscaling_find_secrets_ec2_launch_configuration/autoscaling_find_secrets_ec2_launch_configuration.metadata.json +15 -10
  178. prowler/providers/aws/services/autoscaling/autoscaling_group_capacity_rebalance_enabled/autoscaling_group_capacity_rebalance_enabled.metadata.json +20 -13
  179. prowler/providers/aws/services/autoscaling/autoscaling_group_elb_health_check_enabled/autoscaling_group_elb_health_check_enabled.metadata.json +20 -12
  180. prowler/providers/aws/services/autoscaling/autoscaling_group_launch_configuration_no_public_ip/autoscaling_group_launch_configuration_no_public_ip.metadata.json +20 -13
  181. prowler/providers/aws/services/autoscaling/autoscaling_group_launch_configuration_requires_imdsv2/autoscaling_group_launch_configuration_requires_imdsv2.metadata.json +26 -14
  182. prowler/providers/aws/services/autoscaling/autoscaling_group_multiple_az/autoscaling_group_multiple_az.metadata.json +22 -13
  183. prowler/providers/aws/services/autoscaling/autoscaling_group_multiple_instance_types/autoscaling_group_multiple_instance_types.metadata.json +21 -13
  184. prowler/providers/aws/services/autoscaling/autoscaling_group_using_ec2_launch_template/autoscaling_group_using_ec2_launch_template.metadata.json +19 -12
  185. prowler/providers/aws/services/autoscaling/autoscaling_service.py +1 -1
  186. prowler/providers/aws/services/awslambda/awslambda_function_inside_vpc/awslambda_function_inside_vpc.metadata.json +26 -13
  187. prowler/providers/aws/services/awslambda/awslambda_function_invoke_api_operations_cloudtrail_logging_enabled/awslambda_function_invoke_api_operations_cloudtrail_logging_enabled.metadata.json +20 -13
  188. prowler/providers/aws/services/awslambda/awslambda_function_no_secrets_in_code/awslambda_function_no_secrets_in_code.metadata.json +18 -9
  189. prowler/providers/aws/services/awslambda/awslambda_function_no_secrets_in_variables/awslambda_function_no_secrets_in_variables.metadata.json +20 -12
  190. prowler/providers/aws/services/awslambda/awslambda_function_not_publicly_accessible/awslambda_function_not_publicly_accessible.metadata.json +21 -12
  191. prowler/providers/aws/services/awslambda/awslambda_function_url_cors_policy/awslambda_function_url_cors_policy.metadata.json +24 -13
  192. prowler/providers/aws/services/awslambda/awslambda_function_url_public/awslambda_function_url_public.metadata.json +22 -12
  193. prowler/providers/aws/services/awslambda/awslambda_function_using_supported_runtimes/awslambda_function_using_supported_runtimes.metadata.json +24 -13
  194. prowler/providers/aws/services/awslambda/awslambda_function_vpc_multi_az/awslambda_function_vpc_multi_az.metadata.json +23 -13
  195. prowler/providers/aws/services/backup/backup_plans_exist/backup_plans_exist.metadata.json +22 -15
  196. prowler/providers/aws/services/backup/backup_recovery_point_encrypted/backup_recovery_point_encrypted.metadata.json +21 -12
  197. prowler/providers/aws/services/backup/backup_reportplans_exist/backup_reportplans_exist.metadata.json +19 -15
  198. prowler/providers/aws/services/backup/backup_vaults_encrypted/backup_vaults_encrypted.metadata.json +24 -13
  199. prowler/providers/aws/services/backup/backup_vaults_exist/backup_vaults_exist.metadata.json +19 -15
  200. prowler/providers/aws/services/cloudformation/cloudformation_stack_cdktoolkit_bootstrap_version/cloudformation_stack_cdktoolkit_bootstrap_version.metadata.json +24 -13
  201. prowler/providers/aws/services/cloudformation/cloudformation_stack_outputs_find_secrets/cloudformation_stack_outputs_find_secrets.metadata.json +22 -12
  202. prowler/providers/aws/services/cloudformation/cloudformation_stacks_termination_protection_enabled/cloudformation_stacks_termination_protection_enabled.metadata.json +21 -12
  203. prowler/providers/aws/services/cloudfront/cloudfront_distributions_custom_ssl_certificate/cloudfront_distributions_custom_ssl_certificate.metadata.json +21 -12
  204. prowler/providers/aws/services/cloudfront/cloudfront_distributions_default_root_object/cloudfront_distributions_default_root_object.metadata.json +19 -12
  205. prowler/providers/aws/services/cloudfront/cloudfront_distributions_field_level_encryption_enabled/cloudfront_distributions_field_level_encryption_enabled.metadata.json +19 -12
  206. prowler/providers/aws/services/cloudfront/cloudfront_distributions_geo_restrictions_enabled/cloudfront_distributions_geo_restrictions_enabled.metadata.json +22 -13
  207. prowler/providers/aws/services/cloudfront/cloudfront_distributions_https_enabled/cloudfront_distributions_https_enabled.metadata.json +21 -12
  208. prowler/providers/aws/services/cloudfront/cloudfront_distributions_https_sni_enabled/cloudfront_distributions_https_sni_enabled.metadata.json +20 -12
  209. prowler/providers/aws/services/cloudfront/cloudfront_distributions_logging_enabled/cloudfront_distributions_logging_enabled.metadata.json +22 -13
  210. prowler/providers/aws/services/cloudfront/cloudfront_distributions_multiple_origin_failover_configured/cloudfront_distributions_multiple_origin_failover_configured.metadata.json +21 -16
  211. prowler/providers/aws/services/cloudfront/cloudfront_distributions_origin_traffic_encrypted/cloudfront_distributions_origin_traffic_encrypted.metadata.json +27 -14
  212. prowler/providers/aws/services/cloudfront/cloudfront_distributions_s3_origin_access_control/cloudfront_distributions_s3_origin_access_control.metadata.json +24 -14
  213. prowler/providers/aws/services/cloudfront/cloudfront_distributions_s3_origin_non_existent_bucket/cloudfront_distributions_s3_origin_non_existent_bucket.metadata.json +18 -11
  214. prowler/providers/aws/services/cloudfront/cloudfront_distributions_using_deprecated_ssl_protocols/cloudfront_distributions_using_deprecated_ssl_protocols.metadata.json +20 -12
  215. prowler/providers/aws/services/cloudfront/cloudfront_distributions_using_waf/cloudfront_distributions_using_waf.metadata.json +21 -12
  216. prowler/providers/aws/services/cloudtrail/cloudtrail_bucket_requires_mfa_delete/cloudtrail_bucket_requires_mfa_delete.metadata.json +16 -11
  217. prowler/providers/aws/services/cloudtrail/cloudtrail_cloudwatch_logging_enabled/cloudtrail_cloudwatch_logging_enabled.metadata.json +19 -15
  218. prowler/providers/aws/services/cloudtrail/cloudtrail_insights_exist/cloudtrail_insights_exist.metadata.json +19 -14
  219. prowler/providers/aws/services/cloudtrail/cloudtrail_kms_encryption_enabled/cloudtrail_kms_encryption_enabled.metadata.json +19 -14
  220. prowler/providers/aws/services/cloudtrail/cloudtrail_log_file_validation_enabled/cloudtrail_log_file_validation_enabled.metadata.json +20 -13
  221. prowler/providers/aws/services/cloudtrail/cloudtrail_logs_s3_bucket_access_logging_enabled/cloudtrail_logs_s3_bucket_access_logging_enabled.metadata.json +18 -13
  222. prowler/providers/aws/services/cloudtrail/cloudtrail_logs_s3_bucket_is_not_publicly_accessible/cloudtrail_logs_s3_bucket_is_not_publicly_accessible.metadata.json +24 -16
  223. prowler/providers/aws/services/cloudtrail/cloudtrail_multi_region_enabled/cloudtrail_multi_region_enabled.metadata.json +17 -13
  224. prowler/providers/aws/services/cloudtrail/cloudtrail_multi_region_enabled_logging_management_events/cloudtrail_multi_region_enabled_logging_management_events.metadata.json +19 -12
  225. prowler/providers/aws/services/cloudtrail/cloudtrail_s3_dataevents_read_enabled/cloudtrail_s3_dataevents_read_enabled.metadata.json +22 -12
  226. prowler/providers/aws/services/cloudtrail/cloudtrail_s3_dataevents_write_enabled/cloudtrail_s3_dataevents_write_enabled.metadata.json +21 -11
  227. prowler/providers/aws/services/cloudtrail/cloudtrail_threat_detection_enumeration/cloudtrail_threat_detection_enumeration.metadata.json +22 -11
  228. prowler/providers/aws/services/cloudtrail/cloudtrail_threat_detection_llm_jacking/cloudtrail_threat_detection_llm_jacking.metadata.json +25 -12
  229. prowler/providers/aws/services/cloudtrail/cloudtrail_threat_detection_privilege_escalation/cloudtrail_threat_detection_privilege_escalation.metadata.json +18 -10
  230. prowler/providers/aws/services/config/config_recorder_all_regions_enabled/config_recorder_all_regions_enabled.metadata.json +20 -12
  231. prowler/providers/aws/services/config/config_recorder_using_aws_service_role/config_recorder_using_aws_service_role.metadata.json +20 -13
  232. prowler/providers/aws/services/directoryservice/directoryservice_directory_log_forwarding_enabled/directoryservice_directory_log_forwarding_enabled.metadata.json +20 -11
  233. prowler/providers/aws/services/directoryservice/directoryservice_directory_monitor_notifications/directoryservice_directory_monitor_notifications.metadata.json +19 -11
  234. prowler/providers/aws/services/directoryservice/directoryservice_directory_snapshots_limit/directoryservice_directory_snapshots_limit.metadata.json +19 -10
  235. prowler/providers/aws/services/directoryservice/directoryservice_ldap_certificate_expiration/directoryservice_ldap_certificate_expiration.metadata.json +20 -11
  236. prowler/providers/aws/services/directoryservice/directoryservice_radius_server_security_protocol/directoryservice_radius_server_security_protocol.metadata.json +23 -12
  237. prowler/providers/aws/services/directoryservice/directoryservice_supported_mfa_radius_enabled/directoryservice_supported_mfa_radius_enabled.metadata.json +23 -12
  238. prowler/providers/aws/services/dlm/dlm_ebs_snapshot_lifecycle_policy_exists/dlm_ebs_snapshot_lifecycle_policy_exists.metadata.json +19 -13
  239. prowler/providers/aws/services/dms/dms_endpoint_mongodb_authentication_enabled/dms_endpoint_mongodb_authentication_enabled.metadata.json +20 -13
  240. prowler/providers/aws/services/dms/dms_endpoint_neptune_iam_authorization_enabled/dms_endpoint_neptune_iam_authorization_enabled.metadata.json +19 -12
  241. prowler/providers/aws/services/dms/dms_endpoint_redis_in_transit_encryption_enabled/dms_endpoint_redis_in_transit_encryption_enabled.metadata.json +23 -13
  242. prowler/providers/aws/services/dms/dms_endpoint_ssl_enabled/dms_endpoint_ssl_enabled.metadata.json +27 -19
  243. prowler/providers/aws/services/dms/dms_instance_minor_version_upgrade_enabled/dms_instance_minor_version_upgrade_enabled.metadata.json +22 -12
  244. prowler/providers/aws/services/dms/dms_instance_multi_az_enabled/dms_instance_multi_az_enabled.metadata.json +20 -13
  245. prowler/providers/aws/services/dms/dms_instance_no_public_access/dms_instance_no_public_access.metadata.json +22 -11
  246. prowler/providers/aws/services/dms/dms_replication_task_source_logging_enabled/dms_replication_task_source_logging_enabled.metadata.json +21 -13
  247. prowler/providers/aws/services/dms/dms_replication_task_target_logging_enabled/dms_replication_task_target_logging_enabled.metadata.json +22 -13
  248. prowler/providers/aws/services/dms/dms_replication_task_target_logging_enabled/dms_replication_task_target_logging_enabled.py +39 -37
  249. prowler/providers/aws/services/dms/dms_service.py +0 -1
  250. prowler/providers/aws/services/ec2/ec2_ami_public/ec2_ami_public.py +11 -10
  251. prowler/providers/aws/services/ec2/ec2_instance_with_outdated_ami/__init__.py +0 -0
  252. prowler/providers/aws/services/ec2/ec2_instance_with_outdated_ami/ec2_instance_with_outdated_ami.metadata.json +30 -0
  253. prowler/providers/aws/services/ec2/ec2_instance_with_outdated_ami/ec2_instance_with_outdated_ami.py +52 -0
  254. prowler/providers/aws/services/ec2/ec2_service.py +26 -14
  255. prowler/providers/aws/services/efs/efs_access_point_enforce_root_directory/efs_access_point_enforce_root_directory.metadata.json +19 -13
  256. prowler/providers/aws/services/efs/efs_access_point_enforce_user_identity/efs_access_point_enforce_user_identity.metadata.json +23 -13
  257. prowler/providers/aws/services/efs/efs_encryption_at_rest_enabled/efs_encryption_at_rest_enabled.metadata.json +23 -13
  258. prowler/providers/aws/services/efs/efs_have_backup_enabled/efs_have_backup_enabled.metadata.json +20 -14
  259. prowler/providers/aws/services/efs/efs_mount_target_not_publicly_accessible/efs_mount_target_not_publicly_accessible.metadata.json +18 -12
  260. prowler/providers/aws/services/efs/efs_multi_az_enabled/efs_multi_az_enabled.metadata.json +21 -13
  261. prowler/providers/aws/services/efs/efs_not_publicly_accessible/efs_not_publicly_accessible.metadata.json +17 -13
  262. prowler/providers/aws/services/eks/eks_cluster_uses_a_supported_version/eks_cluster_uses_a_supported_version.py +4 -0
  263. prowler/providers/aws/services/elb/elb_ssl_listeners_use_acm_certificate/elb_ssl_listeners_use_acm_certificate.py +8 -2
  264. prowler/providers/aws/services/neptune/neptune_cluster_backup_enabled/neptune_cluster_backup_enabled.metadata.json +23 -13
  265. prowler/providers/aws/services/neptune/neptune_cluster_copy_tags_to_snapshots/neptune_cluster_copy_tags_to_snapshots.metadata.json +18 -14
  266. prowler/providers/aws/services/neptune/neptune_cluster_deletion_protection/neptune_cluster_deletion_protection.metadata.json +23 -14
  267. prowler/providers/aws/services/neptune/neptune_cluster_iam_authentication_enabled/neptune_cluster_iam_authentication_enabled.metadata.json +25 -13
  268. prowler/providers/aws/services/neptune/neptune_cluster_integration_cloudwatch_logs/neptune_cluster_integration_cloudwatch_logs.metadata.json +22 -14
  269. prowler/providers/aws/services/neptune/neptune_cluster_multi_az/neptune_cluster_multi_az.metadata.json +20 -12
  270. prowler/providers/aws/services/neptune/neptune_cluster_public_snapshot/neptune_cluster_public_snapshot.metadata.json +18 -10
  271. prowler/providers/aws/services/neptune/neptune_cluster_snapshot_encrypted/neptune_cluster_snapshot_encrypted.metadata.json +16 -10
  272. prowler/providers/aws/services/neptune/neptune_cluster_storage_encrypted/neptune_cluster_storage_encrypted.metadata.json +22 -13
  273. prowler/providers/aws/services/neptune/neptune_cluster_uses_public_subnet/neptune_cluster_uses_public_subnet.metadata.json +20 -12
  274. prowler/providers/aws/services/rds/rds_service.py +9 -2
  275. prowler/providers/aws/services/vpc/vpc_service.py +1 -1
  276. prowler/providers/azure/services/entra/entra_service.py +54 -25
  277. prowler/providers/common/arguments.py +16 -2
  278. prowler/providers/common/provider.py +34 -2
  279. prowler/providers/gcp/services/cloudsql/cloudsql_service.py +3 -3
  280. prowler/providers/gcp/services/cloudstorage/cloudstorage_bucket_lifecycle_management_enabled/__init__.py +0 -0
  281. prowler/providers/gcp/services/cloudstorage/cloudstorage_bucket_lifecycle_management_enabled/cloudstorage_bucket_lifecycle_management_enabled.metadata.json +34 -0
  282. prowler/providers/gcp/services/cloudstorage/cloudstorage_bucket_lifecycle_management_enabled/cloudstorage_bucket_lifecycle_management_enabled.py +48 -0
  283. prowler/providers/gcp/services/cloudstorage/cloudstorage_service.py +10 -0
  284. prowler/providers/gcp/services/compute/compute_project_os_login_enabled/compute_project_os_login_enabled.py +5 -0
  285. prowler/providers/gcp/services/iam/iam_audit_logs_enabled/iam_audit_logs_enabled.py +5 -0
  286. prowler/providers/gcp/services/iam/iam_role_kms_enforce_separation_of_duties/iam_role_kms_enforce_separation_of_duties.py +5 -0
  287. prowler/providers/gcp/services/logging/logging_log_metric_filter_and_alert_for_audit_configuration_changes_enabled/logging_log_metric_filter_and_alert_for_audit_configuration_changes_enabled.py +5 -0
  288. prowler/providers/gcp/services/logging/logging_log_metric_filter_and_alert_for_bucket_permission_changes_enabled/logging_log_metric_filter_and_alert_for_bucket_permission_changes_enabled.py +5 -0
  289. prowler/providers/gcp/services/logging/logging_log_metric_filter_and_alert_for_custom_role_changes_enabled/logging_log_metric_filter_and_alert_for_custom_role_changes_enabled.py +5 -0
  290. prowler/providers/gcp/services/logging/logging_log_metric_filter_and_alert_for_project_ownership_changes_enabled/logging_log_metric_filter_and_alert_for_project_ownership_changes_enabled.py +5 -0
  291. prowler/providers/gcp/services/logging/logging_log_metric_filter_and_alert_for_sql_instance_configuration_changes_enabled/logging_log_metric_filter_and_alert_for_sql_instance_configuration_changes_enabled.py +5 -0
  292. prowler/providers/gcp/services/logging/logging_log_metric_filter_and_alert_for_vpc_firewall_rule_changes_enabled/logging_log_metric_filter_and_alert_for_vpc_firewall_rule_changes_enabled.py +5 -0
  293. prowler/providers/gcp/services/logging/logging_log_metric_filter_and_alert_for_vpc_network_changes_enabled/logging_log_metric_filter_and_alert_for_vpc_network_changes_enabled.py +5 -0
  294. prowler/providers/gcp/services/logging/logging_log_metric_filter_and_alert_for_vpc_network_route_changes_enabled/logging_log_metric_filter_and_alert_for_vpc_network_route_changes_enabled.py +5 -0
  295. prowler/providers/gcp/services/logging/logging_sink_created/logging_sink_created.py +5 -0
  296. prowler/providers/gcp/services/monitoring/monitoring_service.py +30 -2
  297. prowler/providers/iac/iac_provider.py +1 -1
  298. prowler/providers/llm/__init__.py +0 -0
  299. prowler/providers/llm/lib/__init__.py +0 -0
  300. prowler/providers/llm/lib/arguments/__init__.py +0 -0
  301. prowler/providers/llm/lib/arguments/arguments.py +13 -0
  302. prowler/providers/llm/llm_provider.py +518 -0
  303. prowler/providers/llm/models.py +27 -0
  304. prowler/providers/m365/exceptions/exceptions.py +0 -55
  305. prowler/providers/m365/lib/arguments/arguments.py +8 -4
  306. prowler/providers/m365/lib/powershell/m365_powershell.py +14 -156
  307. prowler/providers/m365/m365_provider.py +19 -117
  308. prowler/providers/m365/models.py +0 -3
  309. prowler/providers/m365/services/admincenter/admincenter_service.py +52 -23
  310. prowler/providers/m365/services/entra/entra_admin_users_phishing_resistant_mfa_enabled/entra_admin_users_phishing_resistant_mfa_enabled.py +19 -2
  311. prowler/providers/m365/services/entra/entra_service.py +58 -30
  312. prowler/providers/m365/services/sharepoint/sharepoint_service.py +24 -3
  313. prowler/providers/oraclecloud/__init__.py +0 -0
  314. prowler/providers/oraclecloud/config.py +61 -0
  315. prowler/providers/oraclecloud/exceptions/__init__.py +0 -0
  316. prowler/providers/oraclecloud/exceptions/exceptions.py +197 -0
  317. prowler/providers/oraclecloud/lib/__init__.py +0 -0
  318. prowler/providers/oraclecloud/lib/arguments/__init__.py +0 -0
  319. prowler/providers/oraclecloud/lib/arguments/arguments.py +123 -0
  320. prowler/providers/oraclecloud/lib/mutelist/__init__.py +0 -0
  321. prowler/providers/oraclecloud/lib/mutelist/mutelist.py +176 -0
  322. prowler/providers/oraclecloud/lib/service/__init__.py +0 -0
  323. prowler/providers/oraclecloud/lib/service/service.py +213 -0
  324. prowler/providers/oraclecloud/models.py +96 -0
  325. prowler/providers/oraclecloud/oci_provider.py +1038 -0
  326. prowler/providers/oraclecloud/services/__init__.py +0 -0
  327. prowler/providers/oraclecloud/services/analytics/__init__.py +0 -0
  328. prowler/providers/oraclecloud/services/analytics/analytics_client.py +6 -0
  329. prowler/providers/oraclecloud/services/analytics/analytics_instance_access_restricted/__init__.py +0 -0
  330. prowler/providers/oraclecloud/services/analytics/analytics_instance_access_restricted/analytics_instance_access_restricted.metadata.json +36 -0
  331. prowler/providers/oraclecloud/services/analytics/analytics_instance_access_restricted/analytics_instance_access_restricted.py +48 -0
  332. prowler/providers/oraclecloud/services/analytics/analytics_service.py +99 -0
  333. prowler/providers/oraclecloud/services/audit/__init__.py +0 -0
  334. prowler/providers/oraclecloud/services/audit/audit_client.py +4 -0
  335. prowler/providers/oraclecloud/services/audit/audit_log_retention_period_365_days/__init__.py +0 -0
  336. prowler/providers/oraclecloud/services/audit/audit_log_retention_period_365_days/audit_log_retention_period_365_days.metadata.json +37 -0
  337. prowler/providers/oraclecloud/services/audit/audit_log_retention_period_365_days/audit_log_retention_period_365_days.py +46 -0
  338. prowler/providers/oraclecloud/services/audit/audit_service.py +57 -0
  339. prowler/providers/oraclecloud/services/blockstorage/__init__.py +0 -0
  340. prowler/providers/oraclecloud/services/blockstorage/blockstorage_block_volume_encrypted_with_cmk/__init__.py +0 -0
  341. prowler/providers/oraclecloud/services/blockstorage/blockstorage_block_volume_encrypted_with_cmk/blockstorage_block_volume_encrypted_with_cmk.metadata.json +37 -0
  342. prowler/providers/oraclecloud/services/blockstorage/blockstorage_block_volume_encrypted_with_cmk/blockstorage_block_volume_encrypted_with_cmk.py +39 -0
  343. prowler/providers/oraclecloud/services/blockstorage/blockstorage_boot_volume_encrypted_with_cmk/__init__.py +0 -0
  344. prowler/providers/oraclecloud/services/blockstorage/blockstorage_boot_volume_encrypted_with_cmk/blockstorage_boot_volume_encrypted_with_cmk.metadata.json +36 -0
  345. prowler/providers/oraclecloud/services/blockstorage/blockstorage_boot_volume_encrypted_with_cmk/blockstorage_boot_volume_encrypted_with_cmk.py +35 -0
  346. prowler/providers/oraclecloud/services/blockstorage/blockstorage_client.py +6 -0
  347. prowler/providers/oraclecloud/services/blockstorage/blockstorage_service.py +182 -0
  348. prowler/providers/oraclecloud/services/cloudguard/__init__.py +0 -0
  349. prowler/providers/oraclecloud/services/cloudguard/cloudguard_client.py +6 -0
  350. prowler/providers/oraclecloud/services/cloudguard/cloudguard_enabled/__init__.py +0 -0
  351. prowler/providers/oraclecloud/services/cloudguard/cloudguard_enabled/cloudguard_enabled.metadata.json +36 -0
  352. prowler/providers/oraclecloud/services/cloudguard/cloudguard_enabled/cloudguard_enabled.py +39 -0
  353. prowler/providers/oraclecloud/services/cloudguard/cloudguard_service.py +63 -0
  354. prowler/providers/oraclecloud/services/compute/__init__.py +0 -0
  355. prowler/providers/oraclecloud/services/compute/compute_client.py +4 -0
  356. prowler/providers/oraclecloud/services/compute/compute_instance_in_transit_encryption_enabled/__init__.py +0 -0
  357. prowler/providers/oraclecloud/services/compute/compute_instance_in_transit_encryption_enabled/compute_instance_in_transit_encryption_enabled.metadata.json +37 -0
  358. prowler/providers/oraclecloud/services/compute/compute_instance_in_transit_encryption_enabled/compute_instance_in_transit_encryption_enabled.py +38 -0
  359. prowler/providers/oraclecloud/services/compute/compute_instance_legacy_metadata_endpoint_disabled/__init__.py +0 -0
  360. prowler/providers/oraclecloud/services/compute/compute_instance_legacy_metadata_endpoint_disabled/compute_instance_legacy_metadata_endpoint_disabled.metadata.json +37 -0
  361. prowler/providers/oraclecloud/services/compute/compute_instance_legacy_metadata_endpoint_disabled/compute_instance_legacy_metadata_endpoint_disabled.py +37 -0
  362. prowler/providers/oraclecloud/services/compute/compute_instance_secure_boot_enabled/__init__.py +0 -0
  363. prowler/providers/oraclecloud/services/compute/compute_instance_secure_boot_enabled/compute_instance_secure_boot_enabled.metadata.json +37 -0
  364. prowler/providers/oraclecloud/services/compute/compute_instance_secure_boot_enabled/compute_instance_secure_boot_enabled.py +39 -0
  365. prowler/providers/oraclecloud/services/compute/compute_service.py +136 -0
  366. prowler/providers/oraclecloud/services/database/__init__.py +0 -0
  367. prowler/providers/oraclecloud/services/database/database_autonomous_database_access_restricted/__init__.py +0 -0
  368. prowler/providers/oraclecloud/services/database/database_autonomous_database_access_restricted/database_autonomous_database_access_restricted.metadata.json +36 -0
  369. prowler/providers/oraclecloud/services/database/database_autonomous_database_access_restricted/database_autonomous_database_access_restricted.py +40 -0
  370. prowler/providers/oraclecloud/services/database/database_client.py +6 -0
  371. prowler/providers/oraclecloud/services/database/database_service.py +79 -0
  372. prowler/providers/oraclecloud/services/events/__init__.py +0 -0
  373. prowler/providers/oraclecloud/services/events/events_client.py +4 -0
  374. prowler/providers/oraclecloud/services/events/events_notification_topic_and_subscription_exists/__init__.py +0 -0
  375. prowler/providers/oraclecloud/services/events/events_notification_topic_and_subscription_exists/events_notification_topic_and_subscription_exists.metadata.json +37 -0
  376. prowler/providers/oraclecloud/services/events/events_notification_topic_and_subscription_exists/events_notification_topic_and_subscription_exists.py +53 -0
  377. prowler/providers/oraclecloud/services/events/events_rule_cloudguard_problems/__init__.py +0 -0
  378. prowler/providers/oraclecloud/services/events/events_rule_cloudguard_problems/events_rule_cloudguard_problems.metadata.json +36 -0
  379. prowler/providers/oraclecloud/services/events/events_rule_cloudguard_problems/events_rule_cloudguard_problems.py +90 -0
  380. prowler/providers/oraclecloud/services/events/events_rule_iam_group_changes/__init__.py +0 -0
  381. prowler/providers/oraclecloud/services/events/events_rule_iam_group_changes/events_rule_iam_group_changes.metadata.json +37 -0
  382. prowler/providers/oraclecloud/services/events/events_rule_iam_group_changes/events_rule_iam_group_changes.py +67 -0
  383. prowler/providers/oraclecloud/services/events/events_rule_iam_policy_changes/__init__.py +0 -0
  384. prowler/providers/oraclecloud/services/events/events_rule_iam_policy_changes/events_rule_iam_policy_changes.metadata.json +37 -0
  385. prowler/providers/oraclecloud/services/events/events_rule_iam_policy_changes/events_rule_iam_policy_changes.py +67 -0
  386. prowler/providers/oraclecloud/services/events/events_rule_identity_provider_changes/__init__.py +0 -0
  387. prowler/providers/oraclecloud/services/events/events_rule_identity_provider_changes/events_rule_identity_provider_changes.metadata.json +37 -0
  388. prowler/providers/oraclecloud/services/events/events_rule_identity_provider_changes/events_rule_identity_provider_changes.py +67 -0
  389. prowler/providers/oraclecloud/services/events/events_rule_idp_group_mapping_changes/__init__.py +0 -0
  390. prowler/providers/oraclecloud/services/events/events_rule_idp_group_mapping_changes/events_rule_idp_group_mapping_changes.metadata.json +37 -0
  391. prowler/providers/oraclecloud/services/events/events_rule_idp_group_mapping_changes/events_rule_idp_group_mapping_changes.py +67 -0
  392. prowler/providers/oraclecloud/services/events/events_rule_local_user_authentication/__init__.py +0 -0
  393. prowler/providers/oraclecloud/services/events/events_rule_local_user_authentication/events_rule_local_user_authentication.metadata.json +38 -0
  394. prowler/providers/oraclecloud/services/events/events_rule_local_user_authentication/events_rule_local_user_authentication.py +63 -0
  395. prowler/providers/oraclecloud/services/events/events_rule_network_gateway_changes/__init__.py +0 -0
  396. prowler/providers/oraclecloud/services/events/events_rule_network_gateway_changes/events_rule_network_gateway_changes.metadata.json +37 -0
  397. prowler/providers/oraclecloud/services/events/events_rule_network_gateway_changes/events_rule_network_gateway_changes.py +88 -0
  398. prowler/providers/oraclecloud/services/events/events_rule_network_security_group_changes/__init__.py +0 -0
  399. prowler/providers/oraclecloud/services/events/events_rule_network_security_group_changes/events_rule_network_security_group_changes.metadata.json +37 -0
  400. prowler/providers/oraclecloud/services/events/events_rule_network_security_group_changes/events_rule_network_security_group_changes.py +68 -0
  401. prowler/providers/oraclecloud/services/events/events_rule_route_table_changes/__init__.py +0 -0
  402. prowler/providers/oraclecloud/services/events/events_rule_route_table_changes/events_rule_route_table_changes.metadata.json +37 -0
  403. prowler/providers/oraclecloud/services/events/events_rule_route_table_changes/events_rule_route_table_changes.py +68 -0
  404. prowler/providers/oraclecloud/services/events/events_rule_security_list_changes/__init__.py +0 -0
  405. prowler/providers/oraclecloud/services/events/events_rule_security_list_changes/events_rule_security_list_changes.metadata.json +37 -0
  406. prowler/providers/oraclecloud/services/events/events_rule_security_list_changes/events_rule_security_list_changes.py +68 -0
  407. prowler/providers/oraclecloud/services/events/events_rule_user_changes/__init__.py +0 -0
  408. prowler/providers/oraclecloud/services/events/events_rule_user_changes/events_rule_user_changes.metadata.json +37 -0
  409. prowler/providers/oraclecloud/services/events/events_rule_user_changes/events_rule_user_changes.py +69 -0
  410. prowler/providers/oraclecloud/services/events/events_rule_vcn_changes/__init__.py +0 -0
  411. prowler/providers/oraclecloud/services/events/events_rule_vcn_changes/events_rule_vcn_changes.metadata.json +37 -0
  412. prowler/providers/oraclecloud/services/events/events_rule_vcn_changes/events_rule_vcn_changes.py +65 -0
  413. prowler/providers/oraclecloud/services/events/events_service.py +215 -0
  414. prowler/providers/oraclecloud/services/events/lib/__init__.py +0 -0
  415. prowler/providers/oraclecloud/services/events/lib/helpers.py +116 -0
  416. prowler/providers/oraclecloud/services/filestorage/__init__.py +0 -0
  417. prowler/providers/oraclecloud/services/filestorage/filestorage_client.py +6 -0
  418. prowler/providers/oraclecloud/services/filestorage/filestorage_file_system_encrypted_with_cmk/__init__.py +0 -0
  419. prowler/providers/oraclecloud/services/filestorage/filestorage_file_system_encrypted_with_cmk/filestorage_file_system_encrypted_with_cmk.metadata.json +36 -0
  420. prowler/providers/oraclecloud/services/filestorage/filestorage_file_system_encrypted_with_cmk/filestorage_file_system_encrypted_with_cmk.py +39 -0
  421. prowler/providers/oraclecloud/services/filestorage/filestorage_service.py +96 -0
  422. prowler/providers/oraclecloud/services/identity/__init__.py +0 -0
  423. prowler/providers/oraclecloud/services/identity/identity_client.py +4 -0
  424. prowler/providers/oraclecloud/services/identity/identity_iam_admins_cannot_update_tenancy_admins/__init__.py +0 -0
  425. prowler/providers/oraclecloud/services/identity/identity_iam_admins_cannot_update_tenancy_admins/identity_iam_admins_cannot_update_tenancy_admins.metadata.json +36 -0
  426. prowler/providers/oraclecloud/services/identity/identity_iam_admins_cannot_update_tenancy_admins/identity_iam_admins_cannot_update_tenancy_admins.py +107 -0
  427. prowler/providers/oraclecloud/services/identity/identity_instance_principal_used/__init__.py +0 -0
  428. prowler/providers/oraclecloud/services/identity/identity_instance_principal_used/identity_instance_principal_used.metadata.json +36 -0
  429. prowler/providers/oraclecloud/services/identity/identity_instance_principal_used/identity_instance_principal_used.py +70 -0
  430. prowler/providers/oraclecloud/services/identity/identity_no_resources_in_root_compartment/__init__.py +0 -0
  431. prowler/providers/oraclecloud/services/identity/identity_no_resources_in_root_compartment/identity_no_resources_in_root_compartment.metadata.json +32 -0
  432. prowler/providers/oraclecloud/services/identity/identity_no_resources_in_root_compartment/identity_no_resources_in_root_compartment.py +51 -0
  433. prowler/providers/oraclecloud/services/identity/identity_non_root_compartment_exists/__init__.py +0 -0
  434. prowler/providers/oraclecloud/services/identity/identity_non_root_compartment_exists/identity_non_root_compartment_exists.metadata.json +32 -0
  435. prowler/providers/oraclecloud/services/identity/identity_non_root_compartment_exists/identity_non_root_compartment_exists.py +39 -0
  436. prowler/providers/oraclecloud/services/identity/identity_password_policy_expires_within_365_days/__init__.py +0 -0
  437. prowler/providers/oraclecloud/services/identity/identity_password_policy_expires_within_365_days/identity_password_policy_expires_within_365_days.metadata.json +36 -0
  438. prowler/providers/oraclecloud/services/identity/identity_password_policy_expires_within_365_days/identity_password_policy_expires_within_365_days.py +67 -0
  439. prowler/providers/oraclecloud/services/identity/identity_password_policy_minimum_length_14/__init__.py +0 -0
  440. prowler/providers/oraclecloud/services/identity/identity_password_policy_minimum_length_14/identity_password_policy_minimum_length_14.metadata.json +36 -0
  441. prowler/providers/oraclecloud/services/identity/identity_password_policy_minimum_length_14/identity_password_policy_minimum_length_14.py +97 -0
  442. prowler/providers/oraclecloud/services/identity/identity_password_policy_prevents_reuse/__init__.py +0 -0
  443. prowler/providers/oraclecloud/services/identity/identity_password_policy_prevents_reuse/identity_password_policy_prevents_reuse.metadata.json +36 -0
  444. prowler/providers/oraclecloud/services/identity/identity_password_policy_prevents_reuse/identity_password_policy_prevents_reuse.py +77 -0
  445. prowler/providers/oraclecloud/services/identity/identity_service.py +828 -0
  446. prowler/providers/oraclecloud/services/identity/identity_service_level_admins_exist/__init__.py +0 -0
  447. prowler/providers/oraclecloud/services/identity/identity_service_level_admins_exist/identity_service_level_admins_exist.metadata.json +32 -0
  448. prowler/providers/oraclecloud/services/identity/identity_service_level_admins_exist/identity_service_level_admins_exist.py +81 -0
  449. prowler/providers/oraclecloud/services/identity/identity_tenancy_admin_permissions_limited/__init__.py +0 -0
  450. prowler/providers/oraclecloud/services/identity/identity_tenancy_admin_permissions_limited/identity_tenancy_admin_permissions_limited.metadata.json +36 -0
  451. prowler/providers/oraclecloud/services/identity/identity_tenancy_admin_permissions_limited/identity_tenancy_admin_permissions_limited.py +81 -0
  452. prowler/providers/oraclecloud/services/identity/identity_tenancy_admin_users_no_api_keys/__init__.py +0 -0
  453. prowler/providers/oraclecloud/services/identity/identity_tenancy_admin_users_no_api_keys/identity_tenancy_admin_users_no_api_keys.metadata.json +36 -0
  454. prowler/providers/oraclecloud/services/identity/identity_tenancy_admin_users_no_api_keys/identity_tenancy_admin_users_no_api_keys.py +49 -0
  455. prowler/providers/oraclecloud/services/identity/identity_user_api_keys_rotated_90_days/__init__.py +0 -0
  456. prowler/providers/oraclecloud/services/identity/identity_user_api_keys_rotated_90_days/identity_user_api_keys_rotated_90_days.metadata.json +37 -0
  457. prowler/providers/oraclecloud/services/identity/identity_user_api_keys_rotated_90_days/identity_user_api_keys_rotated_90_days.py +73 -0
  458. prowler/providers/oraclecloud/services/identity/identity_user_auth_tokens_rotated_90_days/__init__.py +0 -0
  459. prowler/providers/oraclecloud/services/identity/identity_user_auth_tokens_rotated_90_days/identity_user_auth_tokens_rotated_90_days.metadata.json +36 -0
  460. prowler/providers/oraclecloud/services/identity/identity_user_auth_tokens_rotated_90_days/identity_user_auth_tokens_rotated_90_days.py +52 -0
  461. prowler/providers/oraclecloud/services/identity/identity_user_customer_secret_keys_rotated_90_days/__init__.py +0 -0
  462. prowler/providers/oraclecloud/services/identity/identity_user_customer_secret_keys_rotated_90_days/identity_user_customer_secret_keys_rotated_90_days.metadata.json +36 -0
  463. prowler/providers/oraclecloud/services/identity/identity_user_customer_secret_keys_rotated_90_days/identity_user_customer_secret_keys_rotated_90_days.py +49 -0
  464. prowler/providers/oraclecloud/services/identity/identity_user_db_passwords_rotated_90_days/__init__.py +0 -0
  465. prowler/providers/oraclecloud/services/identity/identity_user_db_passwords_rotated_90_days/identity_user_db_passwords_rotated_90_days.metadata.json +36 -0
  466. prowler/providers/oraclecloud/services/identity/identity_user_db_passwords_rotated_90_days/identity_user_db_passwords_rotated_90_days.py +49 -0
  467. prowler/providers/oraclecloud/services/identity/identity_user_mfa_enabled_console_access/__init__.py +0 -0
  468. prowler/providers/oraclecloud/services/identity/identity_user_mfa_enabled_console_access/identity_user_mfa_enabled_console_access.metadata.json +36 -0
  469. prowler/providers/oraclecloud/services/identity/identity_user_mfa_enabled_console_access/identity_user_mfa_enabled_console_access.py +43 -0
  470. prowler/providers/oraclecloud/services/identity/identity_user_valid_email_address/__init__.py +0 -0
  471. prowler/providers/oraclecloud/services/identity/identity_user_valid_email_address/identity_user_valid_email_address.metadata.json +36 -0
  472. prowler/providers/oraclecloud/services/identity/identity_user_valid_email_address/identity_user_valid_email_address.py +38 -0
  473. prowler/providers/oraclecloud/services/integration/__init__.py +0 -0
  474. prowler/providers/oraclecloud/services/integration/integration_client.py +8 -0
  475. prowler/providers/oraclecloud/services/integration/integration_instance_access_restricted/__init__.py +0 -0
  476. prowler/providers/oraclecloud/services/integration/integration_instance_access_restricted/integration_instance_access_restricted.metadata.json +36 -0
  477. prowler/providers/oraclecloud/services/integration/integration_instance_access_restricted/integration_instance_access_restricted.py +48 -0
  478. prowler/providers/oraclecloud/services/integration/integration_service.py +92 -0
  479. prowler/providers/oraclecloud/services/kms/__init__.py +0 -0
  480. prowler/providers/oraclecloud/services/kms/kms_client.py +4 -0
  481. prowler/providers/oraclecloud/services/kms/kms_key_rotation_enabled/__init__.py +0 -0
  482. prowler/providers/oraclecloud/services/kms/kms_key_rotation_enabled/kms_key_rotation_enabled.metadata.json +36 -0
  483. prowler/providers/oraclecloud/services/kms/kms_key_rotation_enabled/kms_key_rotation_enabled.py +37 -0
  484. prowler/providers/oraclecloud/services/kms/kms_service.py +136 -0
  485. prowler/providers/oraclecloud/services/logging/__init__.py +0 -0
  486. prowler/providers/oraclecloud/services/logging/logging_client.py +6 -0
  487. prowler/providers/oraclecloud/services/logging/logging_service.py +189 -0
  488. prowler/providers/oraclecloud/services/network/__init__.py +0 -0
  489. prowler/providers/oraclecloud/services/network/network_client.py +4 -0
  490. prowler/providers/oraclecloud/services/network/network_default_security_list_restricts_traffic/__init__.py +0 -0
  491. prowler/providers/oraclecloud/services/network/network_default_security_list_restricts_traffic/network_default_security_list_restricts_traffic.metadata.json +36 -0
  492. prowler/providers/oraclecloud/services/network/network_default_security_list_restricts_traffic/network_default_security_list_restricts_traffic.py +99 -0
  493. prowler/providers/oraclecloud/services/network/network_security_group_ingress_from_internet_to_rdp_port/__init__.py +0 -0
  494. prowler/providers/oraclecloud/services/network/network_security_group_ingress_from_internet_to_rdp_port/network_security_group_ingress_from_internet_to_rdp_port.metadata.json +36 -0
  495. prowler/providers/oraclecloud/services/network/network_security_group_ingress_from_internet_to_rdp_port/network_security_group_ingress_from_internet_to_rdp_port.py +65 -0
  496. prowler/providers/oraclecloud/services/network/network_security_group_ingress_from_internet_to_ssh_port/__init__.py +0 -0
  497. prowler/providers/oraclecloud/services/network/network_security_group_ingress_from_internet_to_ssh_port/network_security_group_ingress_from_internet_to_ssh_port.metadata.json +37 -0
  498. prowler/providers/oraclecloud/services/network/network_security_group_ingress_from_internet_to_ssh_port/network_security_group_ingress_from_internet_to_ssh_port.py +70 -0
  499. prowler/providers/oraclecloud/services/network/network_security_list_ingress_from_internet_to_rdp_port/__init__.py +0 -0
  500. prowler/providers/oraclecloud/services/network/network_security_list_ingress_from_internet_to_rdp_port/network_security_list_ingress_from_internet_to_rdp_port.metadata.json +36 -0
  501. prowler/providers/oraclecloud/services/network/network_security_list_ingress_from_internet_to_rdp_port/network_security_list_ingress_from_internet_to_rdp_port.py +62 -0
  502. prowler/providers/oraclecloud/services/network/network_security_list_ingress_from_internet_to_ssh_port/__init__.py +0 -0
  503. prowler/providers/oraclecloud/services/network/network_security_list_ingress_from_internet_to_ssh_port/network_security_list_ingress_from_internet_to_ssh_port.metadata.json +37 -0
  504. prowler/providers/oraclecloud/services/network/network_security_list_ingress_from_internet_to_ssh_port/network_security_list_ingress_from_internet_to_ssh_port.py +67 -0
  505. prowler/providers/oraclecloud/services/network/network_service.py +321 -0
  506. prowler/providers/oraclecloud/services/network/network_vcn_subnet_flow_logs_enabled/__init__.py +0 -0
  507. prowler/providers/oraclecloud/services/network/network_vcn_subnet_flow_logs_enabled/network_vcn_subnet_flow_logs_enabled.metadata.json +36 -0
  508. prowler/providers/oraclecloud/services/network/network_vcn_subnet_flow_logs_enabled/network_vcn_subnet_flow_logs_enabled.py +66 -0
  509. prowler/providers/oraclecloud/services/objectstorage/__init__.py +0 -0
  510. prowler/providers/oraclecloud/services/objectstorage/objectstorage_bucket_encrypted_with_cmk/__init__.py +0 -0
  511. prowler/providers/oraclecloud/services/objectstorage/objectstorage_bucket_encrypted_with_cmk/objectstorage_bucket_encrypted_with_cmk.metadata.json +37 -0
  512. prowler/providers/oraclecloud/services/objectstorage/objectstorage_bucket_encrypted_with_cmk/objectstorage_bucket_encrypted_with_cmk.py +40 -0
  513. prowler/providers/oraclecloud/services/objectstorage/objectstorage_bucket_logging_enabled/__init__.py +0 -0
  514. prowler/providers/oraclecloud/services/objectstorage/objectstorage_bucket_logging_enabled/objectstorage_bucket_logging_enabled.metadata.json +32 -0
  515. prowler/providers/oraclecloud/services/objectstorage/objectstorage_bucket_logging_enabled/objectstorage_bucket_logging_enabled.py +68 -0
  516. prowler/providers/oraclecloud/services/objectstorage/objectstorage_bucket_not_publicly_accessible/__init__.py +0 -0
  517. prowler/providers/oraclecloud/services/objectstorage/objectstorage_bucket_not_publicly_accessible/objectstorage_bucket_not_publicly_accessible.metadata.json +37 -0
  518. prowler/providers/oraclecloud/services/objectstorage/objectstorage_bucket_not_publicly_accessible/objectstorage_bucket_not_publicly_accessible.py +43 -0
  519. prowler/providers/oraclecloud/services/objectstorage/objectstorage_bucket_versioning_enabled/__init__.py +0 -0
  520. prowler/providers/oraclecloud/services/objectstorage/objectstorage_bucket_versioning_enabled/objectstorage_bucket_versioning_enabled.metadata.json +37 -0
  521. prowler/providers/oraclecloud/services/objectstorage/objectstorage_bucket_versioning_enabled/objectstorage_bucket_versioning_enabled.py +38 -0
  522. prowler/providers/oraclecloud/services/objectstorage/objectstorage_client.py +6 -0
  523. prowler/providers/oraclecloud/services/objectstorage/objectstorage_service.py +138 -0
  524. {prowler_cloud-5.12.3.dist-info → prowler_cloud-5.13.0.dist-info}/METADATA +9 -33
  525. {prowler_cloud-5.12.3.dist-info → prowler_cloud-5.13.0.dist-info}/RECORD +528 -280
  526. {prowler_cloud-5.12.3.dist-info → prowler_cloud-5.13.0.dist-info}/LICENSE +0 -0
  527. {prowler_cloud-5.12.3.dist-info → prowler_cloud-5.13.0.dist-info}/WHEEL +0 -0
  528. {prowler_cloud-5.12.3.dist-info → prowler_cloud-5.13.0.dist-info}/entry_points.txt +0 -0
@@ -0,0 +1,518 @@
1
+ import json
2
+ import os
3
+ import subprocess
4
+ import sys
5
+ from typing import List
6
+
7
+ import yaml
8
+ from alive_progress import alive_bar
9
+ from colorama import Fore, Style
10
+
11
+ from prowler.config.config import (
12
+ default_config_file_path,
13
+ default_redteam_config_file_path,
14
+ load_and_validate_config_file,
15
+ )
16
+ from prowler.lib.check.models import CheckReportLLM
17
+ from prowler.lib.logger import logger
18
+ from prowler.lib.utils.utils import print_boxes
19
+ from prowler.providers.common.models import Audit_Metadata
20
+ from prowler.providers.common.provider import Provider
21
+
22
+
23
+ class LlmProvider(Provider):
24
+ _type: str = "llm"
25
+ audit_metadata: Audit_Metadata
26
+ model: str = ""
27
+
28
+ def __init__(
29
+ self,
30
+ max_concurrency: int = 10,
31
+ config_path: str = None,
32
+ config_content: dict = None,
33
+ fixer_config: dict = {},
34
+ ):
35
+ logger.info("Instantiating LLM Provider...")
36
+ logger.info(f"Received config_path: {config_path}")
37
+
38
+ self.max_concurrency = max_concurrency
39
+ # For LLM provider, only use config_path if it's not the default Prowler config
40
+ if config_path and config_path != default_config_file_path:
41
+ self.config_path = config_path
42
+ else:
43
+ self.config_path = default_redteam_config_file_path
44
+
45
+ # Read config file and extract model
46
+ with open(self.config_path, "r") as config_file:
47
+ config = yaml.safe_load(config_file)
48
+ self.model = config.get("targets", [])[0].get("id", "No model available.")
49
+ # Extract only the plugin IDs
50
+ plugins_data = config.get("redteam", {}).get("plugins", [])
51
+ self.plugins = [
52
+ plugin.get("id") for plugin in plugins_data if plugin.get("id")
53
+ ]
54
+ self.region = "global"
55
+ self.audited_account = "local-llm"
56
+ self._session = None
57
+ self._identity = "prowler"
58
+ self._auth_method = "No auth"
59
+
60
+ # Audit Config
61
+ if config_content:
62
+ self._audit_config = config_content
63
+ elif self.config_path:
64
+ self._audit_config = load_and_validate_config_file(
65
+ self._type, self.config_path
66
+ )
67
+ else:
68
+ # For LLM provider, use empty config if no config file provided
69
+ self._audit_config = {}
70
+
71
+ # Fixer Config
72
+ self._fixer_config = fixer_config
73
+
74
+ # Mutelist (not needed for LLM since promptfoo has its own logic)
75
+ self._mutelist = None
76
+
77
+ self.audit_metadata = Audit_Metadata(
78
+ provider=self._type,
79
+ account_id=self.audited_account,
80
+ account_name="llm",
81
+ region=self.region,
82
+ services_scanned=0, # LLM doesn't use services
83
+ expected_checks=[], # LLM doesn't use checks
84
+ completed_checks=0, # LLM doesn't use progress tracking
85
+ audit_progress=0, # LLM doesn't use progress tracking
86
+ )
87
+
88
+ # Set this provider as the global provider
89
+ Provider.set_global_provider(self)
90
+
91
+ @property
92
+ def type(self):
93
+ return self._type
94
+
95
+ @property
96
+ def identity(self):
97
+ return self._identity
98
+
99
+ @property
100
+ def session(self):
101
+ return self._session
102
+
103
+ @property
104
+ def audit_config(self):
105
+ return self._audit_config
106
+
107
+ @property
108
+ def fixer_config(self):
109
+ return self._fixer_config
110
+
111
+ @property
112
+ def auth_method(self):
113
+ return self._auth_method
114
+
115
+ def setup_session(self):
116
+ """LLM provider doesn't need a session since it uses promptfoo directly"""
117
+
118
+ def _process_check(self, finding: dict) -> CheckReportLLM:
119
+ """
120
+ Process a single check (failed or passed) and create a CheckReportIAC object.
121
+
122
+ Args:
123
+ finding: The finding object from Trivy output
124
+ file_path: The path to the file that contains the finding
125
+ type: The type of the finding
126
+
127
+ Returns:
128
+ CheckReportIAC: The processed check report
129
+ """
130
+ try:
131
+ status = "FAIL"
132
+ if finding.get("success"):
133
+ status = "PASS"
134
+
135
+ metadata_dict = {
136
+ "Provider": "llm",
137
+ "CheckID": finding["metadata"]["pluginId"],
138
+ "CheckTitle": finding["metadata"]["goal"],
139
+ "CheckType": ["LLM Security"],
140
+ "ServiceName": finding["metadata"]["pluginId"].split(":")[0],
141
+ "SubServiceName": "",
142
+ "ResourceIdTemplate": "",
143
+ "Severity": finding["metadata"]["severity"].lower(),
144
+ "ResourceType": "llm",
145
+ "Description": finding["metadata"]["goal"],
146
+ "Risk": "",
147
+ "RelatedUrl": "",
148
+ "Remediation": {
149
+ "Code": {
150
+ "NativeIaC": "",
151
+ "Terraform": "",
152
+ "CLI": "",
153
+ "Other": "",
154
+ },
155
+ "Recommendation": {
156
+ "Text": "",
157
+ "Url": "",
158
+ },
159
+ },
160
+ "Categories": [],
161
+ "DependsOn": [],
162
+ "RelatedTo": [],
163
+ "Notes": "",
164
+ }
165
+
166
+ # Convert metadata dict to JSON string
167
+ metadata = json.dumps(metadata_dict)
168
+
169
+ report = CheckReportLLM(
170
+ metadata=metadata,
171
+ finding=finding,
172
+ )
173
+ report.status = status
174
+ status_extended = (
175
+ finding.get("gradingResult", {})
176
+ .get("componentResults", [{}])[0]
177
+ .get("reason", "No assertions found.")
178
+ )
179
+ report.status_extended = status_extended
180
+ return report
181
+ except Exception as error:
182
+ logger.critical(
183
+ f"{error.__class__.__name__}:{error.__traceback__.tb_lineno} -- {error}"
184
+ )
185
+ sys.exit(1)
186
+
187
+ def _process_finding_line(
188
+ self, line: str, reports: list, streaming_callback=None, progress_counter=None
189
+ ) -> bool:
190
+ """
191
+ Process a single line from the report file and add to reports if valid.
192
+
193
+ Args:
194
+ line: JSON line from the report file
195
+ reports: List to append the processed report to
196
+ streaming_callback: Optional callback for streaming mode
197
+ progress_counter: Optional dict to track progress {'completed': int, 'total': int, 'completed_test_ids': set}
198
+
199
+ Returns:
200
+ bool: True if a valid finding was processed, False otherwise
201
+ """
202
+ try:
203
+ finding = json.loads(line.strip())
204
+ # Extract testIdx and track unique tests
205
+ test_idx = finding.get("testIdx")
206
+ if test_idx is not None and progress_counter is not None:
207
+ if test_idx not in progress_counter["completed_test_ids"]:
208
+ progress_counter["completed_test_ids"].add(test_idx)
209
+ progress_counter["completed"] += 1
210
+ if finding.get("prompt", {}).get("raw"):
211
+ if finding.get("response", {}).get("error"):
212
+ logger.error(f"Error: {finding.get('response', {}).get('error')}")
213
+ return False
214
+ elif finding.get("error"):
215
+ logger.error(f"{finding.get('error')}")
216
+ return False
217
+ report = self._process_check(finding)
218
+ if report:
219
+ reports.append(report)
220
+ if streaming_callback:
221
+ streaming_callback([report])
222
+ return True
223
+ except json.JSONDecodeError as json_error:
224
+ logger.error(
225
+ f"Error decoding JSON line: {json_error} - Line content: {line.strip()}"
226
+ )
227
+ return False
228
+
229
+ def run(self) -> List[CheckReportLLM]:
230
+ """Main method to run the LLM security scan"""
231
+ try:
232
+ return self.run_scan()
233
+ except Exception as error:
234
+ logger.error(f"Error running LLM scan: {error}")
235
+ return []
236
+
237
+ def run_scan(self, streaming_callback) -> List[CheckReportLLM]:
238
+ """Run promptfoo red team scan and process its output."""
239
+ report_path = None
240
+ try:
241
+ logger.info("Running LLM security scan...")
242
+
243
+ # Use config file if provided, otherwise let promptfoo use its defaults
244
+ if self.config_path:
245
+ if not os.path.exists(self.config_path):
246
+ logger.error(f"Config file not found: {self.config_path}")
247
+ return []
248
+ config_path = self.config_path
249
+ logger.info(f"Using provided config file: {config_path}")
250
+
251
+ # Set output path for the scan results
252
+ report_path = "/tmp/prowler_promptfoo_results.jsonl"
253
+
254
+ promptfoo_command = [
255
+ "promptfoo",
256
+ "redteam",
257
+ "eval",
258
+ "--output",
259
+ report_path,
260
+ "--max-concurrency",
261
+ str(self.max_concurrency),
262
+ "--no-cache",
263
+ "--config",
264
+ config_path,
265
+ ]
266
+
267
+ logger.info(f"Running promptfoo command: {' '.join(promptfoo_command)}")
268
+
269
+ process = subprocess.Popen(
270
+ promptfoo_command,
271
+ stdout=subprocess.PIPE,
272
+ stderr=subprocess.PIPE,
273
+ text=True,
274
+ encoding="utf-8",
275
+ env=os.environ,
276
+ )
277
+
278
+ return self._stream_findings(process, report_path, streaming_callback)
279
+
280
+ except Exception as error:
281
+ if "No such file or directory: 'promptfoo'" in str(error):
282
+ logger.critical(
283
+ "Promptfoo binary not found. Please install promptfoo from https://promptfoo.dev/docs/installation/ or use your system package manager (e.g., 'npm install -g promptfoo' or 'brew install promptfoo' on macOS)"
284
+ )
285
+ sys.exit(1)
286
+ logger.critical(
287
+ f"{error.__class__.__name__}:{error.__traceback__.tb_lineno} -- {error}"
288
+ )
289
+ return []
290
+ finally:
291
+ # Clean up temporary report file
292
+ if report_path and os.path.exists(report_path):
293
+ os.remove(report_path)
294
+ logger.info(f"Cleaned up promptfoo report file: {report_path}")
295
+
296
+ def _stream_findings(self, process, report_path, streaming_callback):
297
+ """Stream findings in real-time as they are written to the output file."""
298
+ import queue
299
+ import re
300
+ import threading
301
+ import time
302
+
303
+ reports = []
304
+ processed_lines = set() # Track which lines we've already processed
305
+ error_queue = queue.Queue() # Thread-safe communication for errors
306
+
307
+ def monitor_file():
308
+ """Monitor the output file for new findings."""
309
+ try:
310
+ while process.poll() is None: # While process is still running
311
+ if os.path.exists(report_path):
312
+ try:
313
+ with open(
314
+ report_path, "r", encoding="utf-8"
315
+ ) as report_file:
316
+ lines = report_file.readlines()
317
+
318
+ # Process only new lines
319
+ for i, line in enumerate(lines):
320
+ if i not in processed_lines and line.strip():
321
+ if self._process_finding_line(
322
+ line,
323
+ reports,
324
+ streaming_callback,
325
+ progress_counter,
326
+ ):
327
+ processed_lines.add(i)
328
+ except Exception as e:
329
+ logger.debug(f"Error reading report file: {e}")
330
+
331
+ time.sleep(0.5) # Check every 500ms
332
+ except Exception as e:
333
+ logger.debug(f"Monitor file thread error: {e}")
334
+
335
+ def process_stdout(error_queue):
336
+ """Process stdout to extract test count information and detect errors."""
337
+ try:
338
+ for line in process.stdout:
339
+ if (
340
+ "Redteam evals require email verification. Please enter your work email"
341
+ in line
342
+ ):
343
+ error_queue.put(
344
+ "Please, provide first your work email in promptfoo with `promptfoo config set email <email>` command."
345
+ )
346
+ process.terminate()
347
+ return
348
+ if "No promptfooconfig found" in line:
349
+ error_queue.put(
350
+ "No config file found. Please, provide a valid promptfoo config file."
351
+ )
352
+ process.terminate()
353
+ return
354
+ if (
355
+ "Warning: Config file has a redteam section but no test cases."
356
+ in line
357
+ ):
358
+ error_queue.put(
359
+ "Please, generate first the test cases using `promptfoo redteam generate` command."
360
+ )
361
+ process.terminate()
362
+ return
363
+
364
+ # Extract total number of tests from stdout
365
+ test_count_match = re.search(
366
+ r"Running (\d+) test cases \(up to \d+ at a time\)", line
367
+ )
368
+ if test_count_match and progress_counter["total"] == 0:
369
+ progress_counter["total"] = int(test_count_match.group(1))
370
+ logger.info(
371
+ f"Found {progress_counter['total']} test cases to run"
372
+ )
373
+ except Exception as e:
374
+ logger.debug(f"Process stdout thread error: {e}")
375
+
376
+ # Create progress counter dictionary
377
+ progress_counter = {"completed": 0, "total": 0, "completed_test_ids": set()}
378
+ previous_completed = 0 # Track previous completed count for bar updates
379
+
380
+ # Start monitoring in separate threads
381
+ monitor_thread = threading.Thread(target=monitor_file)
382
+ monitor_thread.daemon = True
383
+ monitor_thread.start()
384
+
385
+ stdout_thread = threading.Thread(target=process_stdout, args=(error_queue,))
386
+ stdout_thread.daemon = True
387
+ stdout_thread.start()
388
+
389
+ # Wait for total number of tests to be detected or error
390
+ while process.poll() is None and progress_counter["total"] == 0:
391
+ # Check for errors from background thread
392
+ try:
393
+ error_msg = error_queue.get_nowait()
394
+ logger.critical(error_msg)
395
+ process.terminate()
396
+ process.wait() # Ensure cleanup
397
+ sys.exit(1)
398
+ except queue.Empty:
399
+ pass
400
+
401
+ time.sleep(0.5) # Wait for total to be detected
402
+
403
+ # If process finished before we detected total, handle it
404
+ if process.poll() is not None and progress_counter["total"] == 0:
405
+ # Check for any final errors
406
+ try:
407
+ error_msg = error_queue.get_nowait()
408
+ logger.critical(error_msg)
409
+ sys.exit(1)
410
+ except queue.Empty:
411
+ pass
412
+
413
+ process.wait()
414
+ logger.critical(
415
+ f"Promptfoo exited with a non-zero exit code {process.returncode} {process.stderr.read()}"
416
+ )
417
+ sys.exit(1)
418
+
419
+ # Now create the progress bar with the known total
420
+ with alive_bar(
421
+ total=progress_counter["total"],
422
+ ctrl_c=False,
423
+ bar="blocks",
424
+ spinner="classic",
425
+ stats=False,
426
+ enrich_print=False,
427
+ ) as bar:
428
+ try:
429
+ bar.title = f"-> Running LLM security scan on {self.model}..."
430
+
431
+ # Update progress bar while process is running
432
+ while process.poll() is None:
433
+ # Check for errors from background thread during execution
434
+ try:
435
+ error_msg = error_queue.get_nowait()
436
+ logger.critical(error_msg)
437
+ process.terminate()
438
+ process.wait() # Ensure cleanup
439
+ bar.title = "-> LLM security scan failed!"
440
+ sys.exit(1)
441
+ except queue.Empty:
442
+ pass
443
+
444
+ # Update the progress by incrementing by the difference
445
+ if progress_counter["completed"] > previous_completed:
446
+ bar(progress_counter["completed"] - previous_completed)
447
+ previous_completed = progress_counter["completed"]
448
+
449
+ time.sleep(0.5) # Update every 500ms
450
+
451
+ # Wait for process to complete
452
+ process.wait()
453
+
454
+ # Wait a bit more for any final findings to be written
455
+ time.sleep(1)
456
+
457
+ # Process any remaining findings
458
+ if os.path.exists(report_path):
459
+ try:
460
+ with open(report_path, "r", encoding="utf-8") as report_file:
461
+ lines = report_file.readlines()
462
+ for i, line in enumerate(lines):
463
+ if i not in processed_lines and line.strip():
464
+ self._process_finding_line(
465
+ line,
466
+ reports,
467
+ streaming_callback,
468
+ progress_counter,
469
+ )
470
+ except Exception as e:
471
+ logger.error(f"Error processing final findings: {e}")
472
+
473
+ bar.title = "-> LLM security scan completed!"
474
+
475
+ except Exception as error:
476
+ bar.title = "-> LLM security scan failed!"
477
+ raise error
478
+
479
+ # Check for errors
480
+ stderr = process.stderr.read()
481
+ if stderr:
482
+ logger.error(f"Promptfoo stderr:\n{stderr}")
483
+
484
+ if (
485
+ process.returncode != 0
486
+ and process.returncode != 100
487
+ and process.returncode is not None
488
+ and process.returncode != -2
489
+ ):
490
+ logger.error(
491
+ f"Promptfoo exited with a non-zero exit code: {process.returncode}"
492
+ )
493
+ sys.exit(1)
494
+
495
+ return reports
496
+
497
+ def print_credentials(self):
498
+ """Print the LLM provider credentials and configuration"""
499
+ report_title = f"{Style.BRIGHT}Scanning LLM:{Style.RESET_ALL}"
500
+ report_lines = [
501
+ f"Target LLM: {Fore.YELLOW}{self.model}{Style.RESET_ALL}",
502
+ ]
503
+ if self.plugins:
504
+ report_lines.append(
505
+ f"Plugins: {Fore.YELLOW}{', '.join(self.plugins)}{Style.RESET_ALL}"
506
+ )
507
+ if self.config_path:
508
+ report_lines.append(
509
+ f"Config file: {Fore.YELLOW}{self.config_path}{Style.RESET_ALL}"
510
+ )
511
+ else:
512
+ report_lines.append("Using promptfoo default configuration")
513
+
514
+ report_lines.append(
515
+ f"Max concurrency: {Fore.YELLOW}{self.max_concurrency}{Style.RESET_ALL}"
516
+ )
517
+
518
+ print_boxes(report_lines, report_title)
@@ -0,0 +1,27 @@
1
+ from prowler.config.config import output_file_timestamp
2
+ from prowler.providers.common.models import ProviderOutputOptions
3
+
4
+
5
+ class LLMOutputOptions(ProviderOutputOptions):
6
+ """
7
+ LLMOutputOptions overrides ProviderOutputOptions for LLM-specific output logic.
8
+ For example, generating a filename that includes the LLM tenant_id.
9
+
10
+ Attributes inherited from ProviderOutputOptions:
11
+ - output_filename (str): The base filename used for generated reports.
12
+ - output_directory (str): The directory to store the output files.
13
+ - ... see ProviderOutputOptions for more details.
14
+
15
+ Methods:
16
+ - __init__: Customizes the output filename logic for LLM.
17
+ """
18
+
19
+ def __init__(self, arguments, bulk_checks_metadata):
20
+ super().__init__(arguments, bulk_checks_metadata)
21
+
22
+ # If --output-filename is not specified, build a default name.
23
+ if not getattr(arguments, "output_filename", None):
24
+ self.output_filename = f"prowler-output-llm-{output_file_timestamp}"
25
+ # If --output-filename was explicitly given, respect that
26
+ else:
27
+ self.output_filename = arguments.output_filename
@@ -94,26 +94,6 @@ class M365BaseException(ProwlerException):
94
94
  "message": "Tenant Id is required for Microsoft 365 static credentials. Make sure you are using the correct credentials.",
95
95
  "remediation": "Check the Microsoft 365 Tenant ID and ensure it is properly set up.",
96
96
  },
97
- (6022, "M365MissingEnvironmentCredentialsError"): {
98
- "message": "User and Password environment variables are needed to use Credentials authentication method.",
99
- "remediation": "Ensure your environment variables are properly set up.",
100
- },
101
- (6023, "M365UserCredentialsError"): {
102
- "message": "The provided User credentials are not valid.",
103
- "remediation": "Check the User credentials and ensure they are valid.",
104
- },
105
- (6024, "M365NotValidUserError"): {
106
- "message": "The provided User is not valid.",
107
- "remediation": "Check the User and ensure it is a valid user.",
108
- },
109
- (6025, "M365NotValidPasswordError"): {
110
- "message": "The provided Password is not valid.",
111
- "remediation": "Check the Password and ensure it is a valid password.",
112
- },
113
- (6026, "M365UserNotBelongingToTenantError"): {
114
- "message": "The provided User does not belong to the specified tenant.",
115
- "remediation": "Check the User email domain and ensure it belongs to the specified tenant.",
116
- },
117
97
  (6027, "M365GraphConnectionError"): {
118
98
  "message": "Failed to establish connection to Microsoft Graph API.",
119
99
  "remediation": "Check your Microsoft Application credentials and ensure the app has proper permissions.",
@@ -315,41 +295,6 @@ class M365NotTenantIdButClientIdAndClientSecretError(M365CredentialsError):
315
295
  )
316
296
 
317
297
 
318
- class M365MissingEnvironmentCredentialsError(M365CredentialsError):
319
- def __init__(self, file=None, original_exception=None, message=None):
320
- super().__init__(
321
- 6022, file=file, original_exception=original_exception, message=message
322
- )
323
-
324
-
325
- class M365UserCredentialsError(M365CredentialsError):
326
- def __init__(self, file=None, original_exception=None, message=None):
327
- super().__init__(
328
- 6023, file=file, original_exception=original_exception, message=message
329
- )
330
-
331
-
332
- class M365NotValidUserError(M365CredentialsError):
333
- def __init__(self, file=None, original_exception=None, message=None):
334
- super().__init__(
335
- 6024, file=file, original_exception=original_exception, message=message
336
- )
337
-
338
-
339
- class M365NotValidPasswordError(M365CredentialsError):
340
- def __init__(self, file=None, original_exception=None, message=None):
341
- super().__init__(
342
- 6025, file=file, original_exception=original_exception, message=message
343
- )
344
-
345
-
346
- class M365UserNotBelongingToTenantError(M365CredentialsError):
347
- def __init__(self, file=None, original_exception=None, message=None):
348
- super().__init__(
349
- 6026, file=file, original_exception=original_exception, message=message
350
- )
351
-
352
-
353
298
  class M365GraphConnectionError(M365CredentialsError):
354
299
  def __init__(self, file=None, original_exception=None, message=None):
355
300
  super().__init__(
@@ -1,3 +1,6 @@
1
+ import argparse
2
+
3
+
1
4
  def init_parser(self):
2
5
  """Init the M365 Provider CLI parser"""
3
6
  m365_parser = self.subparsers.add_parser(
@@ -14,14 +17,15 @@ def init_parser(self):
14
17
  help="Use Azure CLI authentication to log in against Microsoft 365",
15
18
  )
16
19
  m365_auth_modes_group.add_argument(
17
- "--env-auth",
20
+ "--sp-env-auth",
18
21
  action="store_true",
19
- help="Use User and Password environment variables authentication to log in against Microsoft 365",
22
+ help="Use Service Principal environment variables authentication to log in against Microsoft 365",
20
23
  )
21
24
  m365_auth_modes_group.add_argument(
22
- "--sp-env-auth",
25
+ "--env-auth",
26
+ dest="sp_env_auth",
23
27
  action="store_true",
24
- help="Use Azure Service Principal environment variables authentication to log in against Microsoft 365",
28
+ help=argparse.SUPPRESS,
25
29
  )
26
30
  m365_auth_modes_group.add_argument(
27
31
  "--browser-auth",