# GCP - KMS Privesc

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

## KMS

Informations sur KMS :

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

Notez qu'avec KMS, les **permissions** ne sont pas seulement **héritées** des Organisations, Dossiers et Projets, mais aussi des **Keyrings**.

### `cloudkms.cryptoKeyVersions.useToDecrypt`

Vous pouvez utiliser cette permission pour **décrypter des informations avec la clé** sur laquelle vous avez cette permission.
```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`

Un attaquant avec cette permission pourrait **s'accorder des permissions** pour utiliser la clé afin de déchiffrer des informations.
```bash
gcloud kms keys add-iam-policy-binding [KEY_NAME] \
--location [LOCATION] \
--keyring [KEYRING_NAME] \
--member [MEMBER] \
--role roles/cloudkms.cryptoKeyDecrypter
```
### `cloudkms.cryptoKeyVersions.useToDecryptViaDelegation`

Voici une explication conceptuelle de la façon dont cette délégation fonctionne :

1. **Le Compte de Service A** a un accès direct pour déchiffrer en utilisant une clé spécifique dans KMS.
2. **Le Compte de Service B** se voit accorder la permission `useToDecryptViaDelegation`. Cela lui permet de demander à KMS de déchiffrer des données au nom du Compte de Service A.

L'utilisation de cette **permission est implicite dans la façon dont le service KMS vérifie les permissions** lorsqu'une demande de déchiffrement est faite.

Lorsque vous faites une demande de déchiffrement standard en utilisant l'API Google Cloud KMS (en Python ou dans un autre langage), le service **vérifie si le compte de service demandeur a les permissions nécessaires**. Si la demande est faite par un compte de service avec la **permission `useToDecryptViaDelegation`**, KMS vérifie si ce **compte est autorisé à demander le déchiffrement au nom de l'entité qui possède la clé**.

#### Configuration pour la Délégation

1. **Définir le Rôle Personnalisé** : Créez un fichier YAML (par exemple, `custom_role.yaml`) qui définit le rôle personnalisé. Ce fichier doit inclure la permission `cloudkms.cryptoKeyVersions.useToDecryptViaDelegation`. Voici un exemple de ce à quoi ce fichier pourrait ressembler :
```yaml
title: "KMS Decryption via Delegation"
description: "Allows decryption via delegation"
stage: "GA"
includedPermissions:
- "cloudkms.cryptoKeyVersions.useToDecryptViaDelegation"
```
2. **Créer le rôle personnalisé en utilisant le gcloud CLI** : Utilisez la commande suivante pour créer le rôle personnalisé dans votre projet Google Cloud :
```bash
gcloud iam roles create kms_decryptor_via_delegation --project [YOUR_PROJECT_ID] --file custom_role.yaml
```
Remplacez `[YOUR_PROJECT_ID]` par l'ID de votre projet Google Cloud.

3. **Accorder le rôle personnalisé à un compte de service** : Assignez votre rôle personnalisé à un compte de service qui utilisera cette autorisation. Utilisez la commande suivante :
```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"
```
Remplacez `[YOUR_PROJECT_ID]` et `[SERVICE_ACCOUNT_EMAIL]` par l'ID de votre projet et l'email du compte de service, respectivement.

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