निर्भरता भ्रम का दौरा
अवलोकन
डिपेंडेंसी कन्फ्यूजन अटैक एक प्रकार का हमला है, जहां एक हमलावर विक्रेता के निजी वैध के बजाय एक सार्वजनिक रिपॉजिटरी से एक दुर्भावनापूर्ण पैकेज स्थापित करने के लिए एक पैकेज मैनेजर को बरगलाता है।
ध्यानेश्वरन ने अपने शोध और निष्कर्षों को समझाते हुए एक महान ब्लॉग लिखा , अगर आपने पहले से नहीं किया है तो मैं उनके ब्लॉग को पढ़ने की सलाह देता हूं।
इस ब्लॉग में हम गलत कॉन्फ़िगरेशन की पहचान करने और उसका फायदा उठाने के मामले में पायथन पैकेज पर ध्यान केंद्रित करेंगे।
पीआईपी समझाया
डिफ़ॉल्ट रूप से जब आप का उपयोग करके एक अजगर पैकेज डाउनलोड करते हैं 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