Atak dezorientacji zależności

Nov 24 2022
Przegląd Atak związany z pomieszaniem zależności 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 repozytorium dostawcy. Dhiyaneshwaran napisał świetnego bloga wyjaśniającego jego badania i odkrycia. Polecam przeczytać jego blog, jeśli jeszcze tego nie zrobiłeś.

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_.pyplik i zastąp package_nameżądaną nazwą pakietu:

Otwórz poc.pyplik 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.pyaby 0.0.1nastę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:

Kliknij proste, aby wyświetlić dostępne pakiety

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-urlzamiast--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