GCP - KMS Privesc

Support HackTricks

KMS

Información sobre KMS:

GCP - KMS Enum

Tenga en cuenta que en KMS los permisos no solo se heredan de Organizaciones, Carpetas y Proyectos, sino también de Keyrings.

cloudkms.cryptoKeyVersions.useToDecrypt

Puede usar este permiso para desencriptar información con la clave sobre la que tiene este permiso.

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 atacante con este permiso podría darse permisos para usar la clave para descifrar información.

gcloud kms keys add-iam-policy-binding [KEY_NAME] \
--location [LOCATION] \
--keyring [KEYRING_NAME] \
--member [MEMBER] \
--role roles/cloudkms.cryptoKeyDecrypter

cloudkms.cryptoKeyVersions.useToDecryptViaDelegation

Aquí hay un desglose conceptual de cómo funciona esta delegación:

  1. La Cuenta de Servicio A tiene acceso directo para descifrar utilizando una clave específica en KMS.

  2. La Cuenta de Servicio B recibe el permiso useToDecryptViaDelegation. Esto le permite solicitar a KMS que descifre datos en nombre de la Cuenta de Servicio A.

El uso de este permiso es implícito en la forma en que el servicio KMS verifica los permisos cuando se realiza una solicitud de descifrado.

Cuando realizas una solicitud de descifrado estándar utilizando la API de Google Cloud KMS (en Python u otro lenguaje), el servicio verifica si la cuenta de servicio solicitante tiene los permisos necesarios. Si la solicitud es realizada por una cuenta de servicio con el permiso useToDecryptViaDelegation, KMS verifica si esta cuenta tiene permitido solicitar el descifrado en nombre de la entidad que posee la clave.

Configuración para la Delegación

  1. Definir el Rol Personalizado: Crea un archivo YAML (por ejemplo, custom_role.yaml) que defina el rol personalizado. Este archivo debe incluir el permiso cloudkms.cryptoKeyVersions.useToDecryptViaDelegation. Aquí hay un ejemplo de cómo podría verse este archivo:

title: "KMS Decryption via Delegation"
description: "Allows decryption via delegation"
stage: "GA"
includedPermissions:
- "cloudkms.cryptoKeyVersions.useToDecryptViaDelegation"
  1. Crea el Rol Personalizado Usando el gcloud CLI: Usa el siguiente comando para crear el rol personalizado en tu proyecto de Google Cloud:

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

Reemplace [YOUR_PROJECT_ID] con su ID de proyecto de Google Cloud.

  1. Otorgar el Rol Personalizado a una Cuenta de Servicio: Asigne su rol personalizado a una cuenta de servicio que utilizará este permiso. Use el siguiente comando:

# 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"

Reemplace [YOUR_PROJECT_ID] y [SERVICE_ACCOUNT_EMAIL] con su ID de proyecto y el correo electrónico de la cuenta de servicio, respectivamente.

Support HackTricks

Last updated