Ataque de confusão de dependência

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

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_.pyarquivo e substitua package_namepelo nome do pacote desejado:

Abra poc.pyo 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.pypara 0.0.1reconstruir 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:

Clique em simples para visualizar os pacotes disponíveis

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