Целевое вредоносное ПО для фейковых собеседований нацелено на сопровождающих open source проектов
#Кибербезопасность

Целевое вредоносное ПО для фейковых собеседований нацелено на сопровождающих open source проектов

Lukas Brandt
Lukas Brandt
5 min read

Поддельное собеседование в венчурный фонд заманило разработчика к TypeScript-репозиторию с ловушкой, что показывает: злоумышленники теперь рассматривают доступ к сопровождающему проект как приз.

Поддельная кампания собеседований нацелилась на канадского разработчика с репозиторием, зараженным вредоносным ПО, которое могло раскрыть доступ к open source-пакетам, учетные данные и данные хоста.

Анатомия неудавшейся атаки (государство?) | grack

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

В этом случае злоумышленник утверждал, что представляет сингапурскую венчурную фирму в сфере DeFi, и предлагал консультирование, связанное с двумя слабо документированными стартапами. Персона подкреплялась профилем LinkedIn, названиями компаний, веб-сайтами и видеозвонком. Подозрения вызвал лишь ретроспективно: отсутствие камеры, отговорка о поездке, отсутствие приглашения в календаре и шаблон часового пояса, который не соответствовал истории.

Ловушка сработала после звонка. Злоумышленник отправил TypeScript-проект, представленный как тест. Проект, приложение для продажи паромных билетов под названием Ticket Harbor, просил цель запустить проверки типов, тесты и команды сборки перед отправкой.

Эта инструкция имела значение. Злоумышленник спрятал код в patch-файле для TypeScript, а затем рассчитывал на обычные привычки разработчика, чтобы его выполнить. Проект использовал patch-package, инструмент, который применяет локальные патчи зависимостей после установки. Злоумышленники могут злоупотреблять таким рабочим процессом, потому что патчи затрагивают файлы внутри node_modules, где многие разработчики тратят меньше времени на проверку.

Вредоносный патч изменял typescript.js и _tsc.js. Он вставлял base64-блоб, декодировал его XOR с фиксированным ключом и запускал декодированный код через new Function() с доступом к require, Buffer, WebAssembly, process и __dirname. Любая команда, вызывающая TypeScript, могла запустить первую стадию.

Анатомия неудавшейся атаки (государство?) | grack

Затем загрузчик считывал скрытые данные, добавленные в файл изображения operators/3.png. Файл содержал пользовательский WebAssembly-фрагмент и полезную нагрузку второй стадии. Вредоносное ПО запускало отсоединенный процесс Node.js и заметало следы несколькими способами: использовало флаг skip-worktree Git, чтобы скрыть изменения патча из git status, переписывало патч после первого запуска и удаляло временный каталог после старта.

Сообщаемая полезная нагрузка, названная в разборе инцидента PinpinRAT из-за внутренних строк, действовала как троян удаленного доступа. Она генерировала локальную пару RSA-2048, создавала сессионный ключ AES-256 и шифровала командный трафик с помощью AES-256-CBC плюс тега целостности HMAC-SHA256.

После запуска вредоносное ПО связывалось с сервером управления и передавало профиль хоста. Данные включали IP-адреса, имя пользователя, имя хоста, операционную систему, архитектуру, идентификатор процесса, аргументы командной строки и версию Node.js.

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

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

Значение open source-аспекта усиливается тем, что цель упомянула пакеты на crates.io, реестре пакетов Rust. Скомпрометированный аккаунт мейнтейнера может превратить локальное проникновение в инцидент в цепочке поставок пакетов. Злоумышленники, получившие право публикации, могут выпустить вредоносную версию, атаковать downstream-пользователей или изучить процессы релиза для более поздней попытки.

Анатомия неудавшейся атаки (государство?) | grack

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

Разработчики часто считают npm install, npm test, npm run build и tsc безобидными шагами настройки. Современные JavaScript-проекты делают это доверие хрупким. Скрипты жизненного цикла пакетов, пропатченные зависимости, тестовые раннеры, генераторы кода, нативные сборки и рабочие процессы Electron могут запускать код еще до того, как проверяющий прочитает приложение.

Команды безопасности уже предупреждали о вредоносном ПО в фальшивых собеседованиях, включая кампании, нацеленные на сотрудников криптоиндустрии, инженеров и мейнтейнеров open source. Злоумышленники предпочитают этот путь, потому что тест на работу дает им правдоподобную причину попросить цель запустить код из незнакомого источника. Формат собеседования также создает давление времени и социальное давление.

Контраргумент заслуживает внимания. Многие легитимные стартапы проводят найм и консультации довольно неформально. Ранние компании используют простые сайты. Основатели не всегда следят за календарной дисциплиной. Технические тесты часто просят кандидатов запускать локальные сборки. Ни один из этих сигналов сам по себе не доказывает злой умысел.

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

Разработчики могут снизить риск несколькими конкретными привычками. Открывайте незнакомые проекты в одноразовой VM или контейнере без секретов хоста. Проверяйте скрипты жизненного цикла package.json перед установкой. Ищите postinstall, preinstall, prepare, patch-package, new Function, eval, base64-блобы, загрузчики WebAssembly и пропатченные файлы компилятора. Рассматривайте изображения и другие ресурсы как возможные носители полезной нагрузки, когда код читает из них необработанные байты.

Поддерживающим реестров также следует отделять ежедневную разработку от прав на публикацию. Используйте аппаратно защищенную двухфакторную аутентификацию для аккаунтов GitHub, npm и crates.io. По возможности ограничивайте токены пакетов и делайте их краткоживущими. Публикуйте из чистой среды. Не храните боевые облачные токены и учетные данные пакетов на той же машине, где просматриваете репозитории, присланные незнакомцами.

В разборе инцидента перечислялись несколько индикаторов, которые команды могут проверить: трафик командного управления к 89.124.107.161:80, задача планировщика Windows с именем PinpinWrappedJs, процесс macOS, маскирующийся под com.apple.WebKit.Networking, переменные окружения NODT_PAYLOAD_PATH и NODT_PAYLOAD_ARGS, защитная строка WASMPACK и якорные строки 12ff4b51 и ticket-harbor-tsc-shim-anchor внутри файлов TypeScript.

Сообщаемые пути артефактов включают ~/Library/Caches/runtime-cache/.cache-<randomhex>/ на macOS, /tmp/.cache-<randomhex>/ на Linux и %TEMP%\.cache-<randomhex>\ на Windows. В этих каталогах могут находиться payload.js и mutex.js.

Любому, кто запускал похожий репозиторий, следует отключить машину от сети, сохранить доказательства, если их потребует команда реагирования на инцидент, сменить учетные данные с отдельного доверенного устройства и провести аудит активности в реестрах пакетов. Первой проверки заслуживают cookie браузера, SSH-ключи, учетные данные Git, облачные токены и токены пакетов.

Анатомия неудавшейся атаки (государство?) | grack

Более широкий тренд указывает на тяжелый год для доверия разработчиков. Злоумышленникам больше не нужно сначала взламывать реестр. Они могут ухаживать за мейнтейнерами, копировать ритуалы найма и позволить все остальное сделать инструменту сборки.

Комментарии

Загрузка комментариев...