GCP - KMS Privesc

支持HackTricks

KMS

关于KMS的信息:

GCP - KMS Enum

请注意,在KMS中,权限不仅来自于组织、文件夹和项目,还来自于密钥环

cloudkms.cryptoKeyVersions.useToDecrypt

您可以使用此权限来使用您拥有此权限的密钥解密信息

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

拥有这个权限的攻击者可以给自己授予权限以使用密钥解密信息。

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

cloudkms.cryptoKeyVersions.useToDecryptViaDelegation

以下是这种委托如何工作的概念性分解:

  1. 服务账号 A 可以直接使用 KMS 中的特定密钥进行解密。

  2. 服务账号 B 被授予 useToDecryptViaDelegation 权限。这使其能够请求 KMS 代表服务账号 A 解密数据。

在进行解密请求时,KMS 服务检查权限的方式是隐式的

当您使用 Google Cloud KMS API(使用 Python或其他语言)进行标准解密请求时,服务会检查请求的服务账号是否具有必要的权限。如果请求由具有**useToDecryptViaDelegation权限的服务账号发出,KMS 将验证此账号是否被允许代表拥有密钥的实体请求解密**。

设置委托

  1. 定义自定义角色:创建一个 YAML 文件(例如 custom_role.yaml),定义自定义角色。此文件应包括 cloudkms.cryptoKeyVersions.useToDecryptViaDelegation 权限。以下是此文件可能的示例:

title: "KMS Decryption via Delegation"
description: "Allows decryption via delegation"
stage: "GA"
includedPermissions:
- "cloudkms.cryptoKeyVersions.useToDecryptViaDelegation"
  1. 使用 gcloud CLI 创建自定义角色:使用以下命令在您的 Google Cloud 项目中创建自定义角色:

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

[YOUR_PROJECT_ID]替换为您的Google Cloud项目ID。

  1. 授予自定义角色给服务账号:将您的自定义角色分配给将使用此权限的服务账号。使用以下命令:

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

替换[YOUR_PROJECT_ID][SERVICE_ACCOUNT_EMAIL]为您的项目ID和服务账号的电子邮件地址。

支持 HackTricks

Last updated