gcp-certmanager-cross-project-forge

A cross-project requester forging a cert a privileged consumer in the CA's project trusts enters that project.

derived gcp emits CanEnterProject

match

A conjunctive graph pattern. Variables (?x) bind node ids; every clause must hold.

{'principal': None} CanImpersonate {'target': None}

where

?principal.project != ?capool.project (the CanImpersonate was derived from a CanSignAs on a pool in another project) ?target has bindings granting privilege in ?capool.project (the forged identity is privileged in the CA's project)

emit

source typeIdentity
target typeProject
source<principal>
target<capool.project>
permissionsprivateca.certificates.create privateca.caPools.use
conditionsiam_permission condition_expression trust_relationship
state logicInherits the CanImpersonate state (already double-gated on issuance policy + trust). ACTIVE only when the cross-project issuance resolves, the subject is forgeable, a consuming trust exists, AND the forged identity is privileged in the CA's project; CONDITIONAL otherwise; BLOCKED if the CanImpersonate input is BLOCKED.

Narrative

{principal.name} (project {principal.project}) can issue a cert from CA pool {capool.name} in project {capool.project} impersonating {target.name}, which is privileged there - entering project {capool.project}.

Raw rule rules/derived/gcp/certmanager.yaml

id: gcp-certmanager-cross-project-forge
emits: CanEnterProject
description: A cross-project requester forging a cert a privileged consumer in the CA's project trusts
  enters that project.
match:
- - principal: null
  - CanImpersonate
  - target: null
where:
- ?principal.project != ?capool.project (the CanImpersonate was derived from a CanSignAs on a pool in
  another project)
- ?target has bindings granting privilege in ?capool.project (the forged identity is privileged in the
  CA's project)
emit:
  source_type: Identity
  target_type: Project
  source: <principal>
  target: <capool.project>
  permissions:
  - privateca.certificates.create
  - privateca.caPools.use
  conditions:
  - iam_permission
  - condition_expression
  - trust_relationship
  state_logic: Inherits the CanImpersonate state (already double-gated on issuance policy + trust). ACTIVE
    only when the cross-project issuance resolves, the subject is forgeable, a consuming trust exists,
    AND the forged identity is privileged in the CA's project; CONDITIONAL otherwise; BLOCKED if the CanImpersonate
    input is BLOCKED.
  confidence: min(contributing_confidences) * 0.85
  derived_from:
  - <CanImpersonate edge_id>
  - <cross-project pool binding>
  - <forged-identity privilege in capool.project>
  false_positive_note: "Only cross-boundary when principal and CA pool live in different projects AND\
    \ the forgeable identity is privileged in the pool's project AND a consumer there trusts the CA. A\
    \ cross-project certificateRequester binding is the common enabler; honor its condition expressions.\
    \ Inherits the issuance-policy and trust gates \u2014 do not upgrade to ACTIVE while either is unconfirmed."
  narrative: "{principal.name} (project {principal.project}) can issue a cert from CA pool {capool.name}\
    \ in project {capool.project} impersonating {target.name}, which is privileged there \u2014 entering\
    \ project {capool.project}."
move · open · esc close