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 का समर्थन करें
- सदस्यता योजनाओं की जांच करें!
- हमारे 💬 Discord समूह या टेलीग्राम समूह में शामिल हों या हमें Twitter 🐦 @hacktricks_live** पर फॉलो करें।**
- हैकिंग ट्रिक्स साझा करें, PRs को HackTricks और HackTricks Cloud गिटहब रिपोजिटरी में सबमिट करके।
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
सभी निर्देशों का पालन करें दस्तावेज़ से। हालाँकि, ये सबसे महत्वपूर्ण हैं:
# 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 इमेजेज बना सकते हैं जैसे:
# 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
caution
हमेशा याद रखें कि आपको माता 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
Enclaves की गणना करें
यदि आप एक 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 के समान है, वर्चुअल वातावरण में उपयोगकर्ता-स्तरीय अनुप्रयोगों के लिए एक बहुपरकारी उपकरण प्रदान करता है।
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
#!/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}")
# Using socat
socat VSOCK-LISTEN:<port>,fork EXEC:"echo Hello from server!"
Vsock Client
उदाहरण:
सरल 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()
# Using socat
echo "Hello, vsock!" | socat - VSOCK-CONNECT:3:5000
Vsock Proxy
टूल vsock-proxy एक vsock प्रॉक्सी को दूसरे पते के साथ प्रॉक्सी करने की अनुमति देता है, उदाहरण के लिए:
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
तक पहुँचने की अनुमति देती है:
allowlist:
- { address: ip-ranges.amazonaws.com, port: 443 }
EC2 होस्ट द्वारा उपयोग किए जाने वाले vsock पते (<CID>:<Port>
) को देखना संभव है (ध्यान दें 3:8001
, 3 CID है और 8001 पोर्ट है):
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 मान हैं:
PCR | Hash of ... | Description |
---|---|---|
PCR0 | Enclave image file | छवि फ़ाइल की सामग्री का एक निरंतर माप, बिना अनुभाग डेटा के। |
PCR1 | Linux kernel और bootstrap | kernel और boot ramfs डेटा का एक निरंतर माप। |
PCR2 | Application | उपयोगकर्ता अनुप्रयोगों का एक निरंतर, क्रमबद्ध माप, बिना boot ramfs के। |
PCR3 | माता-पिता उदाहरण को सौंपा गया IAM भूमिका | माता-पिता उदाहरण को सौंपा गया IAM भूमिका का एक निरंतर माप। सुनिश्चित करता है कि attestation प्रक्रिया केवल तभी सफल होती है जब माता-पिता उदाहरण के पास सही IAM भूमिका हो। |
PCR4 | माता-पिता उदाहरण का Instance ID | माता-पिता उदाहरण के ID का एक निरंतर माप। सुनिश्चित करता है कि attestation प्रक्रिया केवल तभी सफल होती है जब माता-पिता उदाहरण के पास एक विशिष्ट instance ID हो। |
PCR8 | Enclave image file signing certificate | enclave 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
- https://medium.com/@F.DL/understanding-vsock-684016cf0eb0
- AWS से Nitro ट्यूटोरियल के सभी भाग: https://catalog.us-east-1.prod.workshops.aws/event/dashboard/en-US/workshop/1-my-first-enclave/1-1-nitro-enclaves-cli
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 का समर्थन करें
- सदस्यता योजनाओं की जांच करें!
- हमारे 💬 Discord समूह या टेलीग्राम समूह में शामिल हों या हमें Twitter 🐦 @hacktricks_live** पर फॉलो करें।**
- हैकिंग ट्रिक्स साझा करें, PRs को HackTricks और HackTricks Cloud गिटहब रिपोजिटरी में सबमिट करके।