Крупная фишинговая атака на PyPI: компрометация учетных записей и загрузка вредоносных пакетов

phishing

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

Описание

Основным вектором атаки стала имитация официального сайта PyPI.org через домен pypj.org, где буква "i" была заменена на "j". Этот прием, известный как типосквоттинг, позволил создать почти идентичную визуальную копию легитимного ресурса. Атакующие развернули сервер на виртуальной частной платформе (VPS), функционирующий как прозрачный прокси-сервер, который перехватывал и перенаправлял запросы к настоящему PyPI. Подобная инфраструктура напоминает работу Content Delivery Network (CDN), что усложняло обнаружение подделки. Фишинговые письма, отправленные на адреса, извлеченные из публичной метаданной пакетов, содержали ссылки с требованием подтвердить email. При переходе пользователи попадали на фальшивый сайт, где вводили свои учетные данные, немедленно перехватываемые злоумышленниками.

Особенностью инцидента стала технология "adversary in the middle" (AiTM), где атакующие действовали как форвард-прокси, а не перехватчики трафика. Это позволяло не только красть логины и пароли, но и потенциально перехватывать сессионные куки и одноразовые коды двухфакторной аутентификации (2FA), что теоретически могло нейтрализовать защиту TOTP. Однако системы WebAuthn, основанные на физических ключах безопасности, остались неуязвимыми благодаря механизму проверки идентификатора Relying Party. Анализ показал, что скомпрометированные аккаунты относились к пользователям без активированной 2FA или с устаревшими настройками безопасности.

Хронология событий началась 26 июля, когда первый пользователь сообщил в службу безопасности PyPI о подозрительном письме. Волонтер-администратор оперативно поднял тревогу в чате команды, после чего последовала серия взаимодействий с регистратором домена NameSilo и CDN-провайдером Cloudflare. Критической точкой стала публикация вредоносных версий num2words 0.5.15 и 0.5.16, содержащих скрытую вредоносную нагрузку. Владелец пакета, обнаружив несанкционированные обновления через публикацию исследователя в Twitter, незамедлительно удалил их и отозвал скомпрометированный API-токен. Важную роль в локализации инцидента сыграло принудительное внесение домена в статус ClientHold регистратором NameSilo 28 июля, что заблокировало разрешение DNS.

Расследование выявило системные проблемы в реагировании на инциденты. Cloudflare трижды отклонял отчеты о фишинге, несмотря на предоставленные доказательства, включая IP-адреса, заголовки запросов и детали атаки. Лишь после эскалации через рабочую группу по товарным знакам Python Software Foundation (PSF) и публикации предупреждения в соцсетях, платформа добавила пометку "Suspected Phishing" для опасного домена. Задержка в реакции CDN-провайдера продлила период активности фишингового ресурса почти на 48 часов, увеличив потенциальное количество жертв. В ответ PyPI внедрил новый механизм детектирования поддельных доменов непосредственно на платформе, развернутый в рабочем режиме уже через несколько часов после обнаружения угрозы.

Ущерб от атаки включал не только кражу учетных данных, но и операционные риски для инфраструктуры Python. Загруженные злоумышленниками версии num2words могли распространяться через автоматические системы обновлений, что потребовало выпуска официального консультативного бюллетеня PYSEC-2025-72 для инструментов сканирования уязвимостей. Анализ трафика прокси-сервера выявил минимум четыре успешные компрометации аккаунтов, при этом один из них использовался для генерации токенов с расширенными правами. Инцидент имеет параллели с недавней атакой на npm-пакеты, где аналогичная тактика применялась для внедрения малвари через легитимные репозитории.

В рамках пост-инцидентного анализа PyPI акцентирует внимание на фундаментальных ограничениях почтовых протоколов безопасности. Несмотря на корректную настройку SPF, DKIM и DMARC для домена pypi.org, фишинговые письма достигли целевых почтовых ящиков из-за различий в политиках фильтрации почтовых провайдеров получателей. Некоторые системы лишь помечали сообщения как подозрительные, оставляя конечное решение за пользователями. Для противодействия типосквоттингу PSF рассматривает стратегию выкупа доменов-имитаций, однако проект требует значительных финансовых ресурсов и не гарантирует полного охвата всех возможных вариантов написания.

Постоянный мониторинг показал, что ни внутренние системы PyPI, ни базы данных не подверглись несанкционированному доступу - нарушение стало исключительно результатом успешной социальной инженерии. Администрация платформы продолжает расследование для выявления возможных латентных последствий атаки, включая анализ сетевых логов и поведенческих паттернов злоумышленников. Инцидент подчеркивает необходимость комплексного подхода к кибербезопасности в открытых экосистемах, где человеческий фактор остается критическим звеном уязвимости даже при наличии технологических защитных механизмов. Текущая ситуация стабилизирована, однако работа по изучению тактик, техник и процедур (TTP) атакующих продолжается для предотвращения будущих инцидентов аналогичного типа.

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

IPv4

  • 45.9.148.108
  • 45.9.148.85

Domains

  • modirosa.com
  • necub.com
  • pypj.org

PyPI Package

num2words 0.5.15/0.5.16

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