Un attaccante con questo permesso potrebbe distruggere una versione KMS. Per fare questo, è necessario prima disabilitare la chiave e poi distruggerla:
# pip install google-cloud-kmsfrom google.cloud import kmsdefdisable_key_version(project_id,location_id,key_ring_id,key_id,key_version):"""Disables a key version in Cloud KMS."""# Create the client.client = kms.KeyManagementServiceClient()# Build the key version name.key_version_name = client.crypto_key_version_path(project_id, location_id, key_ring_id, key_id, key_version)# Call the API to disable the key version.client.update_crypto_key_version(request={'crypto_key_version': {'name': key_version_name, 'state': kms.CryptoKeyVersion.State.DISABLED}})
defdestroy_key_version(project_id,location_id,key_ring_id,key_id,key_version):"""Destroys a key version in Cloud KMS."""# Create the client.client = kms.KeyManagementServiceClient()# Build the key version name.key_version_name = client.crypto_key_version_path(project_id, location_id, key_ring_id, key_id, key_version)# Call the API to destroy the key version.client.destroy_crypto_key_version(request={'name': key_version_name})# Example usageproject_id ='your-project-id'location_id ='your-location'key_ring_id ='your-key-ring'key_id ='your-key-id'key_version ='1'# Version number to disable and destroy# Disable the key versiondisable_key_version(project_id, location_id, key_ring_id, key_id, key_version)# Destroy the key versiondestroy_key_version(project_id, location_id, key_ring_id, key_id, key_version)
KMS Ransomware
In AWS è possibile rubare completamente una chiave KMS modificando la policy della risorsa KMS e permettendo solo all'account dell'attaccante di usare la chiave. Poiché queste policy delle risorse non esistono in GCP, questo non è possibile.
Tuttavia, c'è un altro modo per eseguire un KMS Ransomware globale, che coinvolgerebbe i seguenti passaggi:
Creare una nuova versione della chiave con un materiale della chiave importato dall'attaccante
Questi permessi consentono di utilizzare una chiave KMS per crittografare i dati. Se un'entità ha uno di questi permessi, può potenzialmente crittografare i dati sensibili e quindi decrittografarli se ha anche i permessi di decrittografia.
Questi permessi consentono di utilizzare una chiave KMS per decrittografare i dati. Se un'entità ha uno di questi permessi, può potenzialmente accedere ai dati sensibili che sono stati crittografati con la chiave KMS.
cloudkms.cryptoKeyVersions.viewPublicKey
Questo permesso consente di visualizzare la chiave pubblica di una chiave asimmetrica. Questo è utile per verificare firme o crittografare dati che solo il possessore della chiave privata può decrittografare.
Questi permessi consentono di utilizzare una chiave privata per firmare dati. Se un'entità ha uno di questi permessi, può potenzialmente firmare dati a nome del proprietario della chiave privata.
cloudkms.cryptoKeyVersions.verify
Questo permesso consente di utilizzare una chiave pubblica per verificare firme. Se un'entità ha questo permesso, può verificare che i dati siano stati firmati dal possessore della chiave privata corrispondente.
Questi permessi consentono di utilizzare una chiave KMS per generare e verificare codici di autenticazione dei messaggi (MAC). Se un'entità ha questi permessi, può garantire l'integrità e l'autenticità dei dati.
cloudkms.cryptoKeyVersions.generateRandom
Questo permesso consente di utilizzare una chiave KMS per generare numeri casuali. Questo è utile per generare chiavi crittografiche, nonce, o altri valori che richiedono casualità crittografica.
from google.cloud import kmsimport base64defencrypt_symmetric(project_id,location_id,key_ring_id,key_id,plaintext):"""Encrypts data using a symmetric key from Cloud KMS."""# Create the client.client = kms.KeyManagementServiceClient()# Build the key name.key_name = client.crypto_key_path(project_id, location_id, key_ring_id, key_id)# Convert the plaintext to bytes.plaintext_bytes = plaintext.encode('utf-8')# Call the API.encrypt_response = client.encrypt(request={'name': key_name, 'plaintext': plaintext_bytes})ciphertext = encrypt_response.ciphertext# Optional: Encode the ciphertext to base64 for easier handling.return base64.b64encode(ciphertext)# Example usageproject_id ='your-project-id'location_id ='your-location'key_ring_id ='your-key-ring'key_id ='your-key-id'plaintext ='your-data-to-encrypt'ciphertext =encrypt_symmetric(project_id, location_id, key_ring_id, key_id, plaintext)print('Ciphertext:', ciphertext)
cloudkms.cryptoKeyVersions.useToSign
Descrizione
Il permesso cloudkms.cryptoKeyVersions.useToSign consente a un utente di firmare un payload utilizzando una chiave privata memorizzata in Google Cloud KMS.
Abuso
Un utente malintenzionato con il permesso cloudkms.cryptoKeyVersions.useToSign può firmare un payload con una chiave privata, che può essere utilizzata per vari scopi dannosi, come la creazione di token JWT falsi.
Il permesso cloudkms.cryptoKeyVersions.useToDecrypt consente a un utente di decrittografare un payload utilizzando una chiave privata memorizzata in Google Cloud KMS.
Abuso
Un utente malintenzionato con il permesso cloudkms.cryptoKeyVersions.useToDecrypt può decrittografare dati sensibili, che possono includere informazioni riservate o credenziali.
import hashlibfrom google.cloud import kmsdefsign_asymmetric(project_id,location_id,key_ring_id,key_id,key_version,message):"""Sign a message using an asymmetric key version from Cloud KMS."""# Create the client.client = kms.KeyManagementServiceClient()# Build the key version name.key_version_name = client.crypto_key_version_path(project_id, location_id, key_ring_id, key_id, key_version)# Convert the message to bytes and calculate the digest.message_bytes = message.encode('utf-8')digest ={'sha256': hashlib.sha256(message_bytes).digest()}# Call the API to sign the digest.sign_response = client.asymmetric_sign(name=key_version_name, digest=digest)return sign_response.signature# Example usage for signingproject_id ='your-project-id'location_id ='your-location'key_ring_id ='your-key-ring'key_id ='your-key-id'key_version ='1'message ='your-message'signature =sign_asymmetric(project_id, location_id, key_ring_id, key_id, key_version, message)print('Signature:', signature)
cloudkms.cryptoKeyVersions.useToVerify
Descrizione
Il permesso cloudkms.cryptoKeyVersions.useToVerify consente a un utente di verificare firme digitali utilizzando una chiave specifica.
Abuso
Un utente malintenzionato con il permesso cloudkms.cryptoKeyVersions.useToVerify può verificare firme digitali, il che potrebbe essere utilizzato per confermare l'autenticità di documenti o messaggi firmati.
from google.cloud import kmsimport hashlibdefverify_asymmetric_signature(project_id,location_id,key_ring_id,key_id,key_version,message,signature):"""Verify a signature using an asymmetric key version from Cloud KMS."""# Create the client.client = kms.KeyManagementServiceClient()# Build the key version name.key_version_name = client.crypto_key_version_path(project_id, location_id, key_ring_id, key_id, key_version)# Convert the message to bytes and calculate the digest.message_bytes = message.encode('utf-8')digest ={'sha256': hashlib.sha256(message_bytes).digest()}# Build the verify request and call the API.verify_response = client.asymmetric_verify(name=key_version_name, digest=digest, signature=signature)return verify_response.success# Example usage for verificationverified =verify_asymmetric_signature(project_id, location_id, key_ring_id, key_id, key_version, message, signature)print('Verified:', verified)