GCP - KMS Privesc

Soutenez HackTricks

KMS

Informations sur KMS :

GCP - KMS Enum

Notez que dans KMS, les autorisations ne sont pas seulement héritées des Organisations, des Dossiers et des Projets mais aussi des Trousseaux de clés.

cloudkms.cryptoKeyVersions.useToDecrypt

Vous pouvez utiliser cette autorisation pour déchiffrer des informations avec la clé sur laquelle vous avez cette autorisation.

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 se donner des permissions pour utiliser la clé afin de décrypter des informations.

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 ventilation conceptuelle de la façon dont cette délégation fonctionne :

  1. Le compte de service A a un accès direct pour décrypter en utilisant une clé spécifique dans KMS.

  2. Le compte de service B se voit accorder l'autorisation useToDecryptViaDelegation. Cela lui permet de demander à KMS de décrypter des données au nom du compte de service A.

L'utilisation de cette autorisation est implicite dans la manière dont le service KMS vérifie les autorisations lorsqu'une demande de décryptage est effectuée.

Lorsque vous faites une demande de décryptage 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 autorisations nécessaires. Si la demande est faite par un compte de service avec l'autorisation useToDecryptViaDelegation, KMS vérifie si ce compte est autorisé à demander le décryptage 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 l'autorisation cloudkms.cryptoKeyVersions.useToDecryptViaDelegation. Voici un exemple de ce à quoi pourrait ressembler ce fichier :

title: "KMS Decryption via Delegation"
description: "Allows decryption via delegation"
stage: "GA"
includedPermissions:
- "cloudkms.cryptoKeyVersions.useToDecryptViaDelegation"
  1. Créer le rôle personnalisé en utilisant la CLI gcloud : Utilisez la commande suivante pour créer le rôle personnalisé dans votre projet Google Cloud :

gcloud iam roles create kms_decryptor_via_delegation --project [YOUR_PROJECT_ID] --file custom_role.yaml

Remplacez [VOTRE_ID_DE_PROJET] par l'ID de votre projet Google Cloud.

  1. Accorder le rôle personnalisé à un compte de service : Attribuez votre rôle personnalisé à un compte de service qui utilisera cette autorisation. Utilisez la commande suivante :

# 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 [VOTRE_ID_DE_PROJET] et [EMAIL_DU_COMPTE_DE_SERVICE] par votre ID de projet et l'e-mail du compte de service, respectivement.

Soutenez HackTricks

Last updated