gcp-filestore-export-rule-widen

file.instances.update lets a caller patch the nfsExportOptions export rules of a Filestore instance via the googleapis.com API, adding an attacker-controlled IP range. This is a control-plane capability scoped to nfsExportOptions config. Subsequent NFS mount access (CanReadData/CanWriteData) requires network reachability.

explicit gcp emits CanModifyConfiguration

match (effective permission)

{ "action": "file.instances.update", "resource_type": "google.file.Instance" }

emit

source typeIdentity
target typeFileStorage
source<principal>
target<Filestore instance nfsExportOptions>
permissionsfile.instances.update
conditionsiam_permission
state logicACTIVE when file.instances.update is held at the instance scope (via project- or folder-level IAM binding). The control-plane API call (instances.patch) is made to googleapis.com over HTTPS and is NOT gated by network_reachability to the NFS port 2049. BLOCKED if an IAM deny policy or org policy denies file.instances.update at the instance scope or any parent scope.

Narrative

{principal.name} holds file.instances.update on {instance.name} and can modify the NFS export rules (instances.patch) to add an attacker-controlled CIDR range, enabling subsequent NFS mount access if network reachability exists.

Raw rule rules/explicit/gcp-filestore.yaml

id: gcp-filestore-export-rule-widen
emits: CanModifyConfiguration
description: file.instances.update lets a caller patch the nfsExportOptions export rules of a Filestore
  instance via the googleapis.com API, adding an attacker-controlled IP range. This is a control-plane
  capability scoped to nfsExportOptions config. Subsequent NFS mount access (CanReadData/CanWriteData)
  requires network reachability.
match_effective_permission:
  action: file.instances.update
  resource_type: google.file.Instance
emit:
  source_type: Identity
  target_type: FileStorage
  source: <principal>
  target: <Filestore instance nfsExportOptions>
  permissions:
  - file.instances.update
  conditions:
  - iam_permission
  state_logic: ACTIVE when file.instances.update is held at the instance scope (via project- or folder-level
    IAM binding). The control-plane API call (instances.patch) is made to googleapis.com over HTTPS and
    is NOT gated by network_reachability to the NFS port 2049. BLOCKED if an IAM deny policy or org policy
    denies file.instances.update at the instance scope or any parent scope.
  confidence: min(contributing_confidences) * 0.95
  derived_from: []
  false_positive_note: 'file.instances.update is required and sufficient to patch nfsExportOptions. This
    edge represents the control-plane mutation capability only. Downstream NFS data-access (CanReadData/CanWriteData
    on mounted files) requires: (a) the attacker to actually add their IP to the export rules, (b) network
    reachability (VPC connectivity + no firewall block on TCP/UDP 2049). Derived rules emit the data-plane
    edges after export rules are widened. An org policy preventing export-rule changes will emit this
    edge as BLOCKED. A VPC firewall blocking TCP/UDP 2049 blocks the data-plane, not this control- plane
    edge. The access-mode written by the attacker (READ_WRITE vs READ_ONLY) determines whether downstream
    CanWriteData also applies.'
  narrative: '{principal.name} holds file.instances.update on {instance.name} and can modify the NFS export
    rules (instances.patch) to add an attacker-controlled CIDR range, enabling subsequent NFS mount access
    if network reachability exists.'
move · open · esc close