Кибершпионы на LinkedIn: как фиктивная вакансия CTO в японском стартапе превращается в сложную атаку на разработчиков

information security

В сфере информационной безопасности социальная инженерия давно стала изощрённым инструментом, а её мишени - профессионалами с доступом к критически важным активам. Новый пример подобной атаки демонстрирует, как злоумышленники, используя тщательно продуманную легенду о рекрутинге, охотятся на разработчиков и системных архитекторов. В центре схемы - фиктивная японская e-commerce компания Commerce Media Inc., предлагающая заманчивую должность технического директора. Однако за этим предложением скрывается многоступенчатая вредоносная кампания, автоматически компрометирующая жертву при попытке выполнить техническое задание из GitHub-репозитория. Эта атака примечательна не только сложностью исполнения, но и хитрой системой предварительного сбора учетных данных, которая работает даже если жертва прерывает выполнение кода.

Описание

Кампания начинается с контакта в LinkedIn от имени рекрутера Yorka Morales M. Злоумышленник, ссылаясь на опыт цели в блокчейн-технологиях, предлагает удалённую позицию CTO или старшего советника в японской компании Commerce Media Inc. Для придания легитимности в сообщении содержится ссылка на подробный проект-бриф в Google Docs, описывающий компанию, её платформу Japanese-Royal, планы по интеграции криптовалютных платежей и открытые вакансии с годовым доходом до 280 тысяч долларов. Документ служит исключительно элементом социальной инженерии, создавая видимость реального проекта. Настоящая ловушка ждёт на следующем этапе - во время «технического собеседования» жертве предлагают изучить и запустить код из репозитория "Japanese-Royal" на GitHub для оценки её навыков.

Как только разработчик клонирует и пытается взаимодействовать с репозиторием, срабатывает одна из четырёх независимых механизмов запуска, что делает атаку исключительно устойчивой. Вредоносная нагрузка активируется при открытии папки проекта в VS Code (из-за автоматически выполняемых задач в файле ".vscode/tasks.json"), при запуске команды "npm start", при установке зависимостей через "npm install" (благодаря хуку "prepare" в "package.json") или при прямом выполнении серверного файла. Любое из этих действий приводит к импорту модуля "api/auth.js", который на уровне загрузки инициирует так называемую первую стадию атаки (Stage 1).

Первая стадия, реализованная в "controllers/auth.js", представляет собой хитроумный механизм фильтрации и сбора данных. Она расшифровывает из переменной окружения "AUTH_API" (хранящейся в Base64 в файле "frontend/.env") адрес управляемого злоумышленником эндпоинта на платформе Vercel. Затем модуль отправляет на этот адрес POST-запрос, содержащий полный снимок окружения Node.js процесса жертвы ("process.env"). Это включает в себя как подставные учетные данные, заранее размещённые злоумышленником в файлах ".env" и ".env.local", так и любые реальные секреты разработчика - ключи AWS, API-токены, строки подключения к базам данных. Ключевая особенность в том, что эндпоинт применяет селективный гейтинг: он отдаёт вредоносную вторую стадию только в том случае, если в полученных данных присутствуют переменные из *обоих* подставленных файлов. Это означает, что жертва получит вредоносный код, даже если у неё в окружении не было реальных секретов - достаточно просто запустить репозиторий в среде, где библиотека "dotenv" автоматически загрузила файлы злоумышленника. При этом реальные учетные данные утекают как побочный эффект, принося прибыль атакующему даже если процесс был завершён до загрузки основной нагрузки.

Если условие гейтинга выполнено, эндпоинт возвращает JavaScript-код, который немедленно исполняется с помощью конструкции "new Function('require', response.data)(require)". Это и есть вторая стадия (Stage 2) - обфусцированный маяк (beacon). После деобфускации он выполняет фингерпринтинг системы, собирая имя хоста, MAC-адреса и информацию об операционной системе, и начинает опрашивать командный сервер (C2) по адресу "174.138.188[.]80:3000/api/errorMessage" каждые пять секунды. В запрос передаётся жёстко заданный идентификатор кампании "exceptionId=env070722". На момент анализа C2-сервер находился в режиме ожидания и отвечал нейтральным сообщением, однако его архитектура на основе Express.js позволяет в любой момент вернуть задание в поле "message", которое будет выполнено на машине жертвы как произвольный JavaScript-код, предоставляя злоумышленнику полный контроль.

Анализ инфраструктуры показывает высокую степень подготовки. Домен "commerce-media[.]org" был зарегистрирован за 11 дней до первого коммита в репозиторий, что говорит о планировании. Обнаружено пять репозиториев с одинаковым вредоносным кодом, разбросанных по трём аккаунтам GitHub ("0xroaman-1", "0xroaman-2", "0xroaman-4"), что обеспечивает оператору избыточность. Вторая тема ловушки, "Betfin", встречается во всех аккаунтах, а файлы ".env.local" в разных репозиториях идентичны побайтово, подтверждая использование общего шаблона. Техники, приёмы и процедуры (TTP) этой кампании, включая целевой рекрутинг через LinkedIn, использование VS Code Auto Tasks и структуру маяка, перекликаются с активностью, ранее приписываемой Lazarus Group под кодовым названием Contagious Interview. Однако уверенная атрибуция затруднена, так как эти методы могут быть заимствованы другими акторами, а некоторые операционные детали, такие как использование Gmail с плюс-адресацией, нехарактерны для высокодисциплинированных государственных групп исследование ThreatProphet.

Последствия для жертвы такой атаки крайне серьёзны. Поскольку утечка переменных окружения происходит синхронно при запуске кода, все присутствовавшие в момент выполнения учетные данные должны считаться скомпрометированными, даже если процесс был моментально остановлен. Это требует немедленной ротации ключей AWS, API-токенов, паролей к базам данных и других секретов. Для специалистов по безопасности инцидент служит жёстким напоминанием о критической важности изоляции окружения при анализе незнакомого кода. Технические задания от непроверенных источников следует запускать в виртуальных машинах или контейнерах без доступа к реальным секретам и с ограниченным сетевым выходом. В настройках VS Code рекомендуется отключать автоматический запуск задач ("task.allowAutomaticTasks"), а перед выполнением "npm install" необходимо внимательно изучать хуки в "package.json". Сетевые системы защиты должны блокировать исходящие соединения на указанный C2-адрес и отслеживать HTTP-запросы с характерными параметрами. В конечном счёте, эта кампания наглядно показывает, что в современной киберугрозе самой уязвимой точкой остаётся человеческое любопытство и профессиональный интерес, которыми так искусно манипулируют злоумышленники.

Индикаторы компрометации

IPv4

  • 174.138.188.80
  • 84.32.84.32

IPv4 Port Combinations

  • 174.138.188.80:3000

Domains

  • commerce-media.org
  • ip-checking-notification-pic.vercel.app
  • ip-check-notification-firebase.vercel.app

Emails

  • 0xsoftbuild@gmail.com
  • 0xsoftbuild+3@gmail.com
  • luis@commerce-media.org
  • victoriaknowles903@gmail.com
  • victoriaknowles903+2@gmail.com

SHA256

  • 140703ff8bf1a8aca82feefc35934283623781179dcc1c8e4516a213f02fe79f
  • 27ad64f93b1a3d0caca7fe7972788653daeb56f4e6e2f54d749c51ef98b92d80
  • 280f0138f8eff29392c93d52d639c049849143d8628914d6e82949fd714ee939
  • 28e73ce85db813ba0839ee077428eaa121037e3a1ec8a13b1171e68cc2a0accd
  • 37eb8e11b40527de0881189064c657fe1623d6b2c8ad16fc8136782e89367ead
  • 3c33f61d62e6b5632aa16326e672e85fa38ea04278c1db7b05f86c546cf18474
  • 48c6d172a43919df05ec9f506a1483e4c0fe820ea72092888d77b985aa7109c4
  • 603f46ba670a4be0bcf23429015ab00ccef04dc278bffc2d855eb8de52f9e711
  • 865dd0484235a1bbe46241812e2bbdbe36101f1f8b3741aaecbfa819ae190167
  • 9c7b96baaf461c9ca46db4472d5c65faec468b83db20ef1df25d6bde2bfa928d
  • a25f293776496f991565b0b5e6103e3948fa99acf6f1d45482c794fd52023855
  • c49175c4e9d08fc6a242649815c716d0f445fb4229dbf22395fde99f25119a21
  • c6bcb1d0ba766bc0da351fc137365b2762d9a5abda7a9d33a1363ed7056c7b7d
  • cc912c054e84000095b4e92fc8da36e4245eb6ad9d29dc1f102d05e566c90324
  • cc9e443872d99b07e4bf5f6baa6144fbe0fd24bc610e58340d9b8c755df17fce
  • faa267bd900faa3d19cd1d6fb31c78fb21b6b154210c79855fe36e5532826a3b
  • ff0bdd7180a0aec5fa8b64cc9d19e4da27ed2af1446e328dd9d93db06268442f
Комментарии: 0