의존성 혼란 공격
개요
종속성 혼동 공격은 공격자가 패키지 관리자를 속여 공급업체의 합법적인 개인 저장소가 아닌 공용 저장소에서 악의적인 패키지를 설치하도록 하는 공격 유형입니다.
Dhiyaneshwaran 은 자신의 연구와 결과를 설명하는 훌륭한 블로그 를 작성 했습니다. 아직 읽지 않았다면 그의 블로그를 읽어보는 것이 좋습니다.
이 블로그에서는 잘못된 구성을 식별하고 악용하는 관점에서 Python 패키지에 중점을 둘 것입니다.
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
![](https://post.nghiatu.com/assets/images/m/max/724/1*EMi4paAbDehhNt5Vg6LlOA.png)
__init_.py
그런 다음 파일을 편집하고 package_name
원하는 패키지 이름으로 바꿉니다.
![](https://post.nghiatu.com/assets/images/m/max/724/1*1Br5Fi5fxHBBGzHJsQ1l-g.png)
패키지 트리거를 수신하려면 파일을 열고 poc.py
서버/웹후크 URL을 추가하세요.
![](https://post.nghiatu.com/assets/images/m/max/724/1*E8baad4NAJiJngo48rBc0g.png)
마지막으로 패키지를 빌드하고 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
![](https://post.nghiatu.com/assets/images/m/max/724/1*lutFQt6o1rF9-jHM4aLvbw.png)
이제 에서 버전을 변경한 다음 위의 명령을 사용하여 패키지 setup.py
를 0.0.1
다시 빌드합니다. 그런 다음 아래 그림과 같이 패키지 파일을 로컬 Pypi 서버에 복사합니다.
![](https://post.nghiatu.com/assets/images/m/max/724/1*g-0REpYq0cjrWIHBm7LPyA.png)
로컬 Pypi URL을 방문하여 패키지를 확인합니다.
![](https://post.nghiatu.com/assets/images/m/max/724/1*1tQCeX7DjV9IT2brs2pHpQ.png)
다음 명령을 실행하면 개인 리포지토리 URL을 제공했지만 pip가 최신 버전을 설치했음을 알 수 있습니다.
pip3 install --extra-index-url http://example:8080/simple/ --trusted-host example.com safepackage
python3 -c "import safepackage"
![](https://post.nghiatu.com/assets/images/m/max/724/1*0TyjNBpRcCPr2IyqsKUokw.png)
개선
이제 설치된 패키지를 제거하고 --index-url
대신에 다시 설치하십시오.--extra-index-url
![](https://post.nghiatu.com/assets/images/m/max/724/1*E9FJLIzdZt4zfjJW1Ru-dA.png)
Pip은 의도한 대로 개인 저장소에서 패키지를 설치했습니다.
결론
- 공용 및 개인 리포지토리 모두에서 패키지를 호스팅합니다.
- 사용을 피하십시오
--extra-index-url