# GCP - KMS Privesc

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

## KMS

Informacije o KMS:

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

Napomena da u KMS **dozvole** nisu samo **nasleđene** iz Organizacija, Foldera i Projekata, već i iz **Keyrings**.

### `cloudkms.cryptoKeyVersions.useToDecrypt`

Možete koristiti ovu dozvolu da **dekriptuјete informacije sa ključem** nad kojim imate ovu dozvolu.
```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]
```
### `cloudkms.cryptoKeys.setIamPolicy`

Napadač sa ovom dozvolom mogao bi **da sebi dodeli dozvole** da koristi ključ za dešifrovanje informacija.
```bash
gcloud kms keys add-iam-policy-binding [KEY_NAME] \
--location [LOCATION] \
--keyring [KEYRING_NAME] \
--member [MEMBER] \
--role roles/cloudkms.cryptoKeyDecrypter
```
### `cloudkms.cryptoKeyVersions.useToDecryptViaDelegation`

Evo konceptualnog pregleda kako ova delegacija funkcioniše:

1. **Service Account A** ima direktan pristup za dekripciju koristeći određeni ključ u KMS-u.
2. **Service Account B** dobija dozvolu `useToDecryptViaDelegation`. Ovo mu omogućava da zatraži KMS da dekriptuje podatke u ime Service Account A.

Korišćenje ove **dozvole je implicitno u načinu na koji KMS servis proverava dozvole** kada se podnese zahtev za dekripciju.

Kada podnesete standardni zahtev za dekripciju koristeći Google Cloud KMS API (u Pythonu ili drugom jeziku), servis **proverava da li traženi servisni nalog ima potrebne dozvole**. Ako zahtev podnosi servisni nalog sa **`useToDecryptViaDelegation`** dozvolom, KMS proverava da li je ovaj **nalog ovlašćen da zatraži dekripciju u ime entiteta koji poseduje ključ**.

#### Podešavanje za Delegaciju

1. **Definišite Prilagođenu Ulogu**: Kreirajte YAML datoteku (npr. `custom_role.yaml`) koja definiše prilagođenu ulogu. Ova datoteka treba da uključuje `cloudkms.cryptoKeyVersions.useToDecryptViaDelegation` dozvolu. Evo primera kako bi ova datoteka mogla izgledati:
```yaml
title: "KMS Decryption via Delegation"
description: "Allows decryption via delegation"
stage: "GA"
includedPermissions:
- "cloudkms.cryptoKeyVersions.useToDecryptViaDelegation"
```
2. **Kreirajte Prilagođenu Ulogu Koristeći gcloud CLI**: Koristite sledeću komandu da kreirate prilagođenu ulogu u vašem Google Cloud projektu:
```bash
gcloud iam roles create kms_decryptor_via_delegation --project [YOUR_PROJECT_ID] --file custom_role.yaml
```
Zamenite `[YOUR_PROJECT_ID]` sa vašim Google Cloud ID-jem projekta.

3. **Dodelite prilagođenu ulogu servisnom nalogu**: Dodelite svoju prilagođenu ulogu servisnom nalogu koji će koristiti ovu dozvolu. Koristite sledeću komandu:
```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"
```
Zamenite `[YOUR_PROJECT_ID]` i `[SERVICE_ACCOUNT_EMAIL]` sa vašim ID-jem projekta i email adresom servisnog naloga, respektivno.

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