На этой неделе под видом клиента мне прислали вредоносный репозиторий GitHub, и простой запуск стартового скрипта уничтожил двухдневную работу и раскрыл все пароли, которые я храню в браузере.

«Клиент» опубликовал вакансию высокооплачиваемого senior-инженера, быстро вышел на связь и прислал очень аккуратно выглядящий репозиторий. Запрос был простым: клонировать, запустить npm run dev и прислать скриншот, подтверждающий работоспособность демо-версии — без контракта и проверки биографии. Как только запустился dev-сервер, скрытый код в конфигурационном файле связался с командным сервером (C2), загрузил полезную нагрузку второго этапа и начал красть учетные данные с локальной машины.

Как развивалась атака

Вредоносная нагрузка находилась в postcss.config.js — файле, на который большинство разработчиков лишь мельком смотрят, так как он обычно содержит несколько простых правил обработки CSS. В данном случае злоумышленник добавил строку обфусцированного JavaScript далеко справа от легитимной инструкции, заполнив пустое пространство пробелами, чтобы она не бросалась в глаза. Когда команда npm run dev запустила конвейер PostCSS, скрытая строка выполнилась незаметно.

Вредоносное ПО выполнило три шага в быстрой последовательности:

  • Связь с C2 — программа установила сетевое соединение с сервером, контролируемым злоумышленником, и сообщила о скомпрометированном хосте.
  • Загрузка второго этапа — был скачан дополнительный код, содержащий основную логику кражи данных.
  • Кража учетных данных браузера — на macOS программа запросила ключ Chrome Safe Storage, хранящийся в системной связке ключей (keychain). Если пользователь одобрял запрос связки ключей, злоумышленник получал все пароли, сохраненные в Chrome.

Помимо непосредственной кражи данных, полезная нагрузка прописала себя в нескольких популярных инструментах разработчика — VS Code, npm, Discord — так, что любой последующий запуск этих приложений заново активировал вредоносный код. Простая перезагрузка не помогла избавиться от инфекции; следующий npm install или открытие редактора снова оживляли бэкдор.

Тревожные признаки, которые часто упускают из виду

  • Запросы на запуск кода до подписания контракта. В легитимных процессах найма обычно сначала заключается официальное соглашение, и только потом передается любая проприетарная работа.
  • Архивы, маскирующиеся под «описание проекта». Zip- или RAR-архивы могут скрывать исполняемые скрипты или вредоносные бинарные файлы.
  • Запросы личных адресов электронной почты, чтобы «обойти фильтры платформы». Этот трюк переводит общение за пределы защищенной платформы, где можно сообщить о нарушениях.
  • Описания вакансий, в которых кандидата просят пополнить криптокошелек или купить тестовые токены. Такие требования нетипичны для реальной работы в сфере разработки.

Практические шаги для обеспечения безопасности

  1. Никогда не запускайте чужой код без проверки. Открывайте репозиторий в режиме «только для чтения» (например, через просмотр raw-файлов на GitHub) и проверяйте каждый скрипт, особенно конфигурационные файлы и записи в scripts в package.json.
  2. Относитесь ко всем вложениям как к обычному тексту. Если вам прислали zip-файл, распакуйте его в изолированной среде (песочнице) и изучите содержимое, прежде чем что-либо открывать.
  3. Используйте выделенный менеджер паролей вместо встроенного хранилища браузера. Даже если связка ключей браузера будет скомпрометирована, хранилище менеджера останется изолированным.
  4. Запускайте непроверенный код в изолированной виртуальной машине или контейнере без доступа к сети. Это заблокирует злоумышленнику возможность связаться с C2-сервером.
  5. Включите двухфакторную аутентификацию (2FA) на всех аккаунтах. Если пароль будет украден, второй фактор предотвратит несанкционированный вход.
  6. Поддерживайте инструменты разработки в актуальном состоянии и включайте автоматическую проверку целостности, если это возможно. Некоторые редакторы теперь предупреждают, если основные файлы были неожиданно изменены.

Если вы подозреваете, что запустили вредоносный код, считайте, что система скомпрометирована. Сделайте резервную копию важных данных, очистите диск и переустановите операционную систему. Простая перезагрузка не уничтожит механизм закрепления в системе, который перезаписывает файлы в обычных приложениях.

Итог: одна скрытая строка JavaScript может превратить обычную демонстрацию в полномасштабную операцию по краже учетных данных. Относитесь к любому репозиторию как к ненадежному, пока не проверите его, и сделайте изоляцию стандартной частью своего рабочего процесса. Цена секундной спешки намного выше, чем усилия, затраченные на двойную проверку файла.