Attacco di confusione delle dipendenze

Nov 24 2022
Panoramica L'attacco di confusione delle dipendenze è un tipo di attacco in cui un utente malintenzionato induce con l'inganno un gestore di pacchetti a installare un pacchetto dannoso da un repository pubblico, anziché da quello legittimo privato del fornitore. Dhiyaneshwaran ha scritto un ottimo blog spiegando le sue ricerche e le sue scoperte, consiglio di leggere il suo blog se non l'hai già fatto.

Panoramica

L'attacco di confusione delle dipendenze è un tipo di attacco in cui un utente malintenzionato induce con l'inganno un gestore di pacchetti a installare un pacchetto dannoso da un repository pubblico, anziché da quello legittimo privato del fornitore.

Dhiyaneshwaran ha scritto un ottimo blog spiegando le sue ricerche e le sue scoperte, consiglio di leggere il suo blog se non l'hai già fatto.

In questo blog ci concentreremo sui pacchetti Python in termini di identificazione della configurazione errata e sfruttamento.

PIP spiegato

Per impostazione predefinita, quando scarichi un pacchetto Python utilizzando pip, cerca in tutto il repository Pypi l'ultima versione del pacchetto desiderato e lo installa, tuttavia uno sviluppatore può distribuire il proprio repository Pypi privato per ospitare i suoi pacchetti personalizzati localmente invece di pubblicare i pacchetti pubblicamente.

Per scaricare un pacchetto da un repository locale, è necessario specificare l'URL del repository. Questo può essere fatto utilizzando le seguenti due opzioni:

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

Dirottamento del pacchetto

Nel seguente scenario di esempio dimostreremo l'attacco.

Prerequisiti

  • Crea un account su Pypi
  • Crea un repository Pypi privato

Clona il seguente repository:

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

      
                

mv package_name safepackage

Quindi modifica il __init_.pyfile e sostituiscilo package_namecon il nome del pacchetto desiderato:

Apri poc.pyil file e aggiungi l'URL del tuo server/webhook per ricevere i trigger del pacchetto.

Infine compila il pacchetto e caricalo nel repository 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

Ora cambia la versione in setup.pyquindi 0.0.1ricostruisci il pacchetto usando i comandi sopra, dopodiché copia il file del pacchetto nel server Pypi locale come mostrato nell'immagine qui sotto:

Verifica il pacchetto visitando l'URL Pypi locale:

Clicca su semplice per visualizzare i pacchetti disponibili

Eseguendo il seguente comando, possiamo vedere che pip ha installato l'ultima versione anche se l'abbiamo fornita con l'URL del nostro repository privato:

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

      
                

python3 -c "import safepackage"

      
                

Bonifica

Ora rimuovi il pacchetto installato e reinstallalo con --index-urlinvece di--extra-index-url

Pip ha installato il pacchetto dal nostro repository privato come previsto.

Conclusione

  • Ospita il tuo pacchetto su entrambi i repository pubblici e privati.
  • Cerca di evitare di usare--extra-index-url