Как «злые двойники» похищали данные разработчиков через Open VSX?

В каталоге Open VSX обнаружили 77 вредоносных расширений, выдававших себя за настоящие инструменты разработчика. Они копировали названия, пространства имён и описания расширений из Microsoft Visual Studio Code Marketplace, за что получили определение «злые двойники». По данным исследователей Manifold Security Акса Шармы (Ax Sharma) и Коди Нэша (Cody Nash), пакеты публиковались с 26 июля по 1 августа 2026 года, а к 3 августа Open VSX их удалил. Подделки размещались через посторонние учётные записи и часто имели подозрительно низкую версию, например 0.0.1.
Как «злые двойники» похищали данные разработчиков через Open VSX?
Изображение носит иллюстративный характер

Из 77 пакетов 58 относились к облегчённому варианту шпионского кода. Они передавали имя компьютера, иногда название папки рабочего пространства и версию редактора. Остальные 19 составляли подробный профиль среды: имя локального узла и пользователя операционной системы, название и версию редактора, тип хоста редактора, идентификатор машины, платформу, архитектуру, локаль и часовой пояс. Туда же входили название открытой папки, полный путь к ней в файловой системе, сведения о репозитории и признаки работы внутри среды непрерывной интеграции, или CI. Обе разновидности использовали сходный код, одинаковую схему поведения и один адрес для вывода данных.
В группу расширенной разведки вошли amd.gaia-vscode, artsy.artsy-studio-extension-pack, configcat.configcat-feature-flags, iotaledger.iota-move, marketplace.visualstudio, obyte.oscript-vscode-plugin, openeuphoria.vscode-euphoria, oss.sfmc-devtools-vscode, rumbledb.jsoniq-vscode, ssagov.uef-snippets, taskfile.vscode-task, doi.fileheadercomment, mengsiCode.vscode-django-boilerplate, move.move-analyzer, uavcan.dsdl, vs-publisher-988541.apexsql-power-tools, casualjim.gotemplate, jcamp.dotnet-test-provider-view и superposition.supertoml-analyzer. Названия остальных 58 пакетов исследователи не привели.
Подмена находилась в собранном файле extension.js. Вместо заявленной функции он собирал сведения о компьютере и рабочем проекте, после чего отправлял их наружу под видом «анонимных показателей использования». Ни один из 77 пакетов не выполнял обещанную в карточке задачу. После установки расширение добавляло элемент в строку состояния Visual Studio Code, сообщало пользователю, что оно активно, и запускало утечку. Такая декорация создавала видимость нормальной работы, хотя полезной части в пакете не было.
Все образцы обращались к mangorbit[.]com. Домен зарегистрировали 15 июля 2026 года, за 11 дней до появления первых подделок в Open VSX 26 июля. Подробная версия дополнительно разбирала каталог Git: извлекала хосты удалённых репозиториев, названия организаций, доменную часть адреса электронной почты разработчика, текущую ветку и SHA-хеш коммита HEAD. Она могла перечислить до 60 идентификаторов установленных расширений и получить имя прокси-сервера из переменных среды.
Поиск в CI-средах охватывал имена обнаруженных маркеров и характерные значения переменных. Код считывал GITHUB_REPOSITORY, CI_PROJECT_PATH, URI коллекции Azure DevOps, идентификатор организации Buildkite, имя пользователя проекта CircleCI, название пространства GitHub Codespaces и URL контекста рабочего пространства Gitpod. Ещё один штрих выглядел особенно издевательски: расширение проверяло, запретил ли разработчик телеметрию в редакторе, а затем отправляло злоумышленникам сам результат этой проверки.
На случай блокировки или изъятия mangorbit[.]com разработчики вредоносного кода предусмотрели резервный маршрут. Расширение запрашивало DNS-запись типа TXT и могло получить из неё новый URL для передачи данных. Однократной попыткой дело тоже не ограничивалось. Повторные обращения происходили примерно через 15 минут, 50 минут и три с половиной часа после первого запроса, затем каждые семь-восемь часов. После перезапуска редактора последовательность начиналась снова и могла продолжаться до семи дней. Компьютер, временно оставшийся без сети, закрытый межсетевым экраном или находившийся за прокси, отбрасывающим первый запрос, ещё неделю подвергался новым попыткам. Шарма и Нэш сочли такое упорство признаком операции, рассчитанной не на разовый эксперимент.
Расширенный вариант также искал собственный идентификатор в devcontainer.json и .vscode/extensions.json открытого проекта. Результат передавался одним флагом. По нему оператор мог понять, установил ли разработчик пакет вручную или расширение попало на машину из рекомендаций и настроек репозитория. Как объяснили Акс Шарма и Коди Нэш, это поле позволяло выяснить, каким путём вредоносный пакет втягивался в рабочую среду и какие репозитории либо конфигурационные механизмы запускали его распространение.
Почти одновременно вскрылась отдельная атака на цепочку поставок npm под названием ChainDrop: она затронула 450 уникальных пакетов и 2244 артефакта. Её код похищал информацию и токены аутентификации npm, а затем применял украденные токены для публикации троянизированных версий уже скомпрометированных пакетов. В новые релизы снова встраивалось то же вредоносное содержимое, поэтому каждая захваченная учётная запись сопровождающего могла расширять заражённую область без ручной публикации со стороны исходного оператора.
Microsoft обнаружила в этих npm-релизах вариант Mini Shai-Hulud: самораспространяющийся червь, похититель учётных данных и сильно обфусцированную полезную нагрузку на JavaScript, рассчитанную на Bun. Обычно она автоматически стартовала через npm-хук жизненного цикла preinstall, то есть ещё до завершения установки пакета. Украденные данные GitHub применялись для внедрения конфигурационных файлов Claude и Visual Studio Code в репозитории. За счёт этого вредоносный код закреплялся и получал новый канал перехода между разработчиками: заражение грозило тому, кто клонировал изменённый репозиторий.
Приёмы ChainDrop напоминали ранее наблюдавшуюся активность npm-червя Shai-Hulud, но на момент отчёта кампания оставалась неатрибутированной: достоверно связать её с конкретной группой не удалось. Компания Socket нашла и методы, которых не было в прежних описаниях Shai-Hulud. Образец загружал отдельную среду выполнения Bun, запускал через неё упакованную полезную нагрузку второго этапа и использовал модульный диспетчер. Каналы доставки разделялись на инфраструктуру GitHub и домены, а автозапуск прописывался в каталогах .claude и .vscode. Мишенями становились разработчики, клонирующие исходный код, и ИИ-агенты программирования, работающие с заражёнными репозиториями.
OX Security указала, что запрета установочных скриптов и обязательной двухфакторной аутентификации, 2FA, для сопровождающих npm недостаточно. Исследователь Моше Симан Тов Бустан (Moshe Siman Tov Bustan) предложил вводить для пакетов детальные разрешения: доступ к чувствительным данным и их отправка должны требовать явного согласия. Сейчас npm-пакет способен добраться до ключей AWS или учётных данных GitHub и вывести их наружу без отдельной авторизации. Контроль таких действий нужен на уровне самой экосистемы пакетов, иначе украденный токен по-прежнему превращает одного заражённого разработчика в издателя следующей троянизированной версии.[/final]


Новое на сайте

Ссылка