การโจมตีความสับสนพึ่งพา

Nov 24 2022
ภาพรวม การพึ่งพาอาศัยกัน การโจมตีแบบสับสนคือการโจมตีประเภทหนึ่ง โดยผู้โจมตีจะหลอกผู้จัดการแพ็คเกจให้ติดตั้งแพ็คเกจที่เป็นอันตรายจากพื้นที่เก็บข้อมูลสาธารณะ แทนที่จะเป็นแพ็คเกจส่วนตัวของผู้จำหน่าย Dhiyaneshwaran เขียนบล็อกที่ยอดเยี่ยมเพื่ออธิบายงานวิจัยและการค้นพบของเขา ฉันขอแนะนำให้อ่านบล็อกของเขาหากคุณยังไม่ได้อ่าน

ภาพรวม

การโจมตีแบบพึ่งพาอาศัยความสับสนคือการโจมตีประเภทหนึ่ง โดยผู้โจมตีหลอกให้ผู้จัดการแพ็คเกจติดตั้งแพ็คเกจที่เป็นอันตรายจากที่เก็บสาธารณะ แทนที่จะเป็นแพ็คเกจส่วนตัวของผู้จำหน่าย

Dhiyaneshwaranเขียนบล็อก ที่ยอดเยี่ยม เพื่ออธิบายงานวิจัยและการค้นพบของเขา ฉันขอแนะนำให้อ่านบล็อกของเขาหากคุณยังไม่ได้อ่าน

ในบล็อกนี้ เราจะมุ่งเน้นไปที่ Python Packages ในแง่ของการระบุการกำหนดค่าที่ผิดพลาดและการใช้ประโยชน์จากมัน

อธิบาย PIP

ตามค่าเริ่มต้น เมื่อคุณดาวน์โหลดแพ็คเกจ python โดยใช้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
  • สร้างที่เก็บ 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ไฟล์และเพิ่มเซิร์ฟเวอร์/webhook 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 ในพื้นที่:

คลิกที่ง่ายเพื่อดูแพ็คเกจที่มีอยู่

เมื่อเรียกใช้คำสั่งต่อไปนี้ เราจะเห็นว่า pip ติดตั้งเวอร์ชันล่าสุด แม้ว่าเราจะให้ URL ที่เก็บส่วนตัวของเราแก่มัน:

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

      
                

python3 -c "import safepackage"

      
                

การแก้ไข

ตอนนี้ลบแพ็คเกจที่ติดตั้งออกแล้วติดตั้งใหม่--index-urlแทน--extra-index-url

Pip ติดตั้งแพ็คเกจจากที่เก็บส่วนตัวของเราตามที่ตั้งใจไว้

บทสรุป

  • โฮสต์แพ็คเกจของคุณทั้งบนที่เก็บข้อมูลสาธารณะและที่เก็บข้อมูลส่วนตัว
  • พยายามหลีกเลี่ยงการใช้--extra-index-url