# GCP - KMS Privesc

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

## KMS

Inligting oor KMS:

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

Let daarop dat in KMS die **toestemmings** nie net **geërf** word van Orgs, Folders en Projects nie, maar ook van **Keyrings**.

### `cloudkms.cryptoKeyVersions.useToDecrypt`

Jy kan hierdie toestemming gebruik om **inligting met die sleutel te ontsleutel** waarvoor jy hierdie toestemming het.

<details><summary>Ontsleutel data met KMS-sleutel</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`

An attacker met hierdie toestemming kan **homself bevoegdhede gee** om die sleutel te gebruik om inligting te decrypt.

<details><summary>Gee jouself die 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`

Hier is 'n konseptuele uiteensetting van hoe hierdie delegasie werk:

1. **Service Account A** het direkte toegang om te ontsleutel met 'n spesifieke sleutel in KMS.
2. **Service Account B** word die `useToDecryptViaDelegation`-toestemming gegee. Dit stel dit in staat om KMS te versoek om data namens Service Account A te ontsleutel.

Die gebruik van hierdie **toestemming is implisiet in die manier waarop die KMS-diens toestemming kontroleer** wanneer 'n ontsleutelingversoek gemaak word.

Wanneer jy 'n standaard ontsleutelingversoek maak met die Google Cloud KMS API (in Python of 'n ander taal), kyk die diens **of die aanvraende service account die nodige toestemmings het**. As die versoek gemaak is deur 'n service account met die **`useToDecryptViaDelegation`**-toestemming, verifieer KMS of hierdie **service account toegelaat is om ontsleuteling namens die entiteit wat die sleutel besit te versoek**.

#### Opstel vir delegasie

1. **Define the Custom Role**: Skep 'n YAML-lêer (bv. `custom_role.yaml`) wat die custom role definieer. Hierdie lêer moet die `cloudkms.cryptoKeyVersions.useToDecryptViaDelegation`-toestemming insluit. Hier is 'n voorbeeld van hoe hierdie lêer kan lyk:

<details><summary>Custom role YAML-definisie</summary>
```yaml
title: "KMS Decryption via Delegation"
description: "Allows decryption via delegation"
stage: "GA"
includedPermissions:
- "cloudkms.cryptoKeyVersions.useToDecryptViaDelegation"
```
</details>

2. **Skep die aangepaste rol met die gcloud CLI**: Gebruik die volgende opdrag om die aangepaste rol in jou Google Cloud-projek te skep:

<details><summary>Skep aangepaste KMS-rol</summary>
```bash
gcloud iam roles create kms_decryptor_via_delegation --project [YOUR_PROJECT_ID] --file custom_role.yaml
```
Vervang `[YOUR_PROJECT_ID]` met jou Google Cloud-projek-ID.

</details>

3. **Ken die pasgemaakte rol toe aan ’n diensrekening**: Ken jou pasgemaakte rol toe aan ’n diensrekening wat hierdie toestemming sal gebruik. Gebruik die volgende opdrag:

<details><summary>Ken pasgemaakte rol toe aan diensrekening</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"
```
Vervang [YOUR_PROJECT_ID] en [SERVICE_ACCOUNT_EMAIL] met jou projek-ID en die e-pos van die diensrekening, onderskeidelik.

</details>

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