gcp-secretmanager-public-accessor
A secret allow policy binding allUsers/allAuthenticatedUsers to secretAccessor exposes the payload broadly.
match (record)
{
"field": "iamPolicy.bindings",
"resource_type": "google.secretmanager.Secret"
}
where
a binding on the secret (or inherited) grants roles/secretmanager.secretAccessor (or versions.access) to allUsers or allAuthenticatedUsers
emit
| source type | * |
|---|---|
| source | <secret> |
| target | <Tenant/Organization> |
| permissions | secretmanager.versions.access |
| conditions | resource_policy |
| state logic | ACTIVE if the wildcard binding is present and not overridden by an IAM deny / org policy / VPC-SC perimeter; else BLOCKED. |
Narrative
Secret {secret.name} is readable by any Google-authenticated principal (allUsers/allAuthenticatedUsers bound to roles/secretmanager.secretAccessor).
Raw rule rules/derived/gcp/secretmanager.yaml
id: gcp-secretmanager-public-accessor
emits: ExposedToTenant
description: A secret allow policy binding allUsers/allAuthenticatedUsers to secretAccessor exposes the
payload broadly.
match_record:
resource_type: google.secretmanager.Secret
field: iamPolicy.bindings
where:
- a binding on the secret (or inherited) grants roles/secretmanager.secretAccessor (or versions.access)
to allUsers or allAuthenticatedUsers
emit:
source_type: '*'
source: <secret>
target: <Tenant/Organization>
permissions:
- secretmanager.versions.access
conditions:
- resource_policy
state_logic: ACTIVE if the wildcard binding is present and not overridden by an IAM deny / org policy
/ VPC-SC perimeter; else BLOCKED.
confidence: '0.9'
derived_from:
- <secret iamPolicy binding to allUsers/allAuthenticatedUsers>
false_positive_note: "allAuthenticatedUsers = any Google account (tenant/org-wide), NOT anonymous internet\
\ \u2014 Secret Manager has no anonymous data plane, so model as ExposedToTenant, never ExposedToInternet.\
\ A DOMAIN_RESTRICTED_SHARING org policy or a VPC-SC perimeter can neutralize allUsers/allAuthenticatedUsers\
\ -> BLOCKED."
narrative: Secret {secret.name} is readable by any Google-authenticated principal (allUsers/allAuthenticatedUsers
bound to roles/secretmanager.secretAccessor).