Забудьте про письма от принцев – теперь присылают вредоносный Next.js.

Открываешь тестовое задание от «работодателя», запускаешь проект на Next.js, а через несколько секунд твой компьютер уже общается с чужим сервером. Именно так разворачивается новая атака на разработчиков, о которой сообщили в Microsoft.
Команда Microsoft Defender Experts обнаружила скоординированную кампанию, в которой злоумышленники маскируют вредоносные репозитории под легитимные проекты на Next.js и материалы для технического собеседования. Расчёт простой: встроиться в обычный рабочий процесс разработчика и добиться запуска кода без лишних подозрений.
Расследование началось после того, как системы телеметрии зафиксировали подозрительные исходящие соединения. Процессы Node.js регулярно обращались к связанным между собой серверам управления. Анализ показал, что источником стали репозитории на Bitbucket, оформленные как тестовые задания для соискателей. Один из них маскировался под проект с названием Cryptan-Platform-MVP1.
Дальше исследователи нашли и другие похожие репозитории. Их объединяли повторяющиеся шаблоны имён, схожая структура файлов и одинаковая логика загрузчика. Даже если конкретный проект не фигурировал в журналах событий, по структуре он вёл себя так же, как уже выявленные образцы.
Во всех случаях атака сводится к одному сценарию. Во время обычной работы разработчика на его машине загружается и запускается вредоносный JavaScript, который затем устанавливает связь с сервером управления. Способ запуска может отличаться, но итог один и тот же.
Первый вариант срабатывает при открытии проекта в Visual Studio Code. В каталоге .vscode находится файл tasks.json с параметром автоматического запуска при открытии папки. Как только разработчик «доверяет» проекту, редактор запускает задачу. Она обращается к удалённому серверу на платформе Vercel и загружает оттуда загрузчик. В некоторых вариантах предусмотрен запасной механизм через скрытый и запутанный код, чтобы обойти ограничения.
Второй способ активируется, когда разработчик сам запускает проект, например через npm run dev. В этом случае вредоносный код встраивают в файлы, которые выглядят как обычные библиотеки, например jquery.min.js. При старте сервера такой файл расшифровывает скрытый адрес, скачивает загрузчик и выполняет его в памяти. Сразу после этого машина начинает регулярно связываться с сервером злоумышленников.
Третий путь задействует серверную часть приложения. В репозитории может лежать файл .env с закодированным адресом. При запуске серверного модуля код расшифровывает этот адрес, отправляет на удалённый сервер переменные окружения, включая ключи облачных сервисов и токены доступа, а затем выполняет полученный в ответ JavaScript. Всё происходит в памяти, без явных следов на диске.
Независимо от способа запуска сначала активируется первый этап. Он регистрирует заражённую машину, собирает базовую информацию и получает уникальный идентификатор. Затем подключается второй этап, который превращает систему в управляемый клиент. Он периодически запрашивает команды, выполняет полученные задачи, может просматривать каталоги, выбирать файлы и отправлять их на сервер частями. Для передачи используют многошаговую схему загрузки.
Целями данной кампании являются исходный код, файлы с настройками, ключи доступа к облачным сервисам и инфраструктуре сборки, которые хранятся на рабочих станциях разработчиков. Запустив «тестовое задание» на корпоративном компьютере, сотрудник может невольно открыть путь к более крупному инциденту.
Microsoft рекомендует жёстче относиться к чужим репозиториям, особенно полученным от неизвестных источников. В Visual Studio Code стоит использовать режим ограниченного доверия к рабочим каталогам. Также компания советует отслеживать необычную активность процессов Node.js и подозрительные исходящие соединения.