Harsh KanojiaAbstract This article explores a critical blind spot in modern cloud security posture management:...
Abstract
This article explores a critical blind spot in modern cloud security posture management: the insidious risk posed by misconfigured Resource-Based Policies (RBPs) in AWS. While security analysts often focus exclusively on User and Role (IAM) policies, reciprocal RBPs on services like S3, SQS, and KMS frequently grant unintentional cross-account or public access. This detailed analysis, aimed at experienced practitioners, examines how these overlooked trust boundaries facilitate unauthorized data exfiltration and lateral movement, referencing MITRE ATT&CK techniques and proposing actionable defensive strategies.
High-Retention Hook
A year ago, I was deep in a critical bug bounty engagement targeting a massive cloud deployment. My entire focus was on scanning IAM user policies for privilege escalation paths. Days turned into nights, fueled by cold coffee and the certainty that the flaw had to be in an administrative role. I found nothing.
I finally expanded my scope to the S3 bucket policies only to discover the root cause: an administrator had whitelisted an entire partner AWS account in a resource policy, allowing them s3:GetObject access to sensitive financial archives. That partner account was long decommissioned, but the policy was still live. We were looking for the attacker climbing the ladder, but they were already invited in the front door, just waiting for the right credentials. That day, I realized IAM is a two-way street, and we are usually only checking traffic coming from one direction.
Research Context
The shift to cloud infrastructure has fundamentally redefined the security perimeter. We moved from defending network boundaries to enforcing identity boundaries. However, this identity landscape is complex, defined not just by what permissions a user or role explicitly holds (Identity-Based Policies), but also by what permissions a resource grants externally (Resource-Based Policies).
In AWS, these resource policies (used on S3, ECR, SQS, SNS, etc.) are the primary mechanism for establishing trust with external services, accounts, or principals. When reviewing the threat landscape, especially under the MITRE ATT&CK framework for Cloud (specifically focusing on T1537: Access Policies Discovery), analysts frequently map out the execution flow of IAM roles. Yet, they often neglect the crucial second half of the equation: the Principal element defined within a resource policy. This gap creates silent vectors for data exfiltration and cross-account access.
Problem Statement
The core security gap lies in the asymmetry of policy auditing. Tools and analysts are highly tuned to identify overly permissive IAM roles, such as those granting iam:* or s3:*. But resource policies often contain subtle, high-risk configurations, such as allowing Principal: { "AWS": "arn:aws:iam::123456789012:root" } or, worse, Principal: "*", coupled with poorly implemented condition keys.
This failure mode is particularly dangerous because a resource policy granting access does not require the authorized principal to have any corresponding identity policy. The attacker leverages a trusted path that bypasses traditional IAM controls for that specific resource. Current security scanning tends to treat resource access policies as separate configuration blocks, failing to effectively model the cumulative permissions granted when an identity policy intersects with a resource policy. The result is hidden lateral movement capabilities that are difficult to spot without specialized, context-aware tooling.
Methodology or Investigation Process
Auditing resource policy risk requires a shift from identity-centric scanning to resource-centric enumeration. My process typically involves three key steps:
Prowler or CloudMapper to pull all resource policies for sensitive services (S3, KMS keys, and sensitive SQS/SNS topics).Principal element within the policy's JSON structure. Look for:
"AWS": "*" (Public access).Principal: "*" is used, the policy relies entirely on the Condition block for protection. We must analyze if the conditions are robust (e.g., aws:SourceVpce, aws:SourceArn) or easily spoofed (relying solely on weak IP address restrictions).This process helped uncover a critical finding during a recent engagement: an SQS queue used for sensitive logging had a policy allowing an external account to perform sqs:SendMessage and sqs:ReceiveMessage. The external account was configured as 111122223333, a development staging environment. A misconfiguration on the Dev environment could easily leak production data via this trusted queue path.
Findings and Technical Analysis
The most common and critical technical finding is the unintentional "Guest Account" configuration. Consider the following simplified S3 bucket policy snippet:
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::444455556666:root"
},
"Action": [
"s3:GetObject",
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::my-secure-logs",
"arn:aws:s3:::my-secure-logs/*"
]
}
This policy explicitly grants Account 444455556666 the ability to read and list objects in my-secure-logs. If an attacker compromises any user, role, or even root credentials within Account 444455556666, they immediately gain access to the resource in the primary account, regardless of the primary accountโs internal security posture. This is a direct, permission-based trust bridge.
This structure is a classic example of how permissions are additive. The analyst must consider the effective permission set, which is the intersection of what the identity allows AND what the resource allows. If either side permits the action, and the other does not explicitly deny it, the action is usually allowed.
Risk and Impact Assessment
The risk associated with resource policy abuse is high and often leads to silent data breaches. The famous Capital One breach in 2019, while focused on SSRF and WAF misconfigurations leading to IAM role assumption, underscored the catastrophic consequences of overly permissive cloud credentials and the failure of the Principle of Least Privilege. In that incident, the attacker leveraged an overly permissive IAM role tied to a misconfigured compute resource to gain access to S3 data.
In the resource policy context, the impact is direct:
Mitigation and Defensive Strategies
Defending against resource policy abuse requires a layered, proactive approach:
*) or cross-account access to unapproved external IDs. This enforces a crucial guardrail above individual account permissions.s3:ListBucket if only s3:GetObject is needed) and should specify the most granular principals possible (e.g., specific IAM Role ARNs instead of entire Account IDs).Principal element contains unknown external IDs or *.Researcher Reflection
The deeper I get into cloud security, the more I appreciate the complexity of permission boundaries. My initial failure was assuming that all power flows top-down, from Identity to Resource. The truth is, resources hold significant defensive and offensive power. Resource policies are often managed by application developers or data owners, not security teams, leading to subtle configuration drift over time. For any serious researcher or threat hunter, treating the Resource Policy as an equal partner to the IAM Role Policy is non-negotiable. If you aren't auditing the "Trust" element from both sides, you are operating with a critical blind spot.
Conclusion
Resource-Based Policies are the invisible handshake of the cloud, silently establishing trust relationships that can be weaponized for lateral movement and data theft. Ignoring them is equivalent to securing the front door while leaving the back gate wide open, with a note taped to it saying, "Please come in, Account 444455556666." Mastering the audit of the Principal element and leveraging tools like IAM Access Analyzer is essential for maintaining a mature and defensible cloud security posture against sophisticated actors.
Discussion Question
What specific open-source tooling, beyond Prowler, have you found most effective for modeling the true effective permissions resulting from the intersection of Identity Policies and Resource Policies? Share your insights below.
Written by - Harsh Kanojia
LinkedIn - https://www.linkedin.com/in/harsh-kanojia369/
GitHub - https://github.com/harsh-hak
Personal Portfolio - https://harsh-hak.github.io/
Community - https://forms.gle/xsLyYgHzMiYsp8zx6