Злоумышленники распространяют майнер через поддельный пакет sympy-dev в репозитории PyPI

information security

Исследователи компании Socket обнаружили в Python Package Index (PyPI) вредоносный пакет "sympy-dev", маскирующийся под популярную библиотеку символьной математики SymPy. Последняя имеет огромную аудиторию с примерно 85 миллионами загрузок в месяц. Злоумышленник скопировал описание и элементы брендинга оригинального проекта, чтобы повысить вероятность случайной установки своей подделки. По данным PyPI, пакет "sympy-dev", опубликованный 17 января 2026 года пользователем Nanit, имел четыре версии (с 1.2.3 по 1.2.6), и все они содержали вредоносный код. За первый день он был скачан более 1000 раз, что указывает на быстрое проникновение в реальные среды разработки и CI/CD-конвейеры.

Описание

Типоквотинг как угроза цепочке поставок

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

На скриншотах PyPI показана пара строк, где легитимный пакет sympy (слева) противопоставляется sympy-dev (справа) — вредоносной опечатке, которая повторно использует описание проекта SymPy и предлагает выполнить команду pip install sympy-dev, что увеличивает риск случайной установки.

Схема атаки: от алгебры до криптомайнинга

Вредоносный код активируется не сразу после импорта, а только при вызове конкретных функций для работы с полиномами, таких как "groebner()" или "roots_cubic()". Такой подход позволяет малвари оставаться незаметной, поскольку не все пути кода в библиотеке используются постоянно.

Механизм работы состоит из нескольких этапов. Сначала скомпрометированная функция инициирует скрытую процедуру загрузки. Затем загрузчик обращается к управляемым злоумышленником серверам по адресам 63[.]250[.]56[.]54 и 185[.]167[.]99[.]46, чтобы получить JSON-конфигурацию и основной исполняемый модуль. Для минимизации следов на диске вредонос использует специфичную для Linux технику выполнения из памяти. Он создает анонимный файловый дескриптор с помощью системного вызова "memfd_create", записывает в него скачанный ELF-файл и выполняет его через "/proc/self/fd/", что позволяет избежать создания постоянного файла.

В проанализированных образцах загружаемый модуль представлял собой криптомайнер XMRig. Конфигурация направляла его на майнинг через Stratum-эндпоинты по защищенному TLS-соединению. Важно отметить, что сам загрузчик является универсальным. Он способен загружать и выполнять произвольный код, что позволяет операторам в будущем легко сменить полезную нагрузку с майнера на шпионское ПО или программы-вымогатели.

Рекомендации по защите

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

Такие решения, как инструментарий Socket, помогают решать эти проблемы комплексно. Они могут автоматически обнаруживать подозрительные зависимости на этапе code review, блокировать известные вредоносные пакеты до их загрузки и предупреждать разработчиков о рискованных модулях при просмотре репозиториев. На момент публикации статьи пакет "sympy-dev" все еще оставался доступным в PyPI. Исследователи обратились в службу безопасности репозитория с запросом на его удаление и блокировку аккаунта публикатора.

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

IPv4

  • 185.167.99.46
  • 63.250.56.54

IPv4 Port Combinations

  • 185.167.99.46:3333
  • 63.250.56.54:3333

URLs

  • http://185.167.99.46
  • http://185.167.99.46/config
  • http://63.250.56.54
  • http://63.250.56.54/config

SHA256

  • 90f9f8842ad1b824384d768a75b548eae57b91b701d830280f6ed3c3ffe3535e
  • f454a070603cc9822c8c814a8da0f63572b7c9329c2d1339155519fb1885cd59

Malicious PyPI Package

  • sympy-dev

Threat Actor’s Alias on PyPI

  • Nanit
Комментарии: 0