Duty-Free.cc

Проект на сотни тысяч долларов? Скорее всего, вас пытаются взломать. История одного фальшивого оффера

Какой сигнал в профиле рекрутера должен был насторожить с самого начала?

Разработчик Дэниел Тофан поделился историей о попытке компрометации его компьютера через на первый взгляд крайне привлекательное предложение работы в LinkedIn. В январе 2026 года с ним связались по поводу фриланс-проекта для якобы британского сервиса в сфере недвижимости. Заявленный бюджет выглядел впечатляюще — от 600 до 800 тысяч долларов. От кандидата требовалось всего лишь «быстро посмотреть код и дать оценку».

Аккаунт рекрутера не вызывал подозрений: более 500 контактов, значок верификации, указанные место работы и должность. Однако позже выяснилось, что был важный тревожный признак — при большом количестве связей профиль оказался полностью «пустым»: ни публикаций, ни комментариев, ни какой-либо активности.

Вместо стандартного тестового задания собеседник прислал ссылку на репозиторий GitLab с полноценным приложением на React и Node.js, а также документацию в Notion. Проект выглядел убедительно: аккуратная структура, визуализации на фронтенде, серверная часть на Express, интеграции с MongoDB, SendGrid и другими сервисами. Именно эта правдоподобность и была частью атаки.

На самом деле код использовался как инструмент целевого заражения через цепочку поставок. В проект встроили вредоносную логику, задействующую lifecycle-хуки npm, которая автоматически запускалась во время установки зависимостей.

Сценарий был простым, но эффективным. В npm-скриптах находился postinstall, который после установки зависимостей запускал сервер. Далее отрабатывал загрузчик, спрятанный в конце обычного контроллера: он считывал Base64-закодированные строки из переменных окружения, извлекал из них URL, скачивал удалённый payload с легитимного JSON-хостинга (jsonkeeper.com) и выполнял его через eval. Фактически это позволяло удалённо загружать и исполнять любой код на машине жертвы под видом логики веб-приложения.

По словам Тофана, загружаемый payload состоял из нескольких компонентов. Один из них устанавливал канал управления, подключаясь к серверу атакующих через socket.io и принимая команды для выполнения через child_process. Другой модуль сканировал диск в поисках конфиденциальных файлов — .env, ключей, документов, таблиц — и отправлял их на удалённый сервер. Третий следил за содержимым буфера обмена, включая данные, полученные через PowerShell, и также пересылал их злоумышленникам. Инфраструктура, судя по расследованию, размещалась у VPS-провайдера Cloudzy, а история про британскую компанию служила лишь прикрытием — доказательств причастности реального бизнеса найдено не было.

После обнаружения закладки разработчик немедленно удалил репозиторий, очистил локальные директории, где могла закрепиться персистентность, и на всякий случай произвёл полную ротацию ключей и токенов — от API-доступов до облачных и платёжных сервисов. Он также подал жалобы в GitLab и LinkedIn и сохранил все артефакты для отчётности. Через несколько дней GitLab подтвердил удаление репозитория, однако профиль рекрутера в LinkedIn на тот момент всё ещё оставался активным.

Ключевой вывод этой истории — обычное ревью кода не заменяет анализ безопасности, особенно когда речь идёт о целевых атаках. По словам Тофана, даже проверка с помощью ИИ сначала не выявила угрозу и сочла проект «нормальным». Лишь после прямого запроса на поиск вредоносной логики модель обратила внимание на Base64-строки, динамическое выполнение кода и загрузку внешних payload’ов.

В качестве базовых мер защиты он рекомендует всегда внимательно изучать npm-скрипты (особенно preinstallи postinstall), настороженно относиться к использованию eval и child_process, декодировать подозрительные строки и искать динамическую подгрузку кода. А если всё-таки нужно запускать чужой проект — делать это исключительно в изолированной среде: песочнице, одноразовой виртуальной машине или контейнере без доступа к файловой системе хоста.