cloudAI-drafted

Cross-Account Lateral Movement in AWS Organizations Exposed

How attackers exploit trusted relationships between member accounts to escalate privileges undetected

cybersentry360 EditorialAug 8, 2026
Cross-Account Lateral Movement in AWS Organizations Exposed

When a security team detects unusual S3 API calls from a development account at 2 AM, the initial response often focuses on that single account. But experienced incident responders know that single-account compromise in an AWS Organization rarely stays contained. The real danger lies in what happens next - attackers pivoting through trust relationships, AssumeRole permissions, and cross-account resource policies to reach production data, administrative controls, or billing consoles.

I've watched this pattern unfold across dozens of incidents. An intern's compromised credentials in a sandbox account become the launchpad for accessing customer databases three accounts away. The trust relationships that make multi-account AWS architectures manageable also create highways for lateral movement that traditional perimeter security never anticipated.

Understanding AWS Organizations Trust Architecture

AWS Organizations were designed to simplify management of multiple accounts under a single billing and governance umbrella. The architecture relies heavily on IAM roles, resource-based policies, and service control policies (SCPs) to delegate access across account boundaries. While this model offers genuine operational benefits, it also introduces attack paths that don't exist in single-account deployments.

Every cross-account role assumption creates a trust relationship. When Account A allows Account B to assume a role, that permission grants Account B's principals the ability to temporarily obtain credentials for resources in Account A. The security of this arrangement depends entirely on how tightly you've scoped the trust policy, what permissions the assumed role carries, and how well you monitor who's actually using it.

Most organizations start with broad trust policies during initial setup and never tighten them. I've reviewed AWS environments where development accounts could assume administrative roles in production because someone copied a CloudFormation template two years ago and never revisited the trust relationships. The person who created that trust has long since left the company, but the attack path remains.

The challenge compounds when you layer in AWS service-linked roles, cross-account S3 bucket policies, KMS key grants, and secrets shared through Systems Manager Parameter Store. Each integration point becomes a potential pivot opportunity. Attackers don't need to exploit vulnerabilities in AWS itself - they simply follow the permissions you've already granted.

The Role Assumption Chain

Lateral movement through AWS Organizations typically follows a pattern. An attacker gains initial access to any account in the organization - often through compromised credentials, vulnerable applications, or misconfigured services. From that foothold, they enumerate IAM roles and trust relationships using API calls that rarely trigger alerts because they look like normal administrative activity.

Once they map the trust topology, attackers identify roles they can assume. A common scenario: a compromised EC2 instance in a development account has an instance profile that allows assuming a role in the security account for centralized logging. That logging role has permissions to read CloudTrail logs across all accounts. Those logs reveal the structure of production accounts, including role names and resource identifiers.

The attacker then looks for transitive trust relationships. Maybe the logging role can also assume a read-only auditor role in production. That auditor role can't modify resources directly, but it can read S3 bucket policies that reveal which other accounts have access. Each assumption provides more reconnaissance data and potentially more roles to assume.

This isn't theoretical. The Capital One breach demonstrated exactly this pattern - an attacker exploited a vulnerable web application to access instance metadata, obtained IAM credentials, and used those credentials to enumerate and access S3 buckets across multiple accounts. The technical execution was straightforward once the initial foothold was established.

Common Cross-Account Attack Vectors

After reviewing hundreds of AWS security assessments, certain attack patterns appear repeatedly. These aren't sophisticated zero-day exploits - they're predictable consequences of how organizations implement cross-account access without adequate controls.

Overprivileged Service Roles

Many organizations create service roles for automation, CI/CD pipelines, or third-party integrations with permissions far exceeding what the service actually needs. A deployment pipeline might have full administrative access to production accounts "just in case" someone needs to make an emergency change. An attacker who compromises the CI/CD system inherits those permissions.

I've seen Jenkins instances with credentials that could assume roles in every account in the organization. The original intent was enabling blue-green deployments across environments, but the implementation granted permanent, unrestricted access. When that Jenkins server was compromised through an unpatched plugin, the attacker had immediate lateral movement capability.

Wildcard Trust Policies

Trust policies that allow assumption from an entire account rather than specific principals create unnecessary risk. A policy that trusts arn:aws:iam::123456789012:root allows any principal in account 123456789012 to assume the role - including any IAM user an attacker might create after compromising a single set of credentials.

The correct approach restricts trust to specific roles or users: arn:aws:iam::123456789012:role/DeploymentRole. But I regularly find wildcard trust policies in production environments, often because someone prioritized getting the integration working over getting it working securely.

Cross-Account S3 Bucket Policies

S3 bucket policies can grant access to principals in other accounts, creating a direct path for data exfiltration that bypasses IAM role assumptions entirely. An attacker with read access to a bucket policy can identify which external accounts have access, then attempt to compromise those accounts to access the bucket.

Worse, bucket policies sometimes grant public access accidentally. I've investigated incidents where sensitive data was exposed because a bucket policy allowed "Principal": "*" with a condition that was supposed to restrict access but was misconfigured. The attacker never needed to move laterally - the data was already accessible.

KMS Key Policies

KMS key policies control who can use encryption keys for data at rest. Cross-account key access is common for shared services like centralized logging or backup. But overly permissive key policies allow attackers to decrypt data in accounts they've compromised, even if they can't directly access the encrypted resources.

A typical scenario: an attacker compromises a development account that has permission to use a KMS key for decrypting RDS snapshots. They can't create or modify the production database, but they can copy a snapshot to their account, decrypt it using the shared key, and extract all the customer data.

Detection Challenges Across Account Boundaries

Detecting lateral movement in AWS Organizations requires understanding what normal cross-account activity looks like for your environment. Unfortunately, most security teams lack this baseline, making it nearly impossible to distinguish legitimate role assumptions from attacker reconnaissance.

CloudTrail logs capture AssumeRole events, but high-volume environments generate thousands of these daily. A CI/CD pipeline might assume roles in production accounts hundreds of times per day for deployments. Security scanners assume read-only roles across all accounts hourly. Legitimate automation creates noise that drowns out the signal of an attacker methodically exploring your account structure.

The problem compounds because CloudTrail logs are often siloed by account. Even organizations that centralize logs in a security account typically don't correlate events across accounts in real-time. An attacker assuming roles in sequence across five accounts might generate individual log entries that look normal, but the pattern only becomes visible when you analyze the timeline across all accounts simultaneously.

I've worked with security teams that discovered breaches weeks after the initial compromise because their SIEM wasn't configured to alert on unusual cross-account access patterns. The attacker assumed roles during business hours, used common tools like the AWS CLI, and avoided triggering rate limits or error thresholds. The activity blended perfectly into normal operations.

The Attribution Problem

When an attacker assumes a role, the CloudTrail logs show the assumed role's identity performing actions, not the original compromised credential. This creates attribution challenges during incident response. You see that arn:aws:sts::999999999999:assumed-role/ProductionReader/session-name accessed sensitive data, but determining who or what assumed that role requires correlating events across accounts and potentially across multiple role assumption chains.

Some attackers deliberately create complex assumption chains to obscure their origin. They might assume Role A in Account 1, use that to assume Role B in Account 2, then use Role B to assume Role C in Account 3 before actually accessing target resources. Tracing back to the initial compromised credential requires meticulous log analysis and understanding of your organization's trust topology.

Architectural Patterns That Reduce Risk

Securing cross-account access in AWS Organizations requires intentional architecture that treats account boundaries as meaningful security controls rather than administrative conveniences. This means designing trust relationships with the assumption that any individual account might be compromised.

Least Privilege Trust Policies

Every cross-account role should have a trust policy that specifies exactly which principals can assume it. Never trust an entire account unless you genuinely intend for any principal in that account to have access. Use conditions in trust policies to further restrict assumptions based on source IP, MFA status, or time of day.

For service roles, consider using service-specific principals rather than account-level trust. If you need Lambda functions in one account to access resources in another, create a trust policy that allows only the specific Lambda execution role, not all principals in the Lambda account.

Break-Glass Access Patterns

Production accounts should not allow routine cross-account access from development or staging environments. Instead, implement break-glass procedures that require manual approval and generate high-priority alerts. When a developer needs production access for troubleshooting, they should request a time-limited session through a controlled process that logs the justification and notifies security teams.

This pattern prevents the most common lateral movement scenario - an attacker compromising a low-security development environment and using existing permissions to reach production. The operational friction is minimal if you design your architecture so production access isn't required for normal development workflows.

Resource-Based Policies with Explicit Deny

S3 bucket policies, KMS key policies, and other resource-based policies should include explicit deny statements for principals that should never have access, even if those principals somehow obtain credentials. This creates defense in depth - even if an attacker assumes a role with overly broad permissions, the resource policy blocks access.

For example, your production S3 bucket policy might explicitly deny access from any principal in development accounts, regardless of what IAM policies those principals have. This prevents lateral movement from compromised development accounts from reaching production data.

Dedicated Security Account Architecture

Many organizations implement a dedicated security account that sits outside the normal account hierarchy. This account owns CloudTrail logs, security tooling, and incident response resources. Cross-account access to the security account should be severely restricted and heavily monitored.

The security account pattern prevents attackers from disabling logging or security controls during their lateral movement. Even if they compromise the organization's master payer account, they can't easily delete CloudTrail logs or disable GuardDuty if those resources exist in a separately managed security account.

Monitoring and Detection Strategies

Effective detection of cross-account lateral movement requires purpose-built monitoring that understands your organization's trust topology and can identify deviations from expected patterns. This goes beyond standard SIEM correlation rules.

Trust Relationship Inventory

You can't detect abnormal cross-account access if you don't know what normal looks like. Maintain an inventory of all cross-account trust relationships, including which roles exist, which accounts they trust, what permissions they grant, and what legitimate use cases they serve. This inventory should be automatically generated from IAM policy analysis, not manually documented.

Compare this inventory against actual AssumeRole events in CloudTrail. Any role assumption that doesn't match a documented use case should trigger investigation. A role that was created for quarterly compliance scans but suddenly gets assumed daily might indicate compromise.

Temporal and Geolocation Anomalies

Most legitimate cross-account access follows predictable patterns. CI/CD pipelines assume roles during deployment windows. Backup processes assume roles on schedule. Security scans happen at regular intervals. Deviations from these patterns - especially access from unusual geographic locations or at unexpected times - warrant investigation.

I've seen attackers trigger alerts by assuming roles from IP addresses that had never accessed those accounts before. If your deployment pipeline always runs from us-east-1 but you suddenly see role assumptions from ap-southeast-2, that's a red flag worth investigating even if the credentials are technically valid.

Permission Escalation Detection

Monitor for sequences of role assumptions that grant progressively broader permissions. An attacker might start with a read-only role, use that to discover a role with data access permissions, then use that to find a role with administrative permissions. This escalation pattern is detectable if you map the permission scope of each role and alert when assumptions follow an escalating privilege path.

This requires understanding not just which roles exist, but what effective permissions each role grants. A role with read access to IAM policies might seem low-risk, but it enables reconnaissance that facilitates further lateral movement.

Benefits of Proper Cross-Account Security

Implementing robust cross-account security controls delivers operational and security benefits that justify the engineering investment required.

Blast radius limitation: When you properly isolate accounts, a compromise in one environment can't automatically cascade to others. This containment reduces incident response costs and limits potential damage from any single security event.

Compliance segmentation: Many regulatory frameworks require separation between production and non-production environments, or between different classes of data. Properly secured account boundaries provide auditable evidence of this separation.

Clearer audit trails: When cross-account access is intentionally designed and limited, unusual activity becomes immediately visible in logs. You're not searching for needles in haystacks - you're noticing when something happens that shouldn't be possible.

Reduced insider threat risk: Restricting cross-account access limits what any individual employee or contractor can access, even if they have legitimate credentials. This principle of least privilege reduces both accidental and malicious insider risks.

Common Mistakes Organizations Make

After years of reviewing AWS security architectures, I've identified recurring mistakes that create lateral movement opportunities.

Treating account boundaries as administrative rather than security controls: Organizations often create multiple accounts for organizational reasons - separating teams, projects, or cost centers - without considering the security implications of the trust relationships they establish between those accounts.

Implementing least privilege at the IAM policy level but not at the trust policy level: Teams carefully scope what an assumed role can do, but allow any principal in the entire account to assume it. The trust policy is just as important as the permission policy.

Never reviewing or updating cross-account permissions: Trust relationships established during initial AWS adoption remain in place years later, even though the original use case has evolved or been deprecated. I regularly find roles that exist solely because someone once needed them for a project that no longer runs.

Failing to monitor AssumeRole events: CloudTrail logs every role assumption, but many organizations don't actively monitor these events or correlate them across accounts. This data sits in S3 buckets, reviewed only during incident response when it's too late.

Using long-lived credentials for cross-account access: Some organizations create IAM users with cross-account permissions rather than using role assumption. This creates permanent credentials that can be compromised and exfiltrated, rather than temporary session credentials that expire.

Not testing incident response procedures across account boundaries: Many organizations have solid incident response plans for single-account compromises but have never practiced responding to an attacker with access to multiple accounts simultaneously. The complexity of coordinating response across accounts is significant and should be tested before you need it in production.

Expert Tips for Hardening Cross-Account Access

Based on field experience and conversations with practitioners managing large AWS Organizations, several advanced techniques can significantly improve your security posture.

Implement condition keys in trust policies: Beyond specifying which principals can assume a role, use condition keys to require MFA (aws:MultiFactorAuthPresent), restrict source IP ranges (aws:SourceIp), or limit assumptions to specific time windows. These conditions create defense in depth - even if an attacker compromises credentials, they might not be able to satisfy the assumption conditions.

Use external IDs for third-party access: When granting cross-account access to vendors or partners, always require an external ID in the trust policy. This prevents the confused deputy problem where an attacker tricks a third party into accessing your resources using their legitimate credentials.

Automate trust policy auditing: Build automation that continuously scans all cross-account roles and flags overly permissive trust policies. Look for wildcards in principal specifications, missing condition requirements, or trust relationships to accounts outside your organization.

Implement network-level controls: Where possible, require cross-account access to originate from known VPC endpoints or specific CIDR ranges. This creates an additional layer of verification beyond IAM credentials.

Tag and track role usage: Apply tags to cross-account roles indicating their purpose, owner, and expected usage pattern. Use these tags to generate reports showing which roles haven't been used in 90 days (candidates for deletion) or which are being used in unexpected ways.

Build a role assumption graph: Visualize your cross-account trust relationships as a directed graph showing which accounts can assume roles in which other accounts. This visualization often reveals unexpected paths that attackers could exploit - like a development account that can reach production through a chain of intermediate assumptions.

The integration between cloud security practices and broader cybersecurity strategy continues to evolve. Organizations that treat cloud-specific attack vectors as distinct from traditional network security often miss the ways attackers combine techniques across domains.

The Intersection with AI Security

As organizations deploy machine learning workloads in AWS, cross-account lateral movement takes on new dimensions. Training data, model artifacts, and inference endpoints often span multiple accounts in an ML platform architecture. An attacker who gains access to a data science sandbox account might be able to pivot to production ML infrastructure and extract proprietary models or training data.

This risk connects directly to concerns about model extraction attacks, where attackers clone proprietary AI through queries. If an attacker can laterally move from a compromised development account to production ML endpoints, they might extract models without needing to query them externally - they can simply copy the model artifacts directly.

Similarly, the tokenization paradox around AI training data exfiltration becomes more acute when considering cross-account access. Training data stored in S3 buckets across multiple accounts creates numerous potential exfiltration points. Each cross-account access permission is a potential path for data leakage.

The challenge intensifies as organizations adopt AI-powered security tools that need cross-account access to analyze threats across the entire organization. These tools require broad read permissions, creating powerful capabilities if those credentials are compromised.

Policy and Compliance Considerations

From a policy perspective, cross-account lateral movement intersects with numerous compliance requirements. GDPR, HIPAA, PCI-DSS, and other frameworks often require demonstrable access controls and audit trails. When an attacker moves laterally across accounts, they potentially violate separation requirements and create compliance exposure.

Regulatory guidance increasingly recognizes cloud-specific risks. The SEC's 2023 cybersecurity disclosure rules, for example, require public companies to describe their processes for assessing and managing material cybersecurity risks. Cross-account lateral movement in AWS Organizations represents exactly the type of architectural risk that should be assessed and disclosed if material.

The Delete Act vs. Security Ops tension also appears in cross-account security. Organizations need to retain CloudTrail logs for security analysis, but data minimization principles might suggest deleting logs that contain PII. Balancing these requirements while maintaining the ability to detect cross-account attacks requires careful data governance.

Integration with Vulnerability Management

Cross-account lateral movement often exploits not traditional CVEs but architectural weaknesses in how trust relationships are configured. This creates challenges for vulnerability management programs built around CVSS scoring and exploit prediction.

A misconfigured trust policy might not have a CVE identifier or a CVSS score, but it represents a critical security gap. Forward-thinking organizations are extending their vulnerability management programs to include cloud configuration issues, treating an overly permissive cross-account role with the same urgency as an unpatched critical vulnerability.

The shift from reactive patching to proactive architectural security requires different skills and tools. You need people who understand IAM policy evaluation, not just people who can apply security patches. This workforce challenge is significant - the pool of practitioners who deeply understand AWS Organizations security is smaller than the pool who can manage traditional vulnerability patching.

FAQs

How do I discover all cross-account trust relationships in my AWS Organization?

Use AWS IAM Access Analyzer to automatically discover and analyze cross-account access. The tool scans all IAM roles, S3 bucket policies, KMS key policies, and other resource-based policies to identify external access. You can also build custom scripts using the IAM API to enumerate all roles and parse their trust policies, then generate a comprehensive inventory. Make this discovery process continuous - run it daily or weekly to catch new trust relationships as they're created.

What's the difference between cross-account access and same-account privilege escalation?

Same-account privilege escalation involves an attacker gaining higher permissions within a single AWS account, typically by exploiting IAM policy misconfigurations or assuming roles they shouldn't have access to. Cross-account lateral movement involves using permissions in one account to gain access to resources in a different account within the same AWS Organization. Cross-account movement is often harder to detect because it involves legitimate trust relationships being abused rather than clear policy violations.

Should I use a single CloudTrail trail for the entire organization or separate trails per account?

Implement organization-wide CloudTrail through the management account, which automatically logs events from all member accounts to a central S3 bucket in a designated security account. This approach provides complete visibility and prevents individual accounts from disabling logging. You can add supplementary trails in specific accounts for detailed debugging, but the organization trail should be your primary security logging mechanism. Make sure the central log bucket has strict access controls and prevents deletion or modification of logs.

How quickly can an attacker move laterally across AWS accounts after initial compromise?

With proper reconnaissance and existing overly permissive trust relationships, an attacker can pivot across multiple accounts in minutes. The actual time depends on how well they understand your account topology and what permissions the initially compromised credentials provide. I've seen skilled attackers enumerate trust relationships, identify target roles, and assume them across five accounts in under an hour. This speed is why prevention and architectural controls are more important than detection - by the time you detect the initial compromise, the attacker may have already laterally moved to their target.

Can AWS Organizations service control policies prevent cross-account lateral movement?

SCPs can help by restricting what actions principals in member accounts can perform, but they don't directly prevent role assumption across accounts. An SCP can prevent users in a development account from calling certain APIs, but if they can assume a role in production, the SCP in the development account doesn't restrict what they can do in production. You need to combine SCPs with properly configured trust policies, resource-based policies, and monitoring. Think of SCPs as one layer in defense in depth, not a complete solution.

What's the most common way attackers initially gain access to an AWS account before lateral movement?

Compromised credentials remain the most common initial access vector - either through phishing, credential stuffing against reused passwords, or exposure of access keys in public GitHub repositories or Docker images. Vulnerable applications running in AWS are another frequent entry point, where attackers exploit web application vulnerabilities to access instance metadata services and obtain IAM credentials. Less common but still significant are supply chain compromises where attackers gain access through third-party tools or services that have been granted cross-account permissions.

How do I balance security with legitimate operational needs for cross-account access?

Start by documenting every legitimate cross-account access use case and the minimum permissions required. Implement break-glass procedures for emergency access that require manual approval and generate alerts. Use time-limited sessions rather than permanent permissions wherever possible. Design your architecture so that most development and testing workflows don't require production access - use sanitized data copies, separate environments, and infrastructure-as-code that can be tested in isolation. When cross-account access is necessary, make it auditable, time-limited, and scoped to specific use cases rather than broad administrative permissions.

What to Watch

  • AI-powered lateral movement detection - Machine learning models that understand normal cross-account access patterns for specific organizations and can detect anomalies in real-time are becoming more sophisticated. These systems can identify subtle sequences of role assumptions that human analysts might miss, but they require extensive training data and careful tuning to avoid alert fatigue.
  • Zero-trust architecture for cloud - The principle of never trusting network location is evolving to include never trusting account boundaries. Expect to see more organizations implementing cryptographic verification for every cross-account access attempt, treating account boundaries as untrusted even within the same organization.
  • Regulatory focus on cloud architecture - As breaches involving cross-account lateral movement become more visible, regulators are beginning to understand cloud-specific attack vectors. Expect updated compliance guidance that specifically addresses multi-account cloud architectures and requires demonstrable controls for cross-account access.
  • Integration between cloud security and [AI](/category/ai) governance - As machine learning workloads become more common in multi-account AWS environments, the intersection between cloud security and AI security will drive new tooling. Expect platforms that understand both IAM policies and ML-specific risks like adversarial suffix attacks that could be launched across account boundaries.

Conclusion

Cross-account lateral movement in AWS Organizations represents one of the most significant architectural security challenges in modern cloud environments. The trust relationships that make multi-account management practical also create attack paths that traditional security controls weren't designed to address. Every AssumeRole permission, every cross-account S3 bucket policy, every shared KMS key is a potential pivot point.

The solution isn't to abandon multi-account architectures - the operational and security benefits of account separation are real. Instead, you need to treat cross-account access as a security-critical capability that requires careful design, continuous monitoring, and regular review. Trust policies deserve the same scrutiny as permission policies. Account boundaries should function as meaningful security controls, not just administrative conveniences.

This requires investment in automation, monitoring, and expertise. You need tools that can map your cross-account topology, detect unusual access patterns, and enforce least privilege at the trust policy level. You need people who understand IAM policy evaluation deeply enough to design secure cross-account architectures. You need processes that regularly review and prune unused trust relationships.

The organizations that get this right treat cross-account security as a continuous practice, not a one-time configuration. They assume that any individual account might be compromised and design their architecture to limit what an attacker can do from that foothold. They monitor aggressively and respond quickly when unusual cross-account access patterns appear.

If you're struggling to secure cross-account access in your AWS Organization, you're not alone - but you shouldn't tackle this in isolation. Contact our team to discuss how we can help assess your cross-account security posture and implement controls that balance operational needs with security requirements. The attack paths exist in your environment right now. The question is whether you'll discover and close them before an attacker does.

Reader questions

FAQs

Topics
#Cloud Security#AWS#IAM#Lateral Movement#Cloud Architecture#Incident Response
Keep reading

More from cloud