Ataque de confusión de dependencia

Nov 24 2022
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.

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_.pyarchivo y reemplácelo package_namecon el nombre del paquete deseado:

Abra poc.pyel 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.pypara 0.0.1luego 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:

Haga clic en simple para ver los paquetes disponibles

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