निर्भरता भ्रम का दौरा

Nov 24 2022
ओवरव्यू डिपेंडेंसी कन्फ्यूजन अटैक एक प्रकार का हमला है, जहां एक हमलावर एक पैकेज मैनेजर को विक्रेता के निजी वैध के बजाय एक सार्वजनिक रिपॉजिटरी से एक दुर्भावनापूर्ण पैकेज स्थापित करने के लिए बरगलाता है। ध्यानेश्वरन ने अपने शोध और निष्कर्षों को समझाते हुए एक महान ब्लॉग लिखा, अगर आपने पहले से नहीं किया है तो मैं उनके ब्लॉग को पढ़ने की सलाह देता हूं।

अवलोकन

डिपेंडेंसी कन्फ्यूजन अटैक एक प्रकार का हमला है, जहां एक हमलावर विक्रेता के निजी वैध के बजाय एक सार्वजनिक रिपॉजिटरी से एक दुर्भावनापूर्ण पैकेज स्थापित करने के लिए एक पैकेज मैनेजर को बरगलाता है।

ध्यानेश्वरन ने अपने शोध और निष्कर्षों को समझाते हुए एक महान ब्लॉग लिखा , अगर आपने पहले से नहीं किया है तो मैं उनके ब्लॉग को पढ़ने की सलाह देता हूं।

इस ब्लॉग में हम गलत कॉन्फ़िगरेशन की पहचान करने और उसका फायदा उठाने के मामले में पायथन पैकेज पर ध्यान केंद्रित करेंगे।

पीआईपी समझाया

डिफ़ॉल्ट रूप से जब आप का उपयोग करके एक अजगर पैकेज डाउनलोड करते हैं pip, तो यह वांछित पैकेज की नवीनतम रिलीज़ के लिए Pypi रिपॉजिटरी में खोज करता है और इसे स्थापित करता है, हालांकि एक डेवलपर पैकेजों को सार्वजनिक रूप से प्रकाशित करने के बजाय स्थानीय रूप से अपने कस्टम पैकेजों को होस्ट करने के लिए अपने स्वयं के निजी Pypi रिपॉजिटरी को तैनात कर सकता है।

स्थानीय रिपॉजिटरी से पैकेज डाउनलोड करने के लिए, रिपॉजिटरी URL निर्दिष्ट किया जाना चाहिए, यह निम्नलिखित दो विकल्पों का उपयोग करके किया जा सकता है:

  • --extra-index-url
  • --index-url
  • pip3 install --extra-index-url <LOCAL_REPO_URL>/simple/ --trusted-host <LOCAL_REPO_URL> -r requirements.txt
    #OR
    pip3 install --index-url <LOCAL_REPO_URL>/simple/ --trusted-host <LOCAL_REPO_URL> -r requirements.txt
    

पैकेज अपहरण

निम्नलिखित उदाहरण परिदृश्य में हम हमले का प्रदर्शन करने जा रहे हैं।

आवश्यक शर्तें

  • Pypi पर अकाउंट बनाएं
  • एक निजी पीपीआई रिपॉजिटरी बनाएं

निम्नलिखित रिपॉजिटरी को क्लोन करें:

git clone https://github.com/zAbuQasem/dependecy-confusion-templates
cd dependecy-confusion-templates/python-pip

      
                

mv package_name safepackage

फिर __init_.pyफ़ाइल को संपादित करें, और package_nameवांछित पैकेज नाम से बदलें:

poc.pyपैकेज ट्रिगर प्राप्त करने के लिए फ़ाइल खोलें और अपना सर्वर/वेबहुक url जोड़ें।

अंत में पैकेज बनाएं और इसे Pypi रिपॉजिटरी में अपलोड करें:

# Prerequisities
sudo apt install twine -y
sudo apt-get install gcc libpq-dev -y
sudo apt-get install python-dev  python-pip -y
sudo apt-get install python3-dev python3-pip python3-venv python3-wheel -y
pip3 install wheel

# Builing and uploading
python3 setup.py sdist bdist_wheel
twine upload dist/* --verbose

अब संस्करण को ऊपर दिए गए आदेशों का उपयोग करके पैकेज setup.pyको 0.0.1फिर से बनाने के लिए बदलें, उसके बाद पैकेज फ़ाइल को स्थानीय Pypi सर्वर में कॉपी करें जैसा कि नीचे दी गई तस्वीर में दिखाया गया है:

स्थानीय Pypi URL पर जाकर पैकेज सत्यापित करें:

उपलब्ध पैकेजों को देखने के लिए सिंपल पर क्लिक करें

निम्नलिखित कमांड चलाकर, हम देख सकते हैं कि पाइप ने नवीनतम संस्करण स्थापित किया है, भले ही हमने इसे अपने निजी रिपॉजिटरी URL के साथ प्रदान किया हो:

pip3 install --extra-index-url http://example:8080/simple/ --trusted-host example.com safepackage

      
                

python3 -c "import safepackage"

      
                

उपचार

अब स्थापित पैकेज को हटा दें, और --index-urlइसके बजाय इसे पुनः इंस्टॉल करें--extra-index-url

पिप ने हमारे निजी रिपॉजिटरी से पैकेज को अपने इरादे के अनुसार स्थापित किया।

निष्कर्ष

  • अपने पैकेज को सार्वजनिक और निजी दोनों रिपॉजिटरी पर होस्ट करें।
  • प्रयोग से बचने का प्रयास करें--extra-index-url