Description
Ensure that Google Cloud VPC network firewall rules do not allow unrestricted access (0.0.0.0/0) on TCP and UDP port 53. Restrict DNS traffic to trusted IP addresses or ranges to reduce the attack surface and enhance security.
Ensure that Google Cloud VPC network firewall rules do not allow unrestricted access (0.0.0.0/0) on TCP and UDP port 53. Restrict DNS traffic to trusted IP addresses or ranges to reduce the attack surface and enhance security.
id: gcloud-unrestricted-dns-access
info:
name: Check for Unrestricted DNS Access
author: princechaddha
severity: high
description: |
Ensure that Google Cloud VPC network firewall rules do not allow unrestricted access (0.0.0.0/0) on TCP and UDP port 53. Restrict DNS traffic to trusted IP addresses or ranges to reduce the attack surface and enhance security.
impact: |
Allowing unrestricted access to TCP/UDP port 53 exposes DNS servers and associated resources to potential attacks.
remediation: |
Update your VPC firewall rules to allow DNS traffic only from trusted IP addresses or ranges.
reference:
- https://cloud.google.com/vpc/docs/firewalls
tags: cloud,devops,gcp,gcloud,vpc,firewall,dns,security,networking,gcp-cloud-config
flow: |
code(1)
for(let projectId of iterate(template.projectIds)){
set("projectId", projectId)
code(2)
for(let networkName of iterate(template.networks)){
set("networkName", networkName)
code(3)
set("firewallRules", template.firewallRules)
javascript(1)
}
}
self-contained: true
code:
- engine:
- sh
- bash
source: |
gcloud projects list --format="json(projectId)"
extractors:
- type: json
name: projectIds
internal: true
json:
- '.[].projectId'
- engine:
- sh
- bash
source: |
gcloud compute networks list --project $projectId --format="json(name)"
extractors:
- type: json
name: networks
internal: true
json:
- '.[].name'
- engine:
- sh
- bash
source: |
gcloud compute firewall-rules list --filter network=$networkName --sort-by priority --format="json(name,disabled,direction,sourceRanges,allowed[].ports)"
extractors:
- type: json
name: firewallRules
internal: true
json:
- '.[]'
javascript:
- code: |
let firewallRules = template.firewallRules;
if (typeof firewallRules === "string") {
firewallRules = JSON.parse(firewallRules);
}
let insecureRules = [];
for (let rule of firewallRules) {
if (
rule.disabled === false &&
rule.direction === "INGRESS" &&
Array.isArray(rule.sourceRanges) && rule.sourceRanges.includes("0.0.0.0/0") &&
Array.isArray(rule.allowed) &&
rule.allowed.some(allowed =>
Array.isArray(allowed.ports) &&
(allowed.ports.includes("53"))
)
) {
insecureRules.push(rule.name);
}
}
if (insecureRules.length > 0) {
Export(`The firewall rules in network ${template.networkName} of project ${template.projectId} allow unrestricted DNS access: ${insecureRules.join(", ")}`);
}
extractors:
- type: dsl
dsl:
- response
# digest: 4a0a00473045022100ad3bef3b1123e5e2ac49fdec1cd1eb27fe2d1d4a53e660850d5367d1435e38bc02200d1b2af1613895399f2d25b91c50426e9fb9d8fd896a55b0d2e0fac9dfc29a5d:922c64590222798bb761d5b6d8e72950
# Visit https://trap.biu.life/ to view exploit trends for this vulnerability.