Abhängigkeitsverwirrungsangriff

Nov 24 2022
Übersicht Dependency Confusion-Angriffe sind Angriffe, bei denen ein Angreifer einen Paketmanager dazu verleitet, ein bösartiges Paket aus einem öffentlichen Repository zu installieren, anstatt aus dem privaten, legitimen Paket des Anbieters. Dhiyaneshwaran hat einen großartigen Blog geschrieben, in dem er seine Forschungen und Erkenntnisse erklärt. Ich empfehle, seinen Blog zu lesen, falls Sie dies noch nicht getan haben.

Überblick

Der Abhängigkeitsverwirrungsangriff ist eine Art von Angriff, bei der ein Angreifer einen Paketmanager dazu bringt, ein bösartiges Paket aus einem öffentlichen Repository zu installieren, anstatt aus dem privaten, legitimen Paket des Anbieters.

Dhiyaneshwaran hat einen großartigen Blog geschrieben , in dem er seine Forschungen und Erkenntnisse erklärt. Ich empfehle, seinen Blog zu lesen, falls Sie dies noch nicht getan haben.

In diesem Blog konzentrieren wir uns auf Python-Pakete, um die Fehlkonfiguration zu identifizieren und auszunutzen.

Pip erklärt

Wenn Sie ein Python-Paket mit herunterladen pip, durchsucht es standardmäßig das gesamte Pypi-Repository nach der neuesten Version des gewünschten Pakets und installiert es. Ein Entwickler kann jedoch sein eigenes privates Pypi-Repository bereitstellen, um seine benutzerdefinierten Pakete lokal zu hosten, anstatt die Pakete öffentlich zu veröffentlichen.

Um ein Paket aus einem lokalen Repository herunterzuladen, sollte die Repository-URL angegeben werden. Dies kann mit den folgenden zwei Optionen erfolgen:

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

Paket-Hijacking

Im folgenden Beispielszenario demonstrieren wir den Angriff.

Voraussetzungen

  • Erstellen Sie ein Konto auf Pypi
  • Erstellen Sie ein privates Pypi-Repository

Klonen Sie das folgende Repository:

git clone https://github.com/zAbuQasem/dependecy-confusion-templates
cd dependecy-confusion-templates/python-pip

      
                

mv package_name safepackage

Bearbeiten Sie dann die __init_.pyDatei und ersetzen Sie sie package_namedurch den gewünschten Paketnamen:

Öffnen poc.pySie die Datei und fügen Sie Ihre Server-/Webhook-URL hinzu, um Paketauslöser zu erhalten.

Erstellen Sie schließlich das Paket und laden Sie es in das Pypi-Repository hoch:

# 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

Ändern Sie nun die Version in setup.py, 0.0.1um das Paket mit den obigen Befehlen neu zu erstellen. Kopieren Sie anschließend die Paketdatei auf den lokalen Pypi-Server, wie im folgenden Bild gezeigt:

Überprüfen Sie das Paket, indem Sie die lokale Pypi-URL aufrufen:

Klicken Sie auf einfach, um die verfügbaren Pakete anzuzeigen

Durch Ausführen des folgenden Befehls können wir sehen, dass pip die neueste Version installiert hat, obwohl wir sie mit unserer privaten Repository-URL angegeben haben:

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

      
                

python3 -c "import safepackage"

      
                

Abhilfe

Entfernen Sie nun das installierte Paket und installieren Sie es mit --index-urlanstelle von neu--extra-index-url

Pip hat das Paket wie vorgesehen aus unserem privaten Repository installiert.

Fazit

  • Hosten Sie Ihr Paket sowohl auf öffentlichen als auch auf privaten Repositories.
  • Versuchen Sie, die Verwendung zu vermeiden--extra-index-url