AWS - Nitro Enum

Reading time: 12 minutes

tip

AWS हैकिंग सीखें और अभ्यास करें:HackTricks Training AWS Red Team Expert (ARTE)
GCP हैकिंग सीखें और अभ्यास करें: HackTricks Training GCP Red Team Expert (GRTE) Azure हैकिंग सीखें और अभ्यास करें: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks का समर्थन करें

Basic Information

AWS Nitro एक नवोन्मेषी प्रौद्योगिकियों का एक सेट है जो AWS EC2 इंस्टेंस के लिए आधारभूत प्लेटफ़ॉर्म बनाता है। इसे Amazon द्वारा सुरक्षा, प्रदर्शन, और विश्वसनीयता को बढ़ाने के लिए पेश किया गया था, Nitro कस्टम हार्डवेयर घटकों और एक हल्के हाइपरवाइज़र का उपयोग करता है। यह पारंपरिक वर्चुअलाइजेशन कार्यक्षमता के अधिकांश को समर्पित हार्डवेयर और सॉफ़्टवेयर में एब्सट्रैक्ट करता है, हमले की सतह को कम करता है और संसाधन दक्षता में सुधार करता है। वर्चुअलाइजेशन कार्यों को ऑफलोड करके, Nitro EC2 इंस्टेंस को नजदीकी बARE-मेटल प्रदर्शन प्रदान करने की अनुमति देता है, जो संसाधन-गहन अनुप्रयोगों के लिए विशेष रूप से लाभकारी है। इसके अतिरिक्त, Nitro सुरक्षा चिप विशेष रूप से हार्डवेयर और फर्मवेयर की सुरक्षा सुनिश्चित करती है, जिससे इसकी मजबूत आर्किटेक्चर को और मजबूत किया जाता है।

Nitro Enclaves

AWS Nitro Enclaves एक सुरक्षित, अलग कंप्यूट वातावरण प्रदान करता है जो Amazon EC2 इंस्टेंस के भीतर है, जिसे अत्यधिक संवेदनशील डेटा को संसाधित करने के लिए विशेष रूप से डिज़ाइन किया गया है। AWS Nitro सिस्टम का लाभ उठाते हुए, ये एनक्लेव मजबूत अलगाव और सुरक्षा सुनिश्चित करते हैं, जो गोपनीय जानकारी जैसे PII या वित्तीय रिकॉर्ड को संभालने के लिए आदर्श हैं। इनमें एक न्यूनतम वातावरण होता है, जो डेटा के उजागर होने के जोखिम को काफी कम करता है। इसके अतिरिक्त, Nitro Enclaves क्रिप्टोग्राफिक अटेस्टेशन का समर्थन करते हैं, जिससे उपयोगकर्ता यह सत्यापित कर सकते हैं कि केवल अधिकृत कोड चल रहा है, जो सख्त अनुपालन और डेटा सुरक्षा मानकों को बनाए रखने के लिए महत्वपूर्ण है।

caution

Nitro Enclave छवियाँ EC2 इंस्टेंस के अंदर से चलती हैं और आप AWS वेब कंसोल से नहीं देख सकते कि क्या एक EC2 इंस्टेंस Nitro Enclave में छवियाँ चला रहा है या नहीं।

Nitro Enclave CLI installation

सभी निर्देशों का पालन करें दस्तावेज़ से। हालाँकि, ये सबसे महत्वपूर्ण हैं:

bash
# Install tools
sudo amazon-linux-extras install aws-nitro-enclaves-cli -y
sudo yum install aws-nitro-enclaves-cli-devel -y

# Config perms
sudo usermod -aG ne $USER
sudo usermod -aG docker $USER

# Check installation
nitro-cli --version

# Start and enable the Nitro Enclaves allocator service.
sudo systemctl start nitro-enclaves-allocator.service && sudo systemctl enable nitro-enclaves-allocator.service

Nitro Enclave Images

जो इमेजेज आप Nitro Enclave में चला सकते हैं, वे docker इमेजेज पर आधारित हैं, इसलिए आप docker इमेजेज से अपनी Nitro Enclave इमेजेज बना सकते हैं जैसे:

bash
# You need to have the docker image accesible in your running local registry
# Or indicate the full docker image URL to access the image
nitro-cli build-enclave --docker-uri <docker-img>:<tag> --output-file nitro-img.eif

जैसा कि आप देख सकते हैं, Nitro Enclave छवियाँ eif (Enclave Image File) एक्सटेंशन का उपयोग करती हैं।

आउटपुट इस तरह दिखेगा:

Using the locally available Docker image...
Enclave Image successfully created.
{
"Measurements": {
"HashAlgorithm": "Sha384 { ... }",
"PCR0": "e199261541a944a93129a52a8909d29435dd89e31299b59c371158fc9ab3017d9c450b0a580a487e330b4ac691943284",
"PCR1": "bcdf05fefccaa8e55bf2c8d6dee9e79bbff31e34bf28a99aa19e6b29c37ee80b214a414b7607236edf26fcb78654e63f",
"PCR2": "2e1fca1dbb84622ec141557dfa971b4f8ea2127031b264136a20278c43d1bba6c75fea286cd4de9f00450b6a8db0e6d3"
}
}

Run an Image

जैसा कि दस्तावेज़ में बताया गया है, एक एन्क्लेव इमेज चलाने के लिए आपको इसे eif फ़ाइल के आकार का कम से कम 4 गुना मेमोरी असाइन करनी होगी। इसे फ़ाइल में डिफ़ॉल्ट संसाधनों को कॉन्फ़िगर करना संभव है।

shell
/etc/nitro_enclaves/allocator.yaml

caution

हमेशा याद रखें कि आपको माता EC2 इंस्टेंस के लिए भी कुछ संसाधनों को आरक्षित करना होगा!

एक इमेज को देने के लिए संसाधनों को जानने के बाद और यहां तक कि कॉन्फ़िगरेशन फ़ाइल को संशोधित करने के बाद, एक एन्क्लेव इमेज को चलाना संभव है:

shell
# Restart the service so the new default values apply
sudo systemctl start nitro-enclaves-allocator.service && sudo systemctl enable nitro-enclaves-allocator.service

# Indicate the CPUs and memory to give
nitro-cli run-enclave --cpu-count 2 --memory 3072 --eif-path hello.eif --debug-mode --enclave-cid 16

Enclaves की गणना करें

यदि आप एक EC2 होस्ट को समझौता करते हैं, तो चल रहे एन्क्लेव छवियों की सूची प्राप्त करना संभव है:

bash
nitro-cli describe-enclaves

यह चल रहे एन्क्लेव इमेज के अंदर एक शेल प्राप्त करना संभव नहीं है क्योंकि यही एन्क्लेव का मुख्य उद्देश्य है, हालाँकि, यदि आपने पैरामीटर --debug-mode का उपयोग किया, तो आप इसे stdout प्राप्त कर सकते हैं:

shell
ENCLAVE_ID=$(nitro-cli describe-enclaves | jq -r ".[0].EnclaveID")
nitro-cli console --enclave-id ${ENCLAVE_ID}

Terminate Enclaves

यदि एक हमलावर एक EC2 उदाहरण को समझौता करता है, तो डिफ़ॉल्ट रूप से वह उनके अंदर एक शेल प्राप्त नहीं कर पाएगा, लेकिन वह उन्हें terminate करने में सक्षम होगा:

shell
nitro-cli terminate-enclave --enclave-id ${ENCLAVE_ID}

Vsocks

एक enclave चलाने वाली इमेज के साथ संवाद करने का एकमात्र तरीका vsocks का उपयोग करना है।

Virtual Socket (vsock) लिनक्स में एक सॉकेट परिवार है जिसे विशेष रूप से वर्चुअल मशीनों (VMs) और उनके hypervisors के बीच या VMs के बीच संवाद को सुविधाजनक बनाने के लिए डिज़ाइन किया गया है। Vsock कुशल, द्वि-निर्देशात्मक संचार को सक्षम बनाता है बिना होस्ट के नेटवर्किंग स्टैक पर निर्भर किए। यह VMs को नेटवर्क कॉन्फ़िगरेशन के बिना संवाद करने की अनुमति देता है, 32-बिट Context ID (CID) और पोर्ट नंबरों का उपयोग करके कनेक्शनों की पहचान और प्रबंधन करने के लिए। vsock API स्ट्रीम और डेटाग्राम सॉकेट प्रकारों का समर्थन करता है, जो TCP और UDP के समान है, वर्चुअल वातावरण में उपयोगकर्ता-स्तरीय अनुप्रयोगों के लिए एक बहुपरकारी उपकरण प्रदान करता है।

tip

इसलिए, एक vsock पता इस तरह दिखता है: <CID>:<Port>

enclave चलाने वाली इमेज के CIDs खोजने के लिए आप बस निम्नलिखित cmd निष्पादित कर सकते हैं और EnclaveCID प्राप्त कर सकते हैं:

nitro-cli describe-enclaves

[
{
"EnclaveName": "secure-channel-example",
"EnclaveID": "i-0bc274f83ade02a62-enc18ef3d09c886748",
"ProcessID": 10131,
    "EnclaveCID": 16,
    "NumberOfCPUs": 2,
"CPUIDs": [
1,
3
],
"MemoryMiB": 1024,
"State": "RUNNING",
"Flags": "DEBUG_MODE",
"Measurements": {
"HashAlgorithm": "Sha384 { ... }",
"PCR0": "e199261541a944a93129a52a8909d29435dd89e31299b59c371158fc9ab3017d9c450b0a580a487e330b4ac691943284",
"PCR1": "bcdf05fefccaa8e55bf2c8d6dee9e79bbff31e34bf28a99aa19e6b29c37ee80b214a414b7607236edf26fcb78654e63f",
"PCR2": "2e1fca1dbb84622ec141557dfa971b4f8ea2127031b264136a20278c43d1bba6c75fea286cd4de9f00450b6a8db0e6d3"
}
}
]

warning

ध्यान दें कि होस्ट से यह जानने का कोई तरीका नहीं है कि कोई CID कोई पोर्ट एक्सपोज़ कर रहा है! जब तक कि कुछ vsock पोर्ट स्कैनर जैसे https://github.com/carlospolop/Vsock-scanner का उपयोग न किया जाए।

Vsock Server/Listener

यहां कुछ उदाहरण दिए गए हैं:

Simple Python Listener
python
#!/usr/bin/env python3

# From
https://medium.com/@F.DL/understanding-vsock-684016cf0eb0

import socket

CID = socket.VMADDR_CID_HOST
PORT = 9999

s = socket.socket(socket.AF_VSOCK, socket.SOCK_STREAM)
s.bind((CID, PORT))
s.listen()
(conn, (remote_cid, remote_port)) = s.accept()

print(f"Connection opened by cid={remote_cid} port={remote_port}")

while True:
buf = conn.recv(64)
if not buf:
break

print(f"Received bytes: {buf}")
bash
# Using socat
socat VSOCK-LISTEN:<port>,fork EXEC:"echo Hello from server!"

Vsock Client

उदाहरण:

सरल Python क्लाइंट
python
#!/usr/bin/env python3

#From https://medium.com/@F.DL/understanding-vsock-684016cf0eb0

import socket

CID = socket.VMADDR_CID_HOST
PORT = 9999

s = socket.socket(socket.AF_VSOCK, socket.SOCK_STREAM)
s.connect((CID, PORT))
s.sendall(b"Hello, world!")
s.close()
bash
# Using socat
echo "Hello, vsock!" | socat - VSOCK-CONNECT:3:5000

Vsock Proxy

टूल vsock-proxy एक vsock प्रॉक्सी को दूसरे पते के साथ प्रॉक्सी करने की अनुमति देता है, उदाहरण के लिए:

bash
vsock-proxy 8001 ip-ranges.amazonaws.com 443 --config your-vsock-proxy.yaml

यह स्थानीय पोर्ट 8001 को vsock पर ip-ranges.amazonaws.com:443 पर अग्रेषित करेगा और फ़ाइल your-vsock-proxy.yaml में यह सामग्री हो सकती है जो ip-ranges.amazonaws.com:443 तक पहुँचने की अनुमति देती है:

yaml
allowlist:
- { address: ip-ranges.amazonaws.com, port: 443 }

EC2 होस्ट द्वारा उपयोग किए जाने वाले vsock पते (<CID>:<Port>) को देखना संभव है (ध्यान दें 3:8001, 3 CID है और 8001 पोर्ट है):

bash
sudo ss -l -p -n | grep v_str
v_str LISTEN 0      0                                                                              3:8001                   *:*     users:(("vsock-proxy",pid=9458,fd=3))

Nitro Enclave Atestation & KMS

Nitro Enclaves SDK एक enclave को cryptographically signed attestation document के लिए Nitro Hypervisor से अनुरोध करने की अनुमति देता है, जिसमें उस enclave के लिए विशिष्ट अद्वितीय माप शामिल होते हैं। ये माप, जिसमें hashes और platform configuration registers (PCRs) शामिल हैं, attestation प्रक्रिया के दौरान enclave की पहचान साबित करने और बाहरी सेवाओं के साथ विश्वास बनाने के लिए उपयोग किए जाते हैं। attestation document में आमतौर पर ऐसे मान होते हैं जैसे PCR0, PCR1, और PCR2, जिन्हें आपने पहले एक enclave EIF बनाने और सहेजने के दौरान देखा होगा।

docs से, ये PCR मान हैं:

PCRHash of ...Description
PCR0Enclave image fileछवि फ़ाइल की सामग्री का एक निरंतर माप, बिना अनुभाग डेटा के।
PCR1Linux kernel और bootstrapkernel और boot ramfs डेटा का एक निरंतर माप।
PCR2Applicationउपयोगकर्ता अनुप्रयोगों का एक निरंतर, क्रमबद्ध माप, बिना boot ramfs के।
PCR3माता-पिता उदाहरण को सौंपा गया IAM भूमिकामाता-पिता उदाहरण को सौंपा गया IAM भूमिका का एक निरंतर माप। सुनिश्चित करता है कि attestation प्रक्रिया केवल तभी सफल होती है जब माता-पिता उदाहरण के पास सही IAM भूमिका हो।
PCR4माता-पिता उदाहरण का Instance IDमाता-पिता उदाहरण के ID का एक निरंतर माप। सुनिश्चित करता है कि attestation प्रक्रिया केवल तभी सफल होती है जब माता-पिता उदाहरण के पास एक विशिष्ट instance ID हो।
PCR8Enclave image file signing certificateenclave image file के लिए निर्दिष्ट signing certificate का एक माप। सुनिश्चित करता है कि attestation प्रक्रिया केवल तभी सफल होती है जब enclave को एक विशिष्ट प्रमाणपत्र द्वारा हस्ताक्षरित enclave image file से बूट किया गया हो।

आप अपने अनुप्रयोगों में cryptographic attestation को एकीकृत कर सकते हैं और AWS KMS जैसी सेवाओं के साथ पूर्व-निर्मित एकीकरण का लाभ उठा सकते हैं। AWS KMS enclave attestations को मान्य कर सकता है और इसके कुंजी नीतियों में attestation-आधारित स्थिति कुंजी (kms:RecipientAttestation:ImageSha384 और kms:RecipientAttestation:PCR) प्रदान करता है। ये नीतियाँ सुनिश्चित करती हैं कि AWS KMS केवल तभी KMS कुंजी का उपयोग करने की अनुमति देता है जब enclave का attestation document मान्य हो और निर्धारित शर्तों को पूरा करता हो।

tip

ध्यान दें कि debug (--debug) मोड में Enclaves ऐसे attestation documents उत्पन्न करते हैं जिनमें PCRs शून्य (000000000000000000000000000000000000000000000000) होते हैं। इसलिए, इन मानों की जांच करने वाली KMS नीतियाँ विफल होंगी।

PCR Bypass

एक हमलावर के दृष्टिकोण से, ध्यान दें कि कुछ PCRs कुछ भागों या सभी enclave image को संशोधित करने की अनुमति देंगे और फिर भी मान्य रहेंगे (उदाहरण के लिए PCR4 केवल माता-पिता उदाहरण के ID की जांच करता है, इसलिए उस EC2 में कोई भी enclave image चलाना इस संभावित PCR आवश्यकता को पूरा करने की अनुमति देगा)।

इसलिए, एक हमलावर जो EC2 उदाहरण को समझौता करता है, इन सुरक्षा उपायों को बायपास करने के लिए अन्य enclave images को चलाने में सक्षम हो सकता है।

प्रत्येक सुरक्षा को बायपास करने के लिए नए चित्रों को संशोधित/बनाने पर शोध (विशेष रूप से जो स्पष्ट नहीं हैं) अभी भी TODO है।

References

tip

AWS हैकिंग सीखें और अभ्यास करें:HackTricks Training AWS Red Team Expert (ARTE)
GCP हैकिंग सीखें और अभ्यास करें: HackTricks Training GCP Red Team Expert (GRTE) Azure हैकिंग सीखें और अभ्यास करें: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks का समर्थन करें