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.
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. |
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.'