Кампания типосквоттинга в PyPI: злоумышленники обманули даже эксперта

information security

В экосистеме открытого программного обеспечения Python зафиксирована сложная многоэтапная кампания, использующая технику типосквоттинга (typosquatting) - метод, при котором создаются пакеты с названиями, похожими на популярные легитимные проекты. Исследователь безопасности, пожелавший остаться анонимным, обнаружил серию вредоносных пакетов в репозитории PyPI (Python Package Index), которые использовали изощренные методы сокрытия вредоносного кода.

Описание

История началась с анализа пакета asynhttp, название которого отличается от популярной библиотеки aiohttp всего одной пропущенной буквой. При внутреннем исследовании был обнаружен файл __pycache__/https.py, замаскированный под ZIP-архив. Этот файл содержал код, который незаметно модифицировал файлы другого пакета - aiohappyeyeballs, реализующего протокол Happy Eyeballs для улучшения производительности сетевых соединений.

пакет asynhttp

После удаления пакета asynhttp из PyPI злоумышленники продолжили атаку, загружая обновленные версии под разными названиями: aiohttp-ssl, aiohttp-openssl и httpserver-cache. В каждой новой версии менялись методы сокрытия и загрузки вредоносного кода. Например, в пакетах aiohttp-ssl и aiohttp-openssl архив был замаскирован под SSL-сертификат server.crt, а в httpserver-cache - под файл типизации _websocket.typed.

Ключевым элементом атаки стал пакет aiohappyeyeball (без буквы "s" в конце), который содержал зашифрованный бинарный файл staggerd.pyc. Исследователь изначально не заметил эту опечатку, что стало первым уровнем обмана. Декryption механизм оказался реализован в других пакетах и использовал инновационный подход: ключом шифрования было имя файла одного из модулей стандартной библиотеки Python, что позволяло избежать хранения ключа в открытом виде.

Функция mar в вредоносном коде вычисляла хеш имен всех доступных модулей, пока не находила совпадение с заранее вычисленным хешем. После нахождения правильного имени файла (которым оказался server.py) код использовал его для расшифровки данных. Расшифрованный payload представлял собой скомпилированный native-модуль Python с расширением .pyd для Windows или .so для Linux.

Интересно, что злоумышленники подготовили разные версии пакета aiohappyeyeball для различных операционных систем, используя стандартные механизмы менеджеров пакетов Python для доставки соответствующей версии payload. Однако при запуске в изолированной среде (sandbox) расшифрованный модуль не проявлял никакой видимой активности - он корректно загружался, но не экспортировал функции и не выполнял явных вредоносных действий.

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

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

Индикаторы компрометации

Packages

  • aiohappyeyeball
  • aiohttp-openssl
  • aiohttp-ssl
  • asynhttp
  • httpserver-cache
Комментарии: 0