इस अनुमति वाला एक हमलावर KMS संस्करण को नष्ट कर सकता है। ऐसा करने के लिए पहले आपको कुंजी को निष्क्रिय करना होगा और फिर इसे नष्ट करना होगा:
# 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
AWS में, KMS resource policy को संशोधित करके और केवल हमलावर के खाते को कुंजी का उपयोग करने की अनुमति देकर एक KMS कुंजी को पूरी तरह से चोरी करना संभव है। चूंकि ये resource policies GCP में मौजूद नहीं हैं, इसलिए यह संभव नहीं है।
हालांकि, एक वैश्विक KMS Ransomware करने का एक और तरीका है, जिसमें निम्नलिखित चरण शामिल होंगे:
हमलावर द्वारा आयातित key material के साथ एक नई कुंजी का संस्करण बनाएं
इस हमले को सफलतापूर्वक अंजाम देने के लिए, हमलावर को निम्नलिखित IAM भूमिकाओं में से एक की आवश्यकता होगी:
roles/cloudkms.cryptoKeyEncrypter
roles/cloudkms.cryptoKeyEncrypterDecrypter
roles/owner
roles/editor
Attack Scenario
हमलावर को cloudkms.cryptoKeyVersions.useToEncrypt या cloudkms.cryptoKeyVersions.useToEncryptViaDelegation अनुमति के साथ एक सेवा खाता या उपयोगकर्ता खाता प्राप्त होता है।
हमलावर एक plaintext संदेश को एन्क्रिप्ट करने के लिए KMS कुंजी का उपयोग करता है।
एन्क्रिप्टेड डेटा को बाद में उपयोग के लिए संग्रहीत किया जा सकता है या अन्य प्रणालियों को भेजा जा सकता है।
Impact
इस हमले का प्रभाव यह है कि हमलावर संवेदनशील डेटा को एन्क्रिप्ट कर सकता है, जिससे डेटा की गोपनीयता बनी रहती है, लेकिन यह सुनिश्चित नहीं होता कि डेटा का उपयोग केवल अधिकृत उपयोगकर्ताओं द्वारा ही किया जाएगा।
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
Description
यह अनुमति आपको एक विशेष कुंजी संस्करण का उपयोग करके डेटा पर हस्ताक्षर करने की अनुमति देती है। यह डिजिटल हस्ताक्षर बनाने के लिए उपयोगी है, जो डेटा की अखंडता और प्रामाणिकता की पुष्टि करने में मदद करता है।
Abusing the permission
इस अनुमति का दुरुपयोग करने के लिए, आप निम्नलिखित gcloud कमांड का उपयोग कर सकते हैं:
इस अनुमति का दुरुपयोग करके, एक हमलावर संवेदनशील डेटा पर हस्ताक्षर कर सकता है, जिससे यह वैध प्रतीत हो सकता है। यह डेटा की अखंडता और प्रामाणिकता को खतरे में डाल सकता है।
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
cloudkms.cryptoKeyVersions.useToVerify अनुमति देता है कि एक हमलावर को cryptographic key का उपयोग करके डेटा को verify करने की अनुमति मिलती है। यह post-exploitation चरण में महत्वपूर्ण हो सकता है, खासकर जब sensitive डेटा की integrity को सुनिश्चित करने की आवश्यकता होती है।
cloudkms.cryptoKeyVersions.useToSign
cloudkms.cryptoKeyVersions.useToSign अनुमति देता है कि एक हमलावर को cryptographic key का उपयोग करके डेटा को sign करने की अनुमति मिलती है। यह महत्वपूर्ण हो सकता है जब एक हमलावर को डेटा की authenticity को प्रमाणित करने की आवश्यकता होती है।
cloudkms.cryptoKeyVersions.viewPublicKey
cloudkms.cryptoKeyVersions.viewPublicKey अनुमति देता है कि एक हमलावर को public key को देखने की अनुमति मिलती है। यह जानकारी हमलावर को cryptographic operations को समझने और संभावित रूप से अन्य हमलों को अंजाम देने में मदद कर सकती है।
cloudkms.cryptoKeyVersions.view
cloudkms.cryptoKeyVersions.view अनुमति देता है कि एक हमलावर को cryptographic key version की जानकारी देखने की अनुमति मिलती है। यह जानकारी हमलावर को key management operations को समझने में मदद कर सकती है।
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)