Ataque de confusión de dependencia
Descripción general
El ataque de confusión de dependencia es un tipo de ataque en el que un atacante engaña a un administrador de paquetes para que instale un paquete malicioso desde un repositorio público, en lugar del legítimo privado del proveedor.
Dhiyaneshwaran escribió un gran blog explicando su investigación y hallazgos, recomiendo leer su blog si aún no lo ha hecho.
En este blog, nos centraremos en los paquetes de Python en términos de identificar la configuración incorrecta y explotarla.
PIP explicado
De manera predeterminada, cuando descarga un paquete de python usando pip
, busca en todo el repositorio de Pypi la última versión del paquete deseado y lo instala; sin embargo, un desarrollador puede implementar su propio repositorio privado de Pypi para alojar sus paquetes personalizados localmente en lugar de publicar los paquetes públicamente.
Para descargar un paquete desde un repositorio local, se debe especificar la URL del repositorio. Esto se puede hacer usando las siguientes dos opciones:
--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
Secuestro de paquetes
En el siguiente escenario de ejemplo vamos a demostrar el ataque.
requisitos previos
- Crea una cuenta en Pypi
- Crear un Repositorio Privado de Pypi
Clona el siguiente repositorio:
git clone https://github.com/zAbuQasem/dependecy-confusion-templates
cd dependecy-confusion-templates/python-pip
mv package_name safepackage

Luego edite el __init_.py
archivo y reemplácelo package_name
con el nombre del paquete deseado:

Abra poc.py
el archivo y agregue la URL de su servidor/webhook para recibir activadores de paquetes.

Finalmente construye el paquete y súbelo al repositorio de 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

Ahora cambie la versión en el setup.py
para 0.0.1
luego reconstruir el paquete usando los comandos anteriores. Después de eso, copie el archivo del paquete en el servidor Pypi local como se muestra en la imagen a continuación:

Verifique el paquete visitando la URL local de Pypi:

Al ejecutar el siguiente comando, podemos ver que pip instaló la última versión a pesar de que le proporcionamos la URL de nuestro repositorio privado:
pip3 install --extra-index-url http://example:8080/simple/ --trusted-host example.com safepackage
python3 -c "import safepackage"

Remediación
Ahora elimine el paquete instalado y vuelva a instalarlo con --index-url
en lugar de--extra-index-url

Pip instaló el paquete desde nuestro repositorio privado según lo previsto.
Conclusión
- Aloje su paquete en repositorios públicos y privados.
- Trate de evitar el uso
--extra-index-url