Атака с путаницей зависимостей
Обзор
Атака 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