GCP_PARENT
Summary
Forestall ACL Alias
GCP_PARENT
GCP Alias
Entity Relation (Structural)
Affected Object Types
Organizations, Organizational Units, Folders, Projects, Users, Groups, Roles, Devices, Service Accounts, Virtual Machines, KMS Keys, Workload Identity Pools, Workforce Identity Pools, Workload Providers, Workforce Providers, Principals
Exploitation Certainty
Certain
Description
GCP_PARENT is the structural edge representing parent-to-child containment in the Google Cloud resource hierarchy and at the Google Workspace Customer root.
The Customer is the Google Workspace tenancy root, identified by a Customer ID (e.g. C0xxxxxxx), and is linked 1:1 to the GCP Organization that roots the resource hierarchy:
Customer (root)
├── Organization ← the linked GCP resource hierarchy root
│ ├── Folder ──► Folder ──► Project
│ ├── Project (top-level, no folder)
│ └── Workforce Identity Pool
│ ├── Workforce Provider
│ └── Principal
├── Organizational Unit (top-level only)
├── Group
├── User
├── Role (admin role definition)
└── DeviceProjects are the leaf containers for the bulk of GCP resources:
Workforce Identity Pools similarly contain Workforce Providers and federated Principals. Because one edge type spans every tier, the child and parent object types determine what the edge means in a given traversal. A GCP_PARENT from a Folder to a Project carries IAM inheritance, while one from an Identity Pool to a Provider identifies the trust configuration contained by that pool.
Why the edge matters for attack paths:
IAM bindings in GCP are inherited downward. A role granted at the organization, folder, or project level applies to every resource beneath it, at any depth. GCP_PARENT is the chain that traversal follows to resolve that scope, so it determines the blast radius of every scoped role binding:
An organization-scoped binding reaches every folder, project, and resource in the tenancy.
A folder-scoped binding reaches all nested folders and projects, regardless of depth.
A project-scoped binding reaches the service accounts, VMs, and keys inside that project. This is what makes project-level
GCP_ACT_AS_SAfan out to every service account whose parent is that project.
For identity federation, GCP_PARENT also joins a Workload or Workforce Identity Pool to each Provider configured inside it. The Provider contains the issuer, audience, attribute mappings, and attribute conditions that decide which external identities the Pool trusts.
Identification
gcloud CLI
GCP Console
GCP hierarchy: Open GCP Console → IAM & Admin → Manage Resources. The tree renders the
GCP_PARENTchain directly — the Organization is the root, and each folder or project is drawn beneath its parent.Project contents: Select a project from the project picker. The project has a
GCP_PARENTedge to each resource it contains — IAM & Admin → Service Accounts, Compute Engine → VM Instances, Security → Secret Manager, and so on.Workspace Customer root: Open Google Admin Console (
admin.google.com) → Directory → Organizational units for top-level OUs, and Directory → Users / Groups for Customer-scoped objects.Identity federation: Open IAM & Admin → Workload Identity Federation or Workforce Identity Federation. Expand a Pool to see the Providers connected to it by
GCP_PARENT.Inherited IAM: On any project's IAM page, enable Include Google-provided role grants and review the Inheritance column — it names the ancestor the binding was granted on, which is the
GCP_PARENTchain resolved by GCP itself.
Exploitation
GCP_PARENT has no direct exploit — it is a structural edge. Its value to an attacker is as a reachability and blast-radius map, and each tier it spans carries a distinct consequence:
Organization — any binding at org scope reaches every resource in the tenancy. Roles such as
roles/resourcemanager.organizationAdminandroles/iam.securityAdmincreateGCP_SET_ORG_IAMPOLICYagainst the org node, which is full control of the organization.Folder — a folder-level binding applies to every nested folder and project without a separate grant on each. An attacker holding
GCP_SET_FOLDER_IAMPOLICYcontrols all child projects at once. Where prod and non-prod share a folder with inherited admin bindings, a staging compromise pivots to production through that shared scope.Project — the project is the primary blast radius for lateral movement. An identity with project-scoped
roles/iam.serviceAccountUsergainsGCP_ACT_AS_SAagainst every service account whose parent is that project, and project-scoped compute roles reach every VM in it.Customer root — Customer-scoped Users, Groups, Roles, Devices, and top-level OUs reveal the Workspace identity surface connected to the GCP Organization. OU membership and policy inheritance are traversed separately through
GCP_IN_OU.Identity Pool — Providers and federated Principals hang off Workforce and Workload Identity Pools. The Provider's issuer and attribute conditions determine who can cross the trust boundary, so enumerating Pool children reveals both existing federation paths and malicious Providers planted through
GCP_CREATE_WIF_POOL. This is the precondition forGCP_FEDERATE_IDENTITY.
Two structural observations are worth recording during assessment:
Cross-boundary service accounts. A service account's parent project is not the same as where it holds roles. An SA parented in Project A can hold bindings in Project B, so
GCP_PARENTcombined withGCP_HAS_ROLEexposes cross-project risk that neither edge shows on its own.Hierarchy sprawl. Many projects parented directly to the organization rather than to folders indicates weak governance and makes consistent folder-level controls impossible to apply.
Mitigation
Grant roles at the narrowest scope that works. Prefer project-level bindings over folder-level, and folder-level over organization-level. Every tier upward multiplies the number of resources the binding reaches through
GCP_PARENT.Minimize organization-level bindings. Restrict
roles/resourcemanager.organizationAdmin,roles/iam.securityAdmin, androles/ownerat org scope to break-glass accounts with just-in-time activation.Separate environments by folder. Keep production and non-production in different folders and never share high-privilege bindings between them.
Do not co-locate high-privilege service accounts with general workloads. Place org-admin and CI/CD service accounts in dedicated admin projects, so a workload project compromise does not expose them.
Organize projects into folders. Projects parented directly to the organization cannot be governed with folder-level controls; move them under appropriately scoped folders.
Minimize Super Admin assignments. Super Admin is always Customer-scoped. Limit it to two or three break-glass accounts with hardware security keys and no day-to-day use.
Audit every Pool's Providers. Require narrowly scoped attribute conditions and alert on unknown issuers or Providers added to existing Pools.
Bind specific federated subjects instead of whole Pools. Avoid broad pool-wide bindings when a Provider attribute can identify the intended repository, account, tenant, or group.
Audit the hierarchy for inherited bindings regularly. Review folder- and org-level grants on a schedule, since these carry the largest blast radius of any assignment.
Detection
Admin Activity
SetIamPolicy
Binding added at org, folder, or project scope — note resource.type for the tier
Admin Activity
CreateFolder MoveFolder DeleteFolder
Folder structure changes that alter inheritance scope
Admin Activity
CreateProject MoveProject
Project created or reparented under a new container
Admin Activity
CreateServiceAccount
New service account parented to a project
Admin Activity
*compute.instances.insert
New VM parented to a project
Admin Activity (GWS)
CREATE_ORG_UNIT MOVE_ORG_UNIT
Top-level OU created or moved to or from the Customer root
Admin Activity
CreateWorkloadIdentityPoolProvider
Workload Provider added beneath a Pool
Admin Activity
CreateWorkforcePoolProvider
Workforce Provider added beneath a Pool
Alert on:
Privileged roles (
roles/owner,roles/editor, org and folder admin roles) added at organization or folder scope by non-infrastructure accounts.Projects or folders moved so that they inherit broader bindings than before.
New projects parented directly to the organization instead of a folder.
Service accounts or VMs created in sensitive projects, particularly VMs with high-privilege service accounts attached.
New top-level OUs created under the Customer root.
Providers created beneath existing Pools, especially with an unknown issuer or an overly broad or missing
attributeCondition.
References
https://cloud.google.com/resource-manager/docs/cloud-platform-resource-hierarchy
https://cloud.google.com/iam/docs/resource-hierarchy-access-control
https://cloud.google.com/resource-manager/docs/creating-managing-folders
https://cloud.google.com/iam/docs/service-account-overview
https://developers.google.com/admin-sdk/directory/reference/rest/v1/orgunits
https://cloud.google.com/resource-manager/docs/organization-policy/overview
https://cloud.google.com/iam/docs/manage-workload-identity-pools-providers
https://cloud.google.com/iam/docs/manage-workforce-identity-pools-providers
Last updated
Was this helpful?