From ac623b7e024d15a5efc208337ca32755495ab5af Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 22 Aug 2024 12:08:10 -0400 Subject: [PATCH] fix(aws): enhance resource arn filtering (#4837) Co-authored-by: Sergio Garcia <38561120+sergargar@users.noreply.github.com> --- prowler/providers/aws/aws_provider.py | 30 +++++++++++++++---------- prowler/providers/aws/lib/arn/arn.py | 2 +- tests/providers/aws/lib/arn/arn_test.py | 1 + 3 files changed, 20 insertions(+), 13 deletions(-) diff --git a/prowler/providers/aws/aws_provider.py b/prowler/providers/aws/aws_provider.py index e2e6f6de0e..683b478968 100644 --- a/prowler/providers/aws/aws_provider.py +++ b/prowler/providers/aws/aws_provider.py @@ -78,7 +78,7 @@ class AwsProvider(Provider): # MFA Configuration (false by default) input_mfa = getattr(arguments, "mfa", None) input_profile = getattr(arguments, "profile", None) - input_regions = getattr(arguments, "region", set()) + input_regions = set(getattr(arguments, "region", set())) organizations_role_arn = getattr(arguments, "organizations_role", None) # Set if unused services must be scanned @@ -740,16 +740,22 @@ class AwsProvider(Provider): def get_default_region(self, service: str) -> str: """get_default_region returns the default region based on the profile and audited service regions""" - service_regions = self.get_available_aws_service_regions(service) - default_region = self.get_global_region() - # global region of the partition when all regions are audited and there is no profile region - if self._identity.profile_region in service_regions: - # return profile region only if it is audited - default_region = self._identity.profile_region - # return first audited region if specific regions are audited - elif self._identity.audited_regions: - default_region = self._identity.audited_regions[0] - return default_region + try: + service_regions = self.get_available_aws_service_regions(service) + default_region = self.get_global_region() + # global region of the partition when all regions are audited and there is no profile region + if self._identity.profile_region in service_regions: + # return profile region only if it is audited + default_region = self._identity.profile_region + # return first audited region if specific regions are audited + elif self._identity.audited_regions: + default_region = list(self._identity.audited_regions)[0] + return default_region + except Exception as error: + logger.critical( + f"{error.__class__.__name__}[{error.__traceback__.tb_lineno}]: {error}" + ) + raise error def get_global_region(self) -> str: """get_global_region returns the global region based on the audited partition""" @@ -959,7 +965,7 @@ def get_aws_region_for_sts(session_region: str, input_regions: set[str]) -> str: aws_region = AWS_STS_GLOBAL_ENDPOINT_REGION else: # Get the first region passed to the -f/--region - aws_region = input_regions[0] + aws_region = list(input_regions)[0] return aws_region diff --git a/prowler/providers/aws/lib/arn/arn.py b/prowler/providers/aws/lib/arn/arn.py index dcf8843dd7..2ec4724768 100644 --- a/prowler/providers/aws/lib/arn/arn.py +++ b/prowler/providers/aws/lib/arn/arn.py @@ -58,5 +58,5 @@ def parse_iam_credentials_arn(arn: str) -> ARN: def is_valid_arn(arn: str) -> bool: """is_valid_arn returns True or False whether the given AWS ARN (Amazon Resource Name) is valid or not.""" - regex = r"^arn:aws(-cn|-us-gov|-iso|-iso-b)?:[a-zA-Z0-9\-]+:([a-z]{2}-[a-z]+-\d{1})?:(\d{12})?:[a-zA-Z0-9\-_\/:\.]+(:\d+)?$" + regex = r"^arn:aws(-cn|-us-gov|-iso|-iso-b)?:[a-zA-Z0-9\-]+:([a-z]{2}-[a-z]+-\d{1})?:(\d{12})?:[a-zA-Z0-9\-_\/:\.\*]+(:\d+)?$" return re.match(regex, arn) is not None diff --git a/tests/providers/aws/lib/arn/arn_test.py b/tests/providers/aws/lib/arn/arn_test.py index f45186398e..3c0e9e400b 100644 --- a/tests/providers/aws/lib/arn/arn_test.py +++ b/tests/providers/aws/lib/arn/arn_test.py @@ -386,6 +386,7 @@ class Test_ARN_Parsing: "arn:aws:lambda:eu-west-1:123456789012:function:lambda-function" ) assert is_valid_arn("arn:aws:sns:eu-west-1:123456789012:test.fifo") + assert is_valid_arn("arn:aws:logs:eu-west-1:123456789012:log-group:/ecs/test:") assert not is_valid_arn("arn:azure:::012345678910:user/test") assert not is_valid_arn("arn:aws:iam::account:user/test") assert not is_valid_arn("arn:aws:::012345678910:resource")