From 32b61e91ff4109aabc25933678bbcb3a06b19308 Mon Sep 17 00:00:00 2001 From: Prowler Bot Date: Tue, 28 Oct 2025 18:20:15 +0100 Subject: [PATCH] fix(ec2): AttributeError in `ec2_instance_with_outdated_ami` check (#9048) Co-authored-by: Daniel Barranquero <74871504+danibarranqueroo@users.noreply.github.com> --- prowler/CHANGELOG.md | 9 ++++ .../ec2_instance_with_outdated_ami.py | 2 +- .../ec2_instance_with_outdated_ami_test.py | 50 +++++++++++++++++++ 3 files changed, 60 insertions(+), 1 deletion(-) diff --git a/prowler/CHANGELOG.md b/prowler/CHANGELOG.md index da392bed1c..66209ec78f 100644 --- a/prowler/CHANGELOG.md +++ b/prowler/CHANGELOG.md @@ -2,6 +2,15 @@ All notable changes to the **Prowler SDK** are documented in this file. +## [v5.13.1] (Prowler UNRELEASED) + +### Fixed +- Add `resource_name` for checks under `logging` for the GCP provider [(#9023)](https://github.com/prowler-cloud/prowler/pull/9023) +- Fix `ec2_instance_with_outdated_ami` check to handle None AMIs [(#9046)](https://github.com/prowler-cloud/prowler/pull/9046) +- Handle timestamp when transforming compliance findings in CCC [(#9042)](https://github.com/prowler-cloud/prowler/pull/9042) + +--- + ## [v5.13.0] (Prowler v5.13.0) ### Added diff --git a/prowler/providers/aws/services/ec2/ec2_instance_with_outdated_ami/ec2_instance_with_outdated_ami.py b/prowler/providers/aws/services/ec2/ec2_instance_with_outdated_ami/ec2_instance_with_outdated_ami.py index bc2dc223fe..b0dc677e34 100644 --- a/prowler/providers/aws/services/ec2/ec2_instance_with_outdated_ami/ec2_instance_with_outdated_ami.py +++ b/prowler/providers/aws/services/ec2/ec2_instance_with_outdated_ami/ec2_instance_with_outdated_ami.py @@ -31,7 +31,7 @@ class ec2_instance_with_outdated_ami(Check): (image for image in ec2_client.images if image.id == instance.image_id), None, ) - if ami.owner == "amazon": + if ami and ami.owner == "amazon": report = Check_Report_AWS(metadata=self.metadata(), resource=instance) report.status = "PASS" report.status_extended = ( diff --git a/tests/providers/aws/services/ec2/ec2_instance_with_outdated_ami/ec2_instance_with_outdated_ami_test.py b/tests/providers/aws/services/ec2/ec2_instance_with_outdated_ami/ec2_instance_with_outdated_ami_test.py index 81d6a6114f..bcf8a80f98 100644 --- a/tests/providers/aws/services/ec2/ec2_instance_with_outdated_ami/ec2_instance_with_outdated_ami_test.py +++ b/tests/providers/aws/services/ec2/ec2_instance_with_outdated_ami/ec2_instance_with_outdated_ami_test.py @@ -103,6 +103,29 @@ def mock_make_api_call_outdated_ami(self, operation_name, kwarg): return make_api_call(self, operation_name, kwarg) +def mock_make_api_call_missing_ami(self, operation_name, kwarg): + if operation_name == "DescribeInstances": + return { + "Reservations": [ + { + "Instances": [ + { + "InstanceId": "i-0123456789abcdef0", + "State": {"Name": "running"}, + "InstanceType": "t2.micro", + "ImageId": "ami-missing", + "LaunchTime": "2026-11-12T11:34:56.000Z", + "PrivateDnsName": "ip-172-31-32-101.ec2.internal", + } + ] + } + ] + } + elif operation_name == "DescribeImages": + return {"Images": []} + return make_api_call(self, operation_name, kwarg) + + class Test_ec2_instance_with_outdated_ami: @mock_aws def test_ec2_no_instances(self): @@ -219,3 +242,30 @@ class Test_ec2_instance_with_outdated_ami: result[0].status_extended == "EC2 Instance i-0123456789abcdef0 is using outdated AMI ami-87654321." ) + + @mock.patch( + "botocore.client.BaseClient._make_api_call", new=mock_make_api_call_missing_ami + ) + def test_instance_missing_ami_details(self): + from prowler.providers.aws.services.ec2.ec2_service import EC2 + + aws_provider = set_mocked_aws_provider([AWS_REGION_US_EAST_1]) + + with ( + mock.patch( + "prowler.providers.common.provider.Provider.get_global_provider", + return_value=aws_provider, + ), + mock.patch( + "prowler.providers.aws.services.ec2.ec2_instance_with_outdated_ami.ec2_instance_with_outdated_ami.ec2_client", + new=EC2(aws_provider), + ), + ): + from prowler.providers.aws.services.ec2.ec2_instance_with_outdated_ami.ec2_instance_with_outdated_ami import ( + ec2_instance_with_outdated_ami, + ) + + check = ec2_instance_with_outdated_ami() + result = check.execute() + + assert result == []