Atak dezorientacji zależności
Przegląd
Atak Dependency Confusion to rodzaj ataku, w którym osoba atakująca nakłania menedżera pakietów do zainstalowania złośliwego pakietu z publicznego repozytorium, zamiast z prywatnego legalnego pakietu dostawcy.
Dhiyaneshwaran napisał świetnego bloga wyjaśniającego jego badania i odkrycia. Polecam przeczytać jego blog, jeśli jeszcze tego nie zrobiłeś.
W tym blogu skupimy się na pakietach Pythona pod kątem identyfikowania błędnej konfiguracji i wykorzystywania jej.
Wyjaśnienie PIP
Domyślnie, gdy pobierasz pakiet Pythona za pomocą pip
, przeszukuje on repozytorium Pypi w celu znalezienia najnowszej wersji żądanego pakietu i instaluje go, jednak programista może wdrożyć własne prywatne repozytorium Pypi, aby hostować swoje niestandardowe pakiety lokalnie zamiast publikować pakiety publicznie.
W celu pobrania pakietu z lokalnego repozytorium należy podać adres URL repozytorium. Można to zrobić na dwa sposoby:
--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
Przejęcie pakietu
W poniższym przykładowym scenariuszu zademonstrujemy atak.
Wymagania wstępne
- Załóż konto na Pypi
- Utwórz prywatne repozytorium Pypi
Sklonuj następujące repozytorium:
git clone https://github.com/zAbuQasem/dependecy-confusion-templates
cd dependecy-confusion-templates/python-pip
mv package_name safepackage

Następnie edytuj __init_.py
plik i zastąp package_name
żądaną nazwą pakietu:

Otwórz poc.py
plik i dodaj adres URL serwera/webhooka, aby otrzymywać wyzwalacze pakietów.

Na koniec zbuduj pakiet i prześlij go do repozytorium 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

Teraz zmień wersję w, setup.py
aby 0.0.1
następnie odbudować pakiet za pomocą powyższych poleceń, a następnie skopiuj plik pakietu na lokalny serwer Pypi, jak pokazano na poniższym obrazku:

Zweryfikuj pakiet, odwiedzając lokalny adres URL Pypi:

Uruchamiając następujące polecenie, możemy zobaczyć, że pip zainstalował najnowszą wersję, mimo że podaliśmy ją z adresem URL naszego prywatnego repozytorium:
pip3 install --extra-index-url http://example:8080/simple/ --trusted-host example.com safepackage
python3 -c "import safepackage"

Remediacja
Teraz usuń zainstalowany pakiet i zainstaluj go ponownie za pomocą --index-url
zamiast--extra-index-url

Pip zainstalował pakiet z naszego prywatnego repozytorium zgodnie z przeznaczeniem.
Wniosek
- Hostuj swój pakiet zarówno w repozytoriach publicznych, jak i prywatnych.
- Staraj się unikać używania
--extra-index-url