Ataque de confusão de dependência
Visão geral
O ataque de confusão de dependência é um tipo de ataque em que um invasor engana um gerenciador de pacotes para instalar um pacote malicioso de um repositório público, em vez do legítimo privado do fornecedor.
Dhiyaneshwaran escreveu um ótimo blog explicando suas pesquisas e descobertas, recomendo a leitura de seu blog, caso ainda não o tenha feito.
Neste blog, focaremos nos pacotes Python em termos de identificação da configuração incorreta e exploração dela.
PIP explicado
Por padrão, quando você baixa um pacote python usando pip
, ele pesquisa em todo o repositório Pypi a versão mais recente do pacote desejado e o instala; no entanto, um desenvolvedor pode implantar seu próprio repositório Pypi privado para hospedar seus pacotes personalizados localmente, em vez de publicar os pacotes publicamente.
Para baixar um pacote de um repositório local, a URL do repositório deve ser especificada. Isso pode ser feito usando as duas opções a seguir:
--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
Sequestro de pacote
No cenário de exemplo a seguir, vamos demonstrar o ataque.
Pré-requisitos
- Crie uma conta no Pypi
- Crie um repositório Pypi privado
Clone o seguinte repositório:
git clone https://github.com/zAbuQasem/dependecy-confusion-templates
cd dependecy-confusion-templates/python-pip
mv package_name safepackage

Em seguida, edite o __init_.py
arquivo e substitua package_name
pelo nome do pacote desejado:

Abra poc.py
o arquivo e adicione o URL do servidor/webhook para receber os acionadores do pacote.

Por fim, construa o pacote e faça o upload para o repositório 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

Agora altere a versão no setup.py
para 0.0.1
reconstruir o pacote usando os comandos acima, depois copie o arquivo do pacote para o servidor Pypi local, conforme mostrado na figura abaixo:

Verifique o pacote visitando o URL local do Pypi:

Ao executar o seguinte comando, podemos ver que o pip instalou a versão mais recente, mesmo que a tenhamos fornecido com nosso URL de repositório privado:
pip3 install --extra-index-url http://example:8080/simple/ --trusted-host example.com safepackage
python3 -c "import safepackage"

Remediação
Agora remova o pacote instalado e reinstale-o com --index-url
em vez de--extra-index-url

Pip instalou o pacote de nosso repositório privado como pretendido.
Conclusão
- Hospede seu pacote em repositórios públicos e privados.
- Tente evitar o uso
--extra-index-url