AWS - Lambda Layers Persistence
Lambda Layers
एक Lambda लेयर एक .zip फ़ाइल संग्रह है जो अतिरिक्त कोड या अन्य सामग्री शामिल कर सकता है। एक लेयर में पुस्तकालय, एक कस्टम रनटाइम, डेटा, या कॉन्फ़िगरेशन फ़ाइलें हो सकती हैं।
आप प्रत्येक फ़ंक्शन के लिए पांच लेयर तक शामिल कर सकते हैं। जब आप किसी फ़ंक्शन में एक लेयर शामिल करते हैं, तो सामग्री को /opt
निर्देशिका में निष्पादन वातावरण में निकाला जाता है।
डिफ़ॉल्ट रूप से, जो लेयर आप बनाते हैं वे आपके AWS खाते के लिए निजी होती हैं। आप एक लेयर को अन्य खातों के साथ साझा करने या लेयर को सार्वजनिक बनाने का विकल्प चुन सकते हैं। यदि आपके फ़ंक्शन किसी अन्य खाते द्वारा प्रकाशित की गई लेयर का उपयोग करते हैं, तो आपके फ़ंक्शन लेयर संस्करण का उपयोग जारी रख सकते हैं, भले ही इसे हटा दिया गया हो, या आपके लेयर तक पहुँचने की अनुमति को रद्द कर दिया गया हो। हालाँकि, आप एक नई फ़ंक्शन नहीं बना सकते या हटाई गई लेयर संस्करण का उपयोग करके फ़ंक्शंस को अपडेट नहीं कर सकते।
कंटेनर इमेज के रूप में तैनात फ़ंक्शन लेयर का उपयोग नहीं करते हैं। इसके बजाय, आप इमेज बनाने के समय अपने पसंदीदा रनटाइम, पुस्तकालयों और अन्य निर्भरताओं को कंटेनर इमेज में पैक करते हैं।
Python load path
Python द्वारा Lambda में उपयोग किया जाने वाला लोड पथ निम्नलिखित है:
Check how the second and third positions are occupy by directories where lambda layers uncompress their files: /opt/python/lib/python3.9/site-packages
and /opt/python
यदि एक हमलावर ने एक उपयोग किए गए lambda layer में backdoor डालने में सफलता प्राप्त की या एक ऐसा जोड़ने में जो एक सामान्य पुस्तकालय लोड होने पर मनमाना कोड निष्पादित करेगा, तो वह प्रत्येक lambda कॉल के साथ दुर्भावनापूर्ण कोड निष्पादित करने में सक्षम होगा।
इसलिए, आवश्यकताएँ हैं:
जांचें पुस्तकालय जो पीड़ितों के कोड द्वारा लोड किए गए हैं
एक प्रॉक्सी पुस्तकालय बनाएं जो lambda layers के साथ कस्टम कोड निष्पादित करेगा और मूल पुस्तकालय को लोड करेगा।
प्रीलोडेड पुस्तकालय
जब इस तकनीक का दुरुपयोग करते समय मैंने एक कठिनाई पाई: कुछ पुस्तकालय पहले से ही लोड होते हैं जब आपका कोड निष्पादित होता है। मैं os
या sys
जैसी चीजें खोजने की उम्मीद कर रहा था, लेकिन यहां तक कि json
पुस्तकालय भी लोड हो चुका था।
इस स्थायी तकनीक का दुरुपयोग करने के लिए, कोड को एक नया पुस्तकालय लोड करना होगा जो लोड नहीं होता जब कोड निष्पादित होता है।
इस तरह के python कोड के साथ यह संभव है कि पुस्तकालयों की सूची प्राप्त करें जो प्रीलोडेड हैं python runtime के अंदर lambda में:
और यह सूची है (जांचें कि os
या json
जैसी पुस्तकालय पहले से मौजूद हैं)
और यह लाइब्रेरीज़ की सूची है जो लैम्ब्डा डिफ़ॉल्ट रूप से शामिल करता है: https://gist.github.com/gene1wood/4a052f39490fae00e0c3
लैम्ब्डा लेयर बैकडोरिंग
इस उदाहरण में मान लीजिए कि लक्षित कोड csv
आयात कर रहा है। हम csv
लाइब्रेरी के आयात में बैकडोरिंग करने जा रहे हैं।
इसके लिए, हम csv
नाम का डायरेक्टरी बनाएंगे जिसमें __init__.py
फ़ाइल होगी, एक पथ में जो लैम्ब्डा द्वारा लोड किया जाता है: /opt/python/lib/python3.9/site-packages
फिर, जब लैम्ब्डा निष्पादित होता है और csv लोड करने की कोशिश करता है, तो हमारी __init__.py
फ़ाइल लोड और निष्पादित होगी।
इस फ़ाइल को यह करना चाहिए:
हमारे पेलोड को निष्पादित करें
मूल csv लाइब्रेरी को लोड करें
हम दोनों को कर सकते हैं:
फिर, इस कोड के साथ एक ज़िप बनाएं जो पथ python/lib/python3.9/site-packages/__init__.py
में हो और इसे एक लैम्ब्डा लेयर के रूप में जोड़ें।
आप इस कोड को https://github.com/carlospolop/LambdaLayerBackdoor पर पा सकते हैं।
एकीकृत पेलोड IAM क्रेडेंशियल्स को एक सर्वर पर भेजेगा जब इसे पहली बार बुलाया जाएगा या लैम्ब्डा कंटेनर के रीसेट के बाद (कोड में परिवर्तन या ठंडी लैम्ब्डा), लेकिन अन्य तकनीकें जैसे कि निम्नलिखित भी एकीकृत की जा सकती हैं:
AWS - Steal Lambda Requestsबाहरी लेयर्स
ध्यान दें कि बाहरी खातों से लैम्ब्डा लेयर्स का उपयोग करना संभव है। इसके अलावा, एक लैम्ब्डा एक बाहरी खाते से एक लेयर का उपयोग कर सकता है भले ही उसके पास अनुमतियाँ न हों। यह भी ध्यान दें कि एक लैम्ब्डा के पास अधिकतम 5 लेयर्स हो सकती हैं।
इसलिए, इस तकनीक की बहुपरकारीता को बढ़ाने के लिए एक हमलावर कर सकता है:
उपयोगकर्ता की एक मौजूदा लेयर में बैकडोर डालें (कुछ भी बाहरी नहीं है)
अपने खाते में एक लेयर बनाएं, पीड़ित खाते को लेयर का उपयोग करने के लिए अनुमति दें, पीड़ित के लैम्ब्डा में लेयर को कॉन्फ़िगर करें और अनुमति हटा दें।
लैम्ब्डा अभी भी लेयर का उपयोग करने में सक्षम होगा और पीड़ित के पास लेयर्स कोड डाउनलोड करने का कोई आसान तरीका नहीं होगा (लैम्ब्डा के अंदर एक रिव शेल प्राप्त करने के अलावा)
पीड़ित
aws lambda list-layers
के साथ उपयोग की गई बाहरी लेयर्स नहीं देखेगा।
Last updated