Beim Lesen der in einer BigQuery-Tabelle gespeicherten Informationen kann es möglich sein, sensible Informationen zu finden. Um auf die Informationen zuzugreifen, werden die Berechtigungen bigquery.tables.get, bigquery.jobs.create und bigquery.tables.getData benötigt:
BigQuery-Tabellendaten lesen
```bash
bq head .
bq query --nouse_legacy_sql 'SELECT * FROM `..` LIMIT 1000'
```
Dies ist eine weitere Möglichkeit, auf die Daten zuzugreifen. Exportiere sie in einen cloud storage bucket und lade die Dateien mit den Informationen herunter. Für diese Aktion werden folgende Berechtigungen benötigt: bigquery.tables.export, bigquery.jobs.create und storage.objects.create.
BigQuery-Tabelle in Cloud Storage exportieren
```bash
bq extract .
Es könnte möglich sein, bestimmte vertrauenswürdige Daten in einer Bigquery Tabelle einzufügen, um eine Schwachstelle an anderer Stelle auszunutzen. Dies kann einfach mit den Berechtigungen bigquery.tables.get, bigquery.tables.updateData und bigquery.jobs.create durchgeführt werden:
</details>
### `bigquery.datasets.setIamPolicy`
Ein Angreifer könnte dieses Recht missbrauchen, um **sich selbst weitere Berechtigungen** für ein BigQuery-Dataset zu gewähren:
<details>
<summary>IAM-Policy für BigQuery-Dataset setzen</summary>
```bash
# For this you also need bigquery.tables.getIamPolicy
bq add-iam-policy-binding \
--member='user:<email>' \
--role='roles/bigquery.admin' \
<proj>:<dataset>
# use the set-iam-policy if you don't have bigquery.tables.getIamPolicy
Nur diese Berechtigung ermöglicht es, deinen Zugriff auf ein BigQuery-Dataset zu aktualisieren, indem du die ACLs änderst, die angeben, wer darauf zugreifen kann:
ACLs eines BigQuery-Datasets aktualisieren
```bash
# Download current permissions, reqires bigquery.datasets.get
bq show --format=prettyjson : > acl.json
## Give permissions to the desired user
bq update --source acl.json :
## Read it with
bq head $PROJECT_ID:.
Ein Angreifer könnte dieses Privileg missbrauchen, um sich weitere Berechtigungen für eine BigQuery-Tabelle zu verschaffen:
IAM-Richtlinie auf BigQuery-Tabelle setzen
```bash
# For this you also need bigquery.tables.setIamPolicy
bq add-iam-policy-binding \
--member='user:' \
--role='roles/bigquery.admin' \
:.
</details>
### `bigquery.rowAccessPolicies.update`, `bigquery.rowAccessPolicies.setIamPolicy`, `bigquery.tables.getData`, `bigquery.jobs.create`
Laut der Dokumentation ist es mit den genannten Berechtigungen möglich, **eine Row-Access-Policy zu aktualisieren.**\
Allerdings benötigst du bei Verwendung der CLI `bq` noch zusätzliche Berechtigungen: **`bigquery.rowAccessPolicies.create`**, **`bigquery.tables.get`**.
<details>
<summary>Row-Access-Policy erstellen oder ersetzen</summary>
```bash
bq query --nouse_legacy_sql 'CREATE OR REPLACE ROW ACCESS POLICY <filter_id> ON `<proj>.<dataset-name>.<table-name>` GRANT TO ("<user:user@email.xyz>") FILTER USING (term = "Cfba");' # A example filter was used
Es ist möglich, die Filter-ID in der Ausgabe der Aufzählung der Zeilenzugriffsrichtlinien zu finden. Beispiel:
Zeilenzugriffsrichtlinien auflisten
```bash
bq ls --row_access_policies :.
Id Filter Predicate Grantees Creation Time Last Modified Time
apac_filter term = “Cfba” user:asd@hacktricks.xyz 21 Jan 23:32:09 21 Jan 23:32:09
</details>
Wenn Sie **`bigquery.rowAccessPolicies.delete`** statt **`bigquery.rowAccessPolicies.update`** haben, können Sie die Policy auch einfach löschen:
<details>
<summary>Row access policies löschen</summary>
```bash
# Remove one
bq query --nouse_legacy_sql 'DROP ALL ROW ACCESS POLICY <policy_id> ON `<proj>.<dataset-name>.<table-name>`;'
# Remove all (if it's the last row policy you need to use this
bq query --nouse_legacy_sql 'DROP ALL ROW ACCESS POLICIES ON `<proj>.<dataset-name>.<table-name>`;'
Caution
Eine weitere mögliche Option, row access policies zu umgehen, wäre einfach den Wert der eingeschränkten Daten zu ändern. Wenn du nur sehen kannst, wenn termCfba ist, ändere einfach alle Datensätze der Tabelle so, dass term = "Cfba". Dies wird jedoch von bigquery verhindert.