github prowler-cloud/prowler 5.41.0
Prowler 5.41.0

3 hours ago

✨ New features to highlight in this version

Enjoy them all now for free at https://cloud.prowler.com/

📥 Scans — Import Findings from the Browser

Note

This feature is available exclusively in Prowler Cloud and Prowler Private Cloud with a subscription.

Findings produced outside the platform, by the Prowler CLI or a CI pipeline, can now be brought into the app without leaving the browser. The Scans page gains an "Import Findings" dialog that takes a Prowler .ocsf.json report by drag-and-drop or file picker, hands it to the ingestion API and tracks the job to completion, reporting how many records were processed and how many were invalid. Files that are not a .ocsf.json report, or are empty, are refused before any upload starts, and a rejected upload or a failed status poll can be retried in place. The dialog is available to roles holding the Manage Ingestions permission.

Import Findings button on the Scans page Import findings dialog with the drag-and-drop area

Read more in the Import Findings documentation.

🎫 Jira Integration — Finding Reference in Every Issue

Every Jira issue created from a finding now carries a stable reference back to it. Issues are labeled prowler, prowler-<provider>, prowler-<severity>, prowler-<check-id> and prowler-finding-<finding-uid>, so they can be filtered, searched with JQL or matched by automation; labels are sanitized to Jira's limits so a long or unusual value never blocks issue creation. The issue also links back to the finding in Prowler, filtered by its UID so the link keeps working after later scans, and names the Prowler organization that sent it. Prowler Cloud always includes the link; Prowler Local Server enables it by setting DJANGO_UI_BASE_URL in the API environment.

Read more in the Jira integration documentation.

📚 Compliance — CIS Google Workspace Foundations Benchmark v1.4.0

Prowler now ships the CIS Google Workspace Foundations Benchmark v1.4.0. Alongside the new framework, the Google Workspace checks mapped to CIS were reworked to evaluate the benchmark's full audit procedure instead of a single condition, so Gmail spoofing actions, 2-Step Verification, password expiration and alert severity left on Google's defaults no longer pass. Expect new FAIL findings on domains that rely on those defaults. Three accuracy fixes also land:

  • security_2sv_enforced and security_2sv_hardware_keys_admins report MANUAL instead of judging domain-wide values that a group or a sub-organizational unit overrides; a domain-wide failure is still reported as such, with the override noted.
  • rules_*_alert_configured no longer passes a rule whose delivery to the alert center is disabled.
  • security_password_policy_strong no longer fails a domain that never touched the password strength setting, since Google enforces strong passwords by default.

security_login_challenges_configured was unmapped from CIS Google Workspace requirement 4.1.4.1 (Post-SSO verification) and security_2sv_enforced from CISA SCuBA GWS.COMMONCONTROLS.1.1 (phishing-resistant MFA), because neither check can prove what those requirements ask for.

Read more in the Compliance documentation.

🔍 Checks

Ten new AWS checks land in this release, eight of them contributed by @tamg-aws. Thank you!

Amazon Bedrock AgentCore

  • iam_policy_passrole_to_bedrock_agentcore_restricted flags customer-managed IAM policies that allow iam:PassRole over every role where the passed role can reach Bedrock AgentCore, so any principal holding the policy could run agent code under any role in the account.
  • iam_policy_no_agentcore_workload_access_token_wildcard flags customer-managed IAM policies that allow bedrock-agentcore:GetWorkloadAccessToken, GetWorkloadAccessTokenForJWT or GetWorkloadAccessTokenForUserId on resources reaching workload identities other than the caller's own.
  • cloudwatch_log_group_agentcore_data_protection_policy_enabled verifies that Bedrock AgentCore log groups mask sensitive data with a CloudWatch Logs data protection policy. The log group prefixes are configurable through agentcore_log_group_name_prefixes in config.yaml.

Amazon GuardDuty

  • guardduty_runtime_monitoring_enabled flags detectors without unified Runtime Monitoring, the only feature that covers Amazon EC2 instances and Amazon ECS on AWS Fargate tasks in addition to Amazon EKS.
  • guardduty_ai_protection_enabled flags detectors without AI Protection, which analyzes CloudTrail data events from Amazon Bedrock, Amazon Bedrock AgentCore and Amazon SageMaker AI. A detector that does not report the feature is MANUAL rather than FAIL.

guardduty_eks_runtime_monitoring_enabled no longer reports FAIL for detectors that use unified Runtime Monitoring, which is mutually exclusive with EKS_RUNTIME_MONITORING and already covers Amazon EKS.

Amazon ECR and EKS

  • ecr_registry_enhanced_scanning_enabled verifies that the ECR registry scan type is enhanced (Amazon Inspector, covering programming language packages and continuous rescanning) instead of basic, reporting MANUAL when the registry scanning configuration cannot be read.
  • eks_cluster_vpc_cni_network_policy_enforced flags EKS clusters whose Amazon VPC CNI managed add-on does not enable Kubernetes network policy enforcement, reporting MANUAL where the EKS API cannot show the setting.

AWS IAM, Elastic Beanstalk and MemoryDB

  • iam_role_service_trust_restricts_source_to_account flags IAM roles whose trust policy lets an AWS service principal assume the role without confining the request to a specific source account, including trust policies that iam_role_cross_service_confused_deputy_prevention does not evaluate.
  • elasticbeanstalk_environment_no_secrets_in_configuration scans the option settings of every Elastic Beanstalk environment for hardcoded secrets. Thanks to @haneul-24!
  • memorydb_cluster_in_transit_encryption_enabled verifies that MemoryDB clusters have in-transit encryption (TLS) enabled. Thanks to @UTKARSH698!

Explore all AWS checks at Prowler Hub.

🐳 Image Provider — On-Premises Registries

Scanning registries that live on private networks is now supported end to end. PROWLER_IMAGE_PROVIDER_ALLOWED_PRIVATE_NETWORKS takes a comma-separated list of IPs and CIDRs the provider may reach, while every other non-public address, including link-local and loopback, stays blocked by the SSRF guard. Authentication negotiation is also more resilient: the provider falls back to Basic when a registry such as Harbor rejects the negotiated bearer token, and switches to a bearer token when the server answers a Basic or anonymous request with a Bearer challenge. --registry-insecure now propagates to Trivy through TRIVY_INSECURE, so images behind self-signed certificates can be pulled and scanned, not just enumerated. The flag now disables certificate validation for the image pull too, so keep it for trusted internal registries only.

Registry scans also skip non-image OCI artifacts (Helm charts, cosign signatures, SBOM attestations), no longer abort the whole scan when Trivy fails on a single image, and enumerate repositories in parallel instead of one request at a time.

Read more in the Image provider documentation.

🛠️ Prowler MCP Server — Tool Failures Reported as Errors

The Prowler tools, which talk to Prowler Cloud, Private Cloud and Local Server, now report a failure as an MCP tool execution error (isError: true, with the explanation in content) instead of a successful result carrying an {"error": ...} object, which clients and models read as a success. The Prowler Documentation and Prowler Hub tools follow the same rule: prowler_docs_search no longer reports a failed search as zero matches, prowler_docs_get_document no longer reports a failed fetch as a missing page, and prowler_hub_get_check_code and prowler_hub_get_check_fixer now name the provider a check ID actually belongs to instead of reporting it as nonexistent. prowler_get_compliance_framework_state_details also rejects a call that passes both scan_id and provider_id instead of silently ignoring the provider.

Read more in the Prowler MCP documentation.

🙌 External Contributors

Thank you to our community contributors for this release!

  • @tamg-aws: GuardDuty unified Runtime Monitoring and AI Protection checks (#12564), EKS VPC CNI network policy check (#12661), ECR enhanced scanning check (#12660), Bedrock AgentCore IAM and service trust checks (#12664), AgentCore log group data protection check (#12662), and fixes to ECR scan frequency (#12560), CloudWatch metric filters (#12561) and SageMaker direct internet access (#12659)
  • @haneul-24: AWS elasticbeanstalk_environment_no_secrets_in_configuration check (#12378)
  • @UTKARSH698: AWS memorydb_cluster_in_transit_encryption_enabled check (#12246)
  • @ye11oc4t: GitHub repository discovery pagination for unscoped scans (#12460)

UI

🚀 Added

  • Finding-report imports from Scans for Cloud and Private Cloud deployments (#12554)
  • Slack integration: the connection check leaves its result on the card instead of only in a toast, naming the channel Slack refused or the channels it reached (Prowler Cloud only) (#12677)

🔄 Changed

  • Slack integration: the bot is referred to as @Prowler Cloud, identifiers are set as inline code, and the private-channel hint links to its docs (Prowler Cloud only) (#12677)
  • Slack integration: a selected private channel carries the same visible Private badge as the channel list, replacing the lock icon on the chip (Prowler Cloud only) (#12677)

🐞 Fixed

  • Cached permissions now refresh from /users/me?include=roles after access token rotation (#12640)

API

🚀 Added

  • Jira issues created from Prowler Cloud now carry the prowler, prowler-<provider>, prowler-<severity>, prowler-<check-id>, and prowler-finding-<finding-uid> labels, a link back to the finding when DJANGO_UI_BASE_URL is configured, and the tenant name (#12540)

🐞 Fixed

  • POST /api/v1/mute-rules now updates only each affected provider's latest completed scan and future scans, preventing historical reaggregation from flooding Celery queues (#12681)

SDK

🚀 Added

  • memorydb_cluster_in_transit_encryption_enabled check for AWS provider, verifying MemoryDB clusters have in-transit encryption (TLS) enabled (#12246)
  • elasticbeanstalk_environment_no_secrets_in_configuration check for AWS provider, scanning the option settings of every Elastic Beanstalk environment for hardcoded secrets (#12378)
  • CIS Google Workspace Foundations Benchmark v1.4.0 compliance framework (#12513)
  • Jira.send_finding() returns typed creation outcomes with the issue key, immutable ID and browse URL, and supports length-safe finding and delivery-attempt labels plus marker lookup for uncertain deliveries (#12539)
  • Jira.get_issues_status() resolves issue references by immutable ID in batches and returns explicit open, done, moved, missing, forbidden or unknown outcomes without treating missing issues as deleted (#12539)
  • guardduty_ai_protection_enabled check for AWS provider, flagging GuardDuty detectors without AI Protection, which analyzes AWS CloudTrail data events from Amazon Bedrock, Amazon Bedrock AgentCore and Amazon SageMaker AI; a detector that does not report the feature is MANUAL rather than FAIL (#12564)
  • guardduty_runtime_monitoring_enabled check for AWS provider, flagging GuardDuty detectors without unified Runtime Monitoring, the only feature that covers Amazon EC2 instances and Amazon ECS on AWS Fargate tasks in addition to Amazon EKS (#12564)
  • ecr_registry_enhanced_scanning_enabled check for AWS provider, verifying that the ECR registry scan type is enhanced (Amazon Inspector, covering programming language packages and continuous rescanning) instead of basic, and reporting MANUAL when the registry scanning configuration cannot be read (#12660)
  • eks_cluster_vpc_cni_network_policy_enforced check for AWS provider, flagging EKS clusters whose Amazon VPC CNI managed add-on does not enable Kubernetes network policy enforcement, and reporting MANUAL where the EKS API cannot show the setting (#12661)
  • cloudwatch_log_group_agentcore_data_protection_policy_enabled check for AWS provider, verifying that Bedrock AgentCore log groups mask sensitive data with a CloudWatch Logs data protection policy (#12662)
  • iam_policy_no_agentcore_workload_access_token_wildcard check for AWS provider, flagging customer-managed IAM policies that allow bedrock-agentcore:GetWorkloadAccessToken, GetWorkloadAccessTokenForJWT or GetWorkloadAccessTokenForUserId on resources reaching workload identities other than the caller's own, which AWS documents as the only binding on the unverified user ID the token is issued for (#12664)
  • iam_policy_passrole_to_bedrock_agentcore_restricted check for AWS provider, flagging customer-managed IAM policies that allow iam:PassRole over every role where the passed role can reach Bedrock AgentCore, so any principal holding the policy can run agent code under any role in the account (#12664)
  • iam_role_service_trust_restricts_source_to_account check for AWS provider, flagging IAM roles whose trust policy lets an AWS service principal assume the role without confining the request to a specific source account, including trust policies that iam_role_cross_service_confused_deputy_prevention does not evaluate (#12664)
  • PROWLER_IMAGE_PROVIDER_ALLOWED_PRIVATE_NETWORKS environment variable so the image provider can reach container registries on allowlisted private networks, keeping every other non-public address blocked (#12678)
  • PROWLER_AWS_PARTITION environment variable to select the AWS partition used for STS credential validation and scan bootstrap, with a clear error when the account belongs to a different partition (#12680)

🔄 Changed

  • Google Workspace checks mapped to CIS evaluate the full audit procedure instead of a single condition, so Gmail spoofing actions, 2-Step Verification, password expiration and alert severity left on Google's defaults no longer pass (#12513)
  • security_login_challenges_configured and security_2sv_enforced unmapped from CIS Google Workspace 4.1.4.1 and CISA SCuBA 0.6 GWS.COMMONCONTROLS.1.1, whose Post-SSO verification and phishing-resistant MFA requirements neither check can prove (#12513)

🐞 Fixed

  • GitHub repository discovery for unscoped scans now paginates beyond the first 100 accessible repositories instead of silently scanning only the first page (#12460)
  • rules_*_alert_configured checks no longer pass a rule whose delivery to the alert center is disabled, the setting behind the benchmark's "Ensure that Alerts is set to On" (#12513)
  • security_password_policy_strong no longer fails a domain that never touched the password strength setting: Google enforces strong passwords by default, so an unset value is the secure default and not a missing configuration (#12513)
  • security_2sv_enforced and security_2sv_hardware_keys_admins report MANUAL instead of judging domain-wide values that a group or a sub-organizational unit overrides, or that were dropped because the root organizational unit could not be resolved; a domain-wide failure is still reported as such, with the override noted (#12513)
  • ecr_registry_scan_images_on_push_enabled no longer passes a registry whose scanning rules are all MANUAL, nor describes a CONTINUOUS_SCAN registry as scanning on push; each rule's scanFrequency is now read instead of inferred from a rule's presence (#12560)
  • CloudWatch log metric filter checks no longer crash with AttributeError when the account has a metric filter whose log group was not retrieved (#12561)
  • guardduty_eks_runtime_monitoring_enabled no longer reports FAIL for detectors that use unified Runtime Monitoring; the GuardDuty service now reads the RUNTIME_MONITORING feature, which is mutually exclusive with EKS_RUNTIME_MONITORING and already covers Amazon EKS (#12564)
  • Checks no longer report FAIL when the scanning identity lacks permissions, an API is not enabled or a feature is not licensed; they now emit a single MANUAL finding naming what is required, across 28 M365, Azure, AWS and GCP checks (#12645)
  • sagemaker_notebook_instance_without_direct_internet_access_configured check logic to read the DirectInternetAccess setting instead of RootAccess, failing a notebook instance with direct internet access enabled even when root access is disabled (#12659)
  • Basic authentication fallback in the image provider when a registry rejects the negotiated bearer token, so registries like Harbor that guard catalog listing behind Basic can be enumerated (#12678)
  • Registry catalog listing when the server answers with a Bearer challenge after negotiating Basic (or anonymous) authentication, switching to a bearer token obtained from the challenge instead of failing (#12678)
  • --registry-insecure now propagates to Trivy via TRIVY_INSECURE, so images in registries with self-signed certificates can be pulled and scanned, not just enumerated (#12678)
  • Registry scans in the Image provider now skip non-image OCI artifacts (Helm charts, cosign signatures, SBOM attestations) and no longer abort the whole scan when Trivy fails on a single discovered image; registry enumeration also runs in parallel instead of one request at a time (#12695)

MCP

🚀 Added

  • Prowler App tools now report a failure as an MCP tool execution error (isError: true, explanation in content) instead of as a successful result carrying an {"error": ...} object, which clients and models read as a success (#12532)

🔄 Changed

  • prowler_get_compliance_framework_state_details now rejects a call that passes both scan_id and provider_id instead of silently ignoring the provider, which could report on a scan belonging to a different provider than the one that was asked about (#12532)

🐞 Fixed

  • prowler_hub_get_check_code and prowler_hub_get_check_fixer now report a check ID that belongs to another provider as such, naming that provider, instead of reporting the ID as one that does not exist (#12533)
  • prowler_docs_search no longer reports a failed search as zero matches or an unreadable answer as a bad search term, and prowler_docs_get_document no longer reports a failed fetch as a missing page (#12534)

Don't miss a new prowler release

NewReleases is sending notifications on new releases.