Вредоносному пакету не обязательно быть сложным, чтобы добраться до самых ценных данных разработчика. Команда OpenSourceMalware описала WeaselBiscuit, новый JavaScript-инфостилер, который распространялся через как минимум 13 пакетов npm. Первые образцы появились в реестре в середине сентября и после запуска выгружали данные расширений Chrome на Windows, macOS и Linux.
Заражение начинается не на этапе установки зависимости, а после импорта пакета приложением. Встроенный loader.js запускает отдельный процесс Node.js, обращается к сервису Npoint, получает оттуда закодированный JavaScript и выполняет его прямо в памяти через new Function. Такой подход оставляет меньше файловых следов и отделяет загрузчик от основной полезной нагрузки.
После запуска WeaselBiscuit собирает имя компьютера и пользователя, сведения об ОС, процессоре и памяти, локальные сетевые адреса, публичный IP и геолокацию. Затем вредонос перебирает каталоги Local Extension Settings в профилях Chrome и отправляет на сервер управления все читаемые непустые файлы из этих папок, включая содержимое LevelDB, где расширения хранят локальное состояние.
Хранилища расширений могут содержать состояние криптокошельков, адреса аккаунтов, списки токенов, контакты и другую служебную информацию. Отдельные команды сервера позволяют WeaselBiscuit следить за изменениями буфера обмена, а на 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 и другие экосистемы. Авторы отчёта считают числа полезными для поиска следов, но не знают их точного назначения.
Расследование продолжает меняться по мере обнаружения новых образцов. В актуальном списке индикаторов OpenSourceMalware фигурируют 13 npm-пакетов, а в основной таблице отчёта упомянуты дополнительные связанные имена. На момент публикации отчёта версия engin1 1.3.99 и пакет laycot 1.3.10 были отмечены как доступные в npm, поэтому перечень нельзя считать окончательно закрытым.
Для проверки возможного заражения OpenSourceMalware советует искать обращения к выявленным адресам Npoint и серверу управления, подозрительные дочерние процессы Node.js, файлы .pid и следы клавиатурного монитора в Windows. Также нужно установить, какое приложение импортировало пакет, поскольку вредонос не использует lifecycle-hook npm и не запускается сразу после обычной установки зависимости.
