Attacco di confusione delle dipendenze
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_.py
file e sostituiscilo package_name
con il nome del pacchetto desiderato:
Apri poc.py
il 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.py
quindi 0.0.1
ricostruisci 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:
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-url
invece 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