Вредоносный JavaScript-пакет не требует сложной архитектуры, чтобы добраться до самых ценных данных. Команда OpenSourceMalware обнаружила WeaselBiscuit — инфостилер, который распространялся минимум через 13 npm-пакетов. Первые образцы попали в реестр в сентябре и начинали выгружать содержимое расширений Chrome на Windows, macOS и Linux сразу после импорта в приложение.
Заражение стартует не при установке зависимости, а когда приложение импортирует пакет. Встроенный loader.js запускает отдельный процесс Node.js, запрашивает закодированный JavaScript у сервиса Npoint и выполняет его в памяти через конструктор Function. Это оставляет меньше следов на диске и отделяет загрузчик от полезной нагрузки.
WeaselBiscuit собирает имя компьютера и пользователя, параметры ОС, CPU и памяти, локальные сетевые адреса, публичный IP и геолокацию. Затем перебирает каталоги Local Extension Settings в профилях Chrome и отправляет на управляющий сервер все читаемые файлы из этих папок, включая содержимое LevelDB, где расширения хранят локальное состояние.
В хранилищах расширений находятся состояния криптокошельков, адреса аккаунтов, списки токенов, контакты и служебная информация. Отдельные команды сервера позволяют вредоносу отслеживать буфер обмена, а на Windows — перехватывать нажатия клавиш. Таким образом в данные попадают пароли, API-токены, адреса кошельков и фразы восстановления.
WeaselBiscuit проще, чем известные вредоносы BeaverTail и OtterCookie. В его коде отсутствуют функции вывода криптовалюты, расшифровки сохранённых паролей Chrome, поиска seed-фраз по шаблонам, снимков экрана, удалённой оболочки и загрузки InvisibleFerret. Закрепление ограничено отдельным процессом Node.js и локальным файлом с его идентификатором.
Сходство с BeaverTail и OtterCookie заставило исследователей предположить связь с кампанией Contagious Interview, которая маскирует заражение под проекты и тестовые задания для разработчиков. SecurityLab разбирал, как OtterCookie распространялась через поддельные задания и npm-пакеты. Но происхождение WeaselBiscuit пока не подтверждено.
OpenSourceMalware оценивает возможную связь с северокорейскими операторами с низкой или умеренной уверенностью. За эту гипотезу говорят схема с использованием Npoint, одинаковая последовательность определения публичного IP и геолокации, а также архитектура управления, похожая на OtterCookie. Но общих уникальных серверов, подписей, данных о жертвах или убедительного совпадения кода нет.
Ещё один след — числовые идентификаторы 10, 12, 44, 79, 95 и 99 в названиях пакетов и передаваемых данных. Похожую разметку использовала PolinRider, которая раньше атаковала разработчиков через npm, расширения Chrome и другие экосистемы. Авторы отчёта считают числа полезным ориентиром для поиска, но не знают их функцию.
На момент публикации отчёта engin1 версии 1.3.99 и laycot 1.3.10 всё ещё были доступны в npm. OpenSourceMalware ведёт актуальный список индикаторов заражения и дополнительные связанные имена пакетов, поэтому перечень может расширяться.
Для проверки заражения OpenSourceMalware рекомендует искать обращения к выявленным адресам Npoint и управляющему серверу, подозрительные дочерние процессы Node.js, файлы .pid и следы клавиатурного монитора на Windows. Нужно также установить, какое приложение импортировало пакет — вредонос не использует npm lifecycle-hooks и не запускается при обычной установке зависимости.
