В репозитории PyPI выявлено около 5000 оставленных в коде секретов и 8 вредоносных обфускаторов

Исследователи GitGuardian опубликовали результаты анализа конфиденциальных данных, забытых разработчиками в коде, размещённом в репозитории Python-пакетов PyPI (Python Package Index). После изучения более 9.5 млн файлов и 5 млн релизов пакетов, связанных с 450 тысячами проектов, было выявлено 56866 фактов утечки конфиденциальных данных. Если учитывать только уникальные данные, без дублирования в разных релизах, число выявленных утечек составило 3938, а число проектов, в которых присутствует хотя бы одна утечка – 2922.

Всего выделено более 150 типов утечек конфиденциальной информации, среди которых обычные пароли, криптографические ключи, токены доступа к облачным сервисам, системам непрерывной интеграции и API.
768 учётных данных оказались действующими на момент проведения исследования. В качестве примера популярных утечек, сохраняющих актуальность упоминаются ключи доступа к Azure Active Directory, учётные данные к SSH, MongoDB, MySQL и PostgreSQL, ключи к GitHub OAuth App, Dropbox и Auth0, параметры входа в Coinbase и Twilio.

Из наиболее сильно набирающих популярность типов утечек упоминаются токены для доступа к ботам в Telegram, число которых удвоилось в начале 2021 года и затем ещё раз весной 2023 года.
Постоянный рост утечек ключей доступа к Google API фиксируется с 2020 года, а учётных данных к СУБД с 2022 года. Из пакетов, лидирующих по числу утечек упоминаются пакеты chatllm и
safire, в которых были забыты 209 ключей к OpenAI и 320 ключей к Google Cloud.

Среди файлов, в которых выявлено наибольшее число утечек, помимо файлов с расширением “.py”, отмечаются файлы с расширением .json (610), .md (270), PKG-INFO (240), METADATA (210), .txt (170), а также файлы README (209) и файлы из каталогов с именем test (675). Много утечек также связано с недосмотром и ошибками с настройкой исключения файлов при формировании пакетов. Например, файлы с локальными файлами конфигурации (.cookiecutterrc, .env, .pypirc и т.п.) могут исключаться из Git-репозитория через файл “.gitignore”, но не учитываются при создании пакета. В частности, в репозитории было найдено 43 файла .pypirc, содержащий учётные данные для доступа к PyPI . В 15 случаях утечек разработчики не планировали публично размещать пакеты для внутреннего использования и опубликовали их в PyPI по ошибке.

Дополнительно можно упомянуть ещё два события, связанных с PyPI:

  • В репозитории PyPI выявлены 8 вредоносных пакетов, преподносимых как утилиты для обфускации, т.е. приведения кода к нечитаемому виду, усложняющему для восстановления алгоритма работы. Выявленные пакеты содержали в названиях строку “pyobf” (Pyobftoexe, Pyobfusfile, Pyobfexecute, Pyobfpremium, Pyobflight, Pyobfadvance, Pyobfuse и pyobfgood) и были загружены более 2000 раз.

    Интегрированный в пакеты вредоносный код был специфичен для платформы Windows и позволял подключаться к внешнему управляющему серверу, запускать произвольные команды на компьютере разработчика, находить и отправлять на внешний сервере конфиденциальную информацию, такую как ключи доступа, а также передавать произвольные файлы с системы. Более того, вредоносный код мог выполнять функции кейлоггера, перехватывать вводимые в Chrome пароли, создавать скриншоты, записывать звук и даже управлять web-камерой.

  • Опубликованы результаты независимого аудита кодовой базы инструментария, применяемого для организации работы репозитория pypi.org, и фреймворка “cabotage”, задействованного в инфраструктуре для оркестровки контейнеров. Аудит проведён при поддержке некоммерческой организации OTF (Open Technology Fund). В ходе аудита не выявлено проблем с высоким уровнем опасности, а исходные тексты признаны отвечающими основным требованиям к безопасному написанию кода. При этом отмечен недостаточный охват тестами кодовой базы cabotage и выявление 29 проблем, из которых восьми присвоен умеренный уровень опасности, 6 – низкий, а 14 помечены как информирующие замечания.

    Наиболее заметные проблемы:

    • Недостаточная проверка цифровых подписей, используемых для интеграции PyPI с AWS SNS, позволяла отправлять уведомления на email отдельных пользователей.
    • Утечка информации в обработчике загрузок, позволяющая определить существование учётной записи без генерации событий о попытках входа.
    • Применение ненадёжных криптографических хэшей, не исключающих атак по отравлению кэша.
    • При наличии прав запуска процессов сборки через cabotage, атакующий потенциально мог добиться подстановки своих команд.
    • При наличии прав развёртывания (deployment) в cabotage, атакующий потенциально мог развернуть легитимно выглядящий образ.

Release. Ссылка here.