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 सिस्टम का उपयोग करते हुए, ये enclaves मजबूत अलगाव और सुरक्षा सुनिश्चित करते हैं, जो गोपनीय जानकारी जैसे 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 में चलने वाली images docker images पर आधारित होती हैं, इसलिए आप docker images से अपनी Nitro Enclave images बना सकते हैं जैसे:

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

एक इमेज चलाएं

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

/etc/nitro_enclaves/allocator.yaml

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

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

# 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 होस्ट को समझौता करते हैं, तो चल रहे enclave images की सूची प्राप्त करना संभव है:

nitro-cli describe-enclaves

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

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

Enclaves समाप्त करें

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

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

Vsocks

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

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

इसलिए, एक 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"
}
}
]

ध्यान दें कि होस्ट से यह जानने का कोई तरीका नहीं है कि कोई 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}")

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

Vsock Client

उदाहरण:

Last updated