AWS - Nitro Enum

Support HackTricks

Basic Information

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

Nitro Enclaves

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

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

Nitro Enclave CLI installation

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

# 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 इमेजेज पर आधारित हैं, इसलिए आप अपनी Nitro Enclave इमेजेज docker इमेजेज से बना सकते हैं जैसे:

# 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 गुना मेमोरी असाइन करनी होगी। इसे फ़ाइल में डिफ़ॉल्ट संसाधनों को कॉन्फ़िगर करना संभव है।

/etc/nitro_enclaves/allocator.yaml

हमेशा याद रखें कि आपको माता EC2 उदाहरण के लिए कुछ संसाधनों को आरक्षित करने की आवश्यकता है!

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

# 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

एनक्लेव्स की गणना करें

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

nitro-cli describe-enclaves

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

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

Terminate Enclaves

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

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 के समान है, वर्चुअल वातावरण में उपयोगकर्ता-स्तरीय अनुप्रयोगों के लिए एक बहुपरकारी उपकरण प्रदान करता है।

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

CIDs खोजने के लिए जो enclave चलाने वाली छवियों के हैं, आप बस निम्नलिखित 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"
}
}
]

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

Vsock Server/Listener

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

सरल 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}")

</details>
```bash
# Using socat
socat VSOCK-LISTEN:<port>,fork EXEC:"echo Hello from server!"

Vsock Client

Examples:

Last updated