CIEM & attack paths
A misconfiguration is a fact; an attack path is a story - the chain that turns "this bucket is public" into "an attacker takes over the account." Cloud Posture computes both.
CIEM - identity & privilege escalation
apPosture analyses IAM for privilege-escalation paths using the well-known privesc set:
editing a policy version, attaching an admin policy, creating credentials,
sts:AssumeRole, broad iam:PassRole, and Lambda code injection.
To keep the signal clean, these are flagged only in unconditional Allow statements - a
grant constrained by a Condition is treated as legitimate - and the wide-blast-radius
ones (broad PassRole, Lambda injection) require a wildcard resource. Representative
controls:
- IAM privilege escalation (critical, CWE-269) - a policy that enables one of the privesc primitives.
- Role reaches admin - a role with a privesc path to account-admin, tagged MITRE T1548.
- Confused-deputy trust - external-account trust without an
ExternalId/SourceArn. - Wildcard trust - a role that trusts
Principal: *.
Admin roles are recognised cross-cloud - GCP owner / editor / iam.securityAdmin /
serviceAccountTokenCreator, Azure Owner / Contributor / User Access Administrator.
Attack paths
The Attack paths tab renders toxic combinations that actually exist in the snapshot. A path is only drawn when every edge is present - a missing link means no path, never a fabricated one. Modeled chains include:
internet → security group → instance → assumes IAM role → escalates → account admin(critical). IMDSv1 is annotated on the instance→role edge - SSRF can steal the role's credentials.internet → public S3 bucketandinternet → public RDS.
Alongside the graph, the evaluator flags crown-jewel toxic combinations: a resource that carries an internet-exposure finding plus a privilege, data or threat dimension is escalated to critical - exposure is the required ignition.
Notable attack-path controls
- IMDSv2 not enforced, and an IMDS hop limit > 1 that lets a container reach the instance's credentials.
- IRSA absent on EKS - pods fall back to the node role.
- ELB HTTP desync mitigation not set to strictest.
- CloudFront origin reachable directly (bypassing the distribution and its WAF), HTTP allowed, or deprecated TLS.
- Subdomain takeover via Route 53 - an A/AAAA record pointing at a released Elastic IP the account no longer owns (reported N/A if the IP list cannot be read).
- Lambda / Elastic Beanstalk execution role has admin, and Lambda function URLs with
AuthType=NONE. - Proven internet reachability (
EC2.REACH) - requiring an internet gateway, a public IP, an open security group and aligned NACLs together, so "reachable" is not guessed.
Attack-path collection runs live in a bounded background thread (about 8 seconds); if it cannot finish it falls back to a clearly-labelled example graph rather than blocking.