Атака с путаницей зависимостей

Nov 24 2022
Обзор Атака с путаницей зависимостей — это тип атаки, при котором злоумышленник обманным путем заставляет менеджера пакетов установить вредоносный пакет из общедоступного репозитория вместо легального частного репозитория поставщика. Дхиянешваран написал отличный блог, в котором рассказывает о своих исследованиях и выводах. Я рекомендую прочитать его блог, если вы еще этого не сделали.

Обзор

Атака Dependency Confusion — это тип атаки, при котором злоумышленник обманом заставляет менеджера пакетов установить вредоносный пакет из общедоступного репозитория вместо легального частного репозитория поставщика.

Дхиянешваран написал отличный блог , в котором рассказывает о своих исследованиях и выводах. Я рекомендую прочитать его блог, если вы еще этого не сделали.

В этом блоге мы сосредоточимся на пакетах Python с точки зрения выявления неправильной конфигурации и ее использования.

Описание PIP

По умолчанию, когда вы загружаете пакет Python с помощью pip, он ищет в репозитории Pypi последнюю версию нужного пакета и устанавливает его, однако разработчик может развернуть свой собственный частный репозиторий Pypi для локального размещения своих пользовательских пакетов вместо публикации пакетов публично.

Чтобы загрузить пакет из локального репозитория, необходимо указать URL-адрес репозитория. Это можно сделать с помощью следующих двух опций:

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

Перехват пакета

В следующем примере сценария мы продемонстрируем атаку.

Предпосылки

  • Создайте учетную запись в Pypi
  • Создайте частный репозиторий Pypi

Клонируйте следующий репозиторий:

git clone https://github.com/zAbuQasem/dependecy-confusion-templates
cd dependecy-confusion-templates/python-pip

      
                

mv package_name safepackage

Затем отредактируйте __init_.pyфайл и замените package_nameего на желаемое имя пакета:

Откройте poc.pyфайл и добавьте URL-адрес вашего сервера/веб-хука, чтобы получать триггеры пакета.

Наконец, создайте пакет и загрузите его в репозиторий 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

Теперь измените версию в setup.pyфайле 0.0.1, а затем перестройте пакет с помощью приведенных выше команд. После этого скопируйте файл пакета на локальный сервер Pypi, как показано на рисунке ниже:

Проверьте пакет, посетив локальный URL-адрес Pypi:

Нажмите на простой, чтобы просмотреть доступные пакеты

Выполнив следующую команду, мы увидим, что pip установил последнюю версию, хотя мы предоставили ей URL-адрес нашего частного репозитория:

pip3 install --extra-index-url http://example:8080/simple/ --trusted-host example.com safepackage

      
                

python3 -c "import safepackage"

      
                

Исправление

Теперь удалите установленный пакет и переустановите его --index-urlвместо--extra-index-url

Pip установил пакет из нашего частного репозитория, как и предполагалось.

Заключение

  • Разместите свой пакет как в общедоступных, так и в частных репозиториях.
  • Старайтесь избегать использования--extra-index-url