AWS - Lambda Layers Persistence
AWS - Lambda Layers Persistence
Lambda Layers
Lambda layer एक .zip फ़ाइल आर्काइव है जिसमें अतिरिक्त कोड या अन्य सामग्री हो सकती है। एक layer में लाइब्रेरीज़, कस्टम रनटाइम, डेटा, या कॉन्फ़िगरेशन फ़ाइलें हो सकती हैं।
एक फ़ंक्शन में अधिकतम पांच layers शामिल की जा सकती हैं। जब आप एक फ़ंक्शन में layer शामिल करते हैं, तो सामग्री /opt
डायरेक्टरी में निष्कर्षित की जाती है निष्पादन वातावरण में।
डिफ़ॉल्ट रूप से, आपके द्वारा बनाई गई layers आपके AWS खाते के लिए निजी होती हैं। आप अन्य खातों के साथ एक layer साझा करने का चयन कर सकते हैं या layer को सार्वजनिक बना सकते हैं। यदि आपके फ़ंक्शन्स एक अलग खाते द्वारा प्रकाशित layer का उपयोग करते हैं, तो आपके फ़ंक्शन्स उस layer संस्करण का उपयोग जारी रख सकते हैं यदि वह हटा दिया गया है, या उस layer तक पहुँचने की आपकी अनुमति निरस्त कर दी गई है। हालांकि, आप हटाए गए layer संस्करण का उपयोग करके नया फ़ंक्शन नहीं बना सकते हैं या फ़ंक्शन्स को अपडेट नहीं कर सकते हैं।
कंटेनर इमेज के रूप में तैनात किए गए फ़ंक्शन्स layers का उपयोग नहीं करते हैं। इसके बजाय, आप अपने पसंदीदा रनटाइम, लाइब्रेरीज़, और अन्य निर्भरताओं को कंटेनर इमेज में पैकेज करते हैं जब आप इमेज बनाते हैं।
Python लोड पथ
Lambda में Python द्वारा उपयोग किया जाने वाला लोड पथ निम्नलिखित है:
देखें कि दूसरे और तीसरे स्थान का उपयोग किस प्रकार से डायरेक्टरीज द्वारा किया जाता है जहां लैम्ब्डा लेयर्स अपनी फाइलों को अनकंप्रेस करते हैं: /opt/python/lib/python3.9/site-packages
और /opt/python
यदि कोई हमलावर एक प्रयुक्त लैम्ब्डा लेयर में बैकडोर जोड़ने में सफल हो जाता है या एक ऐसा लेयर जोड़ता है जो सामान्य लाइब्रेरी लोड होने पर मनमाना कोड निष्पादित करेगा, तो वह प्रत्येक लैम्ब्डा आह्वान के साथ दुर्भावनापूर्ण कोड निष्पादित करने में सक्षम होगा।
इसलिए, आवश्यकताएं हैं:
लाइब्रेरीज की जांच करें जो पीड़ित के कोड द्वारा लोड की जाती हैं
एक प्रॉक्सी लाइब्रेरी लैम्ब्डा लेयर्स के साथ बनाएं जो कस्टम कोड निष्पादित करेगी और मूल लाइब्रेरी को लोड करेगी।
पहले से लोड की गई लाइब्रेरीज
इस तकनीक का दुरुपयोग करते समय मुझे एक कठिनाई का सामना करना पड़ा: कुछ लाइब्रेरीज पहले से ही पायथन रनटाइम में लोड हो चुकी होती हैं जब आपका कोड निष्पादित होता है। मुझे os
या sys
जैसी चीजों की उम्मीद थी, लेकिन json
लाइब्रेरी भी लोड की गई थी।
इस स्थायित्व तकनीक का दुरुपयोग करने के लिए, कोड को एक नई लाइब्रेरी लोड करनी होगी जो कोड निष्पादित होने पर लोड नहीं होती है।
इस प्रकार के पायथन कोड के साथ यह संभव है कि लैम्ब्डा में पायथन रनटाइम के अंदर पहले से लोड की गई लाइब्रेरीज की सूची प्राप्त की जा सके:
और यह है सूची (यह जांच लें कि os
या json
जैसी लाइब्रेरीज पहले से मौजूद हैं)
Lambda Layer में बैकडोरिंग
इस उदाहरण में मान लेते हैं कि लक्षित कोड 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 क्रेडेंशियल्स को एक सर्वर पर भेजेगा, लेकिन अन्य तकनीकें जैसे कि निम्नलिखित भी एकीकृत की जा सकती हैं:
pageAWS - Steal Lambda Requestsबाहरी लेयर्स
ध्यान दें कि बाहरी खातों से लैम्ब्डा लेयर्स का उपयोग करना संभव है। इसके अलावा, एक लैम्ब्डा एक बाहरी खाते से एक लेयर का उपयोग कर सकता है भले ही उसके पास अनुमतियां न हों। यह भी ध्यान दें कि एक लैम्ब्डा के पास अधिकतम 5 लेयर्स हो सकते हैं।
इसलिए, इस तकनीक की बहुमुखी प्रतिभा को बढ़ाने के लिए एक हमलावर कर सकता है:
उपयोगकर्ता के मौजूदा लेयर में बैकडोर जोड़ें (कुछ भी बाहरी नहीं है)
अपने खाते में एक लेयर बनाएं, पीड़ित खाते को लेयर का उपयोग करने की अनुमति दें, लेयर को पीड़ित के लैम्ब्डा में कॉन्फ़िगर करें और अनुमति हटा दें।
लैम्ब्डा अभी भी लेयर का उपयोग करने में सक्षम होगा और पीड़ित के पास लेयर्स कोड को डाउनलोड करने का कोई आसान तरीका नहीं होगा (लैम्ब्डा के अंदर एक रिवर्स शेल प्राप्त करने के अलावा)
पीड़ित
aws lambda list-layers
का उपयोग करके बाहरी लेयर्स को नहीं देख पाएगा
```bash # Upload backdoor layer aws lambda publish-layer-version --layer-name "ExternalBackdoor" --zip-file file://backdoor.zip --compatible-architectures "x86_64" "arm64" --compatible-runtimes "python3.9" "python3.8" "python3.7" "python3.6"
Give everyone access to the lambda layer
Put the account number in --principal to give access only to an account
aws lambda add-layer-version-permission --layer-name ExternalBackdoor --statement-id xaccount --version-number 1 --principal '*' --action lambda:GetLayerVersion
Add layer to victims Lambda
Remove permissions
aws lambda remove-layer-version-permission --layer-name ExternalBackdoor --statement-id xaccount --version-number 1
Last updated