Как и любой менеджер пакетов для Python, Pipenv извлекает и устанавливает сторонние пакеты из репозитория пакетов, такого как PyPI. Но к сожалению, не всегда программисты осознают, что репозитории пакетов также могут стать мишенью для атак. В статье расскажу, как можно предотвратить атаки внедрения кода с использованием Pipenv.
Еще по теме: Выбор криптографической хеш-функции Python
Безопасное управление пакетами с помощью Pipenv Python
Конечно, вот перенесенный текст:
Подобно любому диспетчеру пакетов для Python, Pipenv извлекает и устанавливает сторонние пакеты из репозитория пакетов, такого как PyPI. К сожалению, программисты не осознают, что репозитории пакетов также входят в пространство для атаки на сервис.
Представьте, что Алиса решила регулярно развертывать новые версии alice.com в промышленном окружении. Она пишет сценарий для получения последней версии своего кода, а также последних версий зависимостей. Алиса решила не загромождать код управления своим репозиторием проверкой зависимостей в системе управления версиями. Вместо этого она извлекает требуемые артефакты из репозитория пакетов с помощью диспетчера.
Мэллори скомпрометировала репозиторий пакетов, от которого зависит Алиса, и модифицировала одну из зависимостей Алисы, добавив вредоносный код. В какой-то момент диспетчер пакетов на стороне Алисы извлекает вредоносный код и копирует его на сайт alice.com, где он выполняется. На скрине ниже показано, как развивается атака Мэллори.
В отличие от других менеджеров пакетов, Pipenv автоматически предотвращает подобные атаки, проверяя целостность каждого пакета при его извлечении из репозитория. Как легко догадаться, Pipenv осуществляет эту проверку путем сравнения хеш-значений.
При первом извлечении пакета Pipenv записывает хеш-значение каждого компонента этого пакета в файл Pipfile.lock. Рекомендуется открыть этот файл и потратить немного времени, чтобы ознакомиться с хеш-значениями некоторых ваших зависимостей. Например, в следующем фрагменте из моего файла Pipfile.lock видно, что Pipenv извлек версию 2.24 пакета requests.
1 2 3 4 5 6 7 |
"requests": { "hashes": [ "Sha256:b3559a131db72c33ee969480840fff4bb6dd1117c8...", "Sha256:fe75cc94a9443b9246fc7049224f756046acb93f87..." ], "version": "==2.24.0" } |
Когда Pipenv встречает уже известный пакет, он хеширует каждый компонент пакета и сравнивает полученные хеш-значения с теми, что находятся в файле Pipfile.lock. Если хеши совпадают, то Pipenv предполагает, что пакет остался неизменным и, следовательно, его можно устанавливать безопасно. Однако если хеш-значения не совпадают, как это показано на следующем скрине, Pipenv отклоняет пакет, поскольку это может свидетельствовать о его изменении.
Следующий вывод команды демонстрирует, как действует Pipenv, когда пакет не прошел проверку. Локальные хеш-значения и предупреждение выделены жирным:
Эта проверка не только защищает от вредоносных модификаций пакетов, но также способна обнаружить случайные повреждения пакетов. Такой подход обеспечивает детерминированность сред разработки, тестирования и производственной эксплуатации. Это прекрасный пример реальной проверки целостности данных с помощью хеширования.
В следующих статьях мы продолжим обсуждение атак внедрения кода.
ПОЛЕЗНЫЕ ССЫЛКИ:
- Безопасность и защита DHCP
- Проверка безопасности Docker-образов с помощью Trivy
- Проверка безопасности Docker и Kubernetes в облаке Amazon