В результате фишинга атакующим удалось перехватить учётные данные сопровождающих 18 популярных NPM-пакетов, в сумме загруженных более 2 миллиардов раз в неделю. Для скомпрометированных пакетов атакующие успели выпустить новые версии, содержащие вредоносный код. Это самая крупная атака на репозиторий NPM, которая затрагивает не только напрямую атакованные проекты, но сотни тысяч пакетов, зависимых от них.
Среди прочего, вредоносные обновления были выпущены для пакетов debug, chalk, ansi-styles, color-convert, wrap-ansi, supports-color и ansi-regex, имеющих более 200 млн загрузок за последнюю неделю. Отдельно выделяются пакеты chalk и debug, у которых имеется 129286 и 55289 зависимостей.
В ходе фишинга мэйнтейнерам от имени проекта NPM было отправлено email-уведомление о необходимости обновить параметры двухфакторной аутентификации. В письме было сказано, что пользователь не обновлял данные двухфакторной аутентификации более 12 месяцев и 10 сентября для предотвращения неавторизированного доступа все учётные данные с необновлёнными параметрами 2FA будут заблокированы.

Сообщения отправлялись с адреса “[email protected]” и вели на сайт npmjs.help, воспроизводящий сайт npmjs.com. Судя по всему, для введения пользователя в заблуждение использовались те же методы, что и для прошлых атак на PyPI, NPM и addons.mozilla.org, в которых для обхода защиты учётной записи при помощи двухфакторной аутентификации и создания ощущения работы с реальным каталогом NPM применялось прозрачное проксирование трафика с фишингового сайта на реальный сайт. Организовав работу npmjs.help как прокси для доступа к npmjs.com, атакующие контролировали весь трафик, включая активность на страницах ввода пароля входа и запроса второго фактора аутентификации.
В выпущенные атакующими обновления пакетов был подставлен вредоносный код, выполняемый на системах пользователей, работающих с сайтами или приложениями, использующими скомпрометированные версии пакетов. Вредоносная вставка для браузеров осуществляла перехват трафика и активности Web API, прикрепляя свои обработчики к функциям fetch и XMLHttpRequest, а также вмешивалась в работу типовых интерфейсов криптокошельков для скрытой подмены реквизитов получателя при переводе. Подмена осуществлялась на уровне модификации значений в запросах и ответах, незаметно для пользователя (в интерфейсе пользователя показывались корректные реквизиты). Поддерживались форматы транзакций Ethereum, Bitcoin, Solana, Tron, Litecoin и Bitcoin Cash.
В некоторых анонсах атаки на рассматриваемые NPM-пакеты также упоминается вредоносный код, выполняющий сбор и отправку ключей шифрования, паролей и токенов во время установки или запуска пакета. Детали по данной форме вредоносной вставки пока не приводятся.
Cкомпрометированные пакеты:
Пакет | Пиковое число загрузок в неделю | Число зависимостей | Версия с вредоносным кодом |
---|---|---|---|
ansi-styles | 524 млн | 3695 | 6.2.2 |
debug | 465 млн | 55289 | 4.4.2 |
supports-color | 450 млн | 4298 | 10.2.1 |
chalk | 436 млн | 129286 | 5.6.1 |
strip-ansi | 326 млн | 9668 | 7.1.1 |
color-convert | 313 млн | 3678 | 3.1.1 |
color-name | 312 млн | 3214 | 2.0.1 |
ansi-regex | 302 млн | 3238 | 6.2.1 |
wrap-ansi | 235 млн | 6275 | 9.0.1 |
is-arrayish | 90 млн | 1528 | 0.3.3 |
slice-ansi | 81.8 млн | 903 | 7.1.1 |
error-ex | 64.7 млн | 1544 | 1.3.3 |
supports-hyperlinks | 31.5 млн | 792 | 4.1.1 |
color-string | 31 млн | 411 | 2.1.1 |
simple-swizzle | 29.5 млн | 121 | 0.2.3 |
has-ansi | 19.7 млн | 422 | 6.0.1 |
chalk-template | 4.6 млн | 139 | 1.1.1 |
backslash | 298 тысяч | 65 | 0.2.1 |