
TEE ड्राइवर (CVE-2021-44733) के शोषण के लिए कमजोर कर्नेल वाला वातावरण
हाल ही में Linux कर्नेल TEE सबसिस्टम में, संस्करण 5.15.11 तक, एक use-after-free भेद्यता खोजी गई थी, और इसे CVE-2021-44733 [1] निर्दिष्ट किया गया था।
पहली नज़र में यह कई कारणों से शोषण योग्य नहीं लग रहा था, हालाँकि भेद्य कोड पथ के आगे के विश्लेषण और एक मोटा proof-of-concept शोषण लागू करने के बाद कर्नेल में एक फ़ंक्शन पॉइंटर को अधिलेखित करना संभव था। इस पोस्ट में कोई विशेषाधिकार वृद्धि पेलोड प्रस्तुत नहीं किया गया है, हालाँकि OPTEE और शोषण को चलाने के लिए पूरा वातावरण आगे के परीक्षण के लिए उपलब्ध है, 'वातावरण सेट करना' देखें।
TEE (Trusted Execution Environment) कुछ सुरक्षित वातावरण में चलने वाला एक विश्वसनीय OS है, उदाहरण के लिए, ARM CPU पर TrustZone। एक TEE ड्राइवर TEE के साथ संचार के लिए आवश्यक विवरणों को संभालता है। ड्राइवर के कुछ महत्वपूर्ण कर्तव्य Globalplatform TEE Client API विनिर्देश [3] के आधार पर TEE की ओर एक सामान्य API प्रदान करना है, लेकिन Linux और TEE के बीच साझा मेमोरी का प्रबंधन करना भी है। इस सबसिस्टम को ARM आर्किटेक्चर के लिए कर्नेल कॉन्फ़िगरेशन में CONFIG_OPTEE कॉन्फ़िगर करके सक्षम किया जा सकता है।
सुरक्षित दुनिया में OP-TEE OS [4] नामक विश्वसनीय OS होता है। इस OS के ऊपर तथाकथित Trusted Applications (TAs) चलाना संभव है, जो पृथक वातावरण में कुछ संचालन कर सकते हैं, चित्र 1 देखें।
चित्र 1: TEE का अवलोकन - Linaro की प्रस्तुति से [5]
सामान्य दुनिया (Linux userspace/kernel) इन अनुप्रयोगों के साथ क्लाइंट अनुप्रयोगों (CAs) और TEE सबसिस्टम द्वारा प्रदान किए गए API का उपयोग करके बातचीत कर सकती है। एक CA किसी विशिष्ट TA की ओर एक सत्र खोल सकता है और उन फ़ंक्शनों को लागू कर सकता है जिन्हें TA लागू करता है। TA और CA के बीच किसी भी तर्क को आगे-पीछे पास करना साझा मेमोरी का उपयोग करके किया जाता है। सभी प्रासंगिक syscalls का उपयोग करके CA और TA के बीच की अंतःक्रिया आगे वर्णित है।
एक CA ड्राइवर के साथ संचार करने के लिए /dev/tee[0-9] खोलता है। ध्यान दें, कि इन APIs का उपयोग करने के पारंपरिक तरीके के लिए, यह libteec का उपयोग करके अंतर्निहित रूप से किया जाता है।
साझा मेमोरी को CA द्वारा IOCTL TEE_IOC_SHM_ALLOC का उपयोग करके पंजीकृत किया जा सकता है। यह साझा मेमोरी आवंटित करता है और एक फ़ाइल डिस्क्रिप्टर लौटाता है जिसे उपयोगकर्ता स्थान mmap के भाग के रूप में उपयोग कर सकता है।
अगला चरण IOCTL TEE_IOC_OPEN_SESSION का उपयोग करके एक सत्र स्थापित करना और किसी विशिष्ट TA के लिए uuid निर्दिष्ट करना है। यह uuid TA के संकलन के दौरान हार्डकोड किया जाता है।
TA में किसी विशिष्ट फ़ंक्शन को लागू करने के लिए, CA इनपुट तर्कों के साथ एक फ़ंक्शन का पहचानकर्ता निर्दिष्ट करके इसे लागू करता है, यह TEE_IOC_INVOKE का उपयोग करके किया जाता है।
जब CA सभी अनुरोधों के साथ समाप्त हो जाता है, तो सत्र को TEE_IOC_CLOSE_SESSION का उपयोग करके बंद किया जा सकता है।
चित्र 2: CA और TA के बीच सत्र - Linaro की प्रस्तुति से [5]
क्लाइंट्स और TEE के बीच अधिकांश संचार ड्राइवर के लिए अपारदर्शी है। ड्राइवर का मुख्य कार्य संदर्भ प्रबंधित करना, क्लाइंट्स से अनुरोध प्राप्त करना, उन्हें TEE तक अग्रेषित करना और परिणाम वापस भेजना है [2]।