Расширение language-pack-sol устанавливало вложенный VSIX с Go-имплантом

Расширение language-pack-sol устанавливало вложенный VSIX с Go-имплантом

В каталоге расширений Visual Studio Code появился пакет language-pack-sol. Он устанавливает второе расширение из вложенного пакета расширения (VSIX). Внутри архива находится видеофайл. В нём лежат сборки импланта для четырёх платформ, установщик ConnectWise ScreenConnect и скрипт обхода контроля учётных записей (UAC). Пакет вышел под идентификатором luanblanco.language-pack-sol и выдаёт себя за расширение Solidity, которое используют разработчики.

Описание

В каталоге действительно было две сборки: 0.0.194 и 0.0.195. Обе устанавливают вложенный VSIX. По данным Yeeth Security, вложенный архив содержит видеофайл размером около 54 МБ. В нём находятся четыре сборки импланта evjawbreaker, установщик ScreenConnect и скрипт обхода UAC. Имплант написан на Go и собран для Linux и macOS на архитектурах amd64 и arm64, без упаковщика.

Идентичность пакета строится на визуальной подмене. Имя издателя отличается от имени настоящего автора расширения Solidity на один символ. На экране отображаемое имя читается как "Juan Blanco" благодаря символу управления направлением текста. Название расширения - слово solidity с 23 символами нулевой ширины. Иконку и файл описания взяли у настоящего расширения, включая значки версии и рейтинга.

Настоящее расширение Solidity - juanblanco.solidity - имеет 1 840 135 установок и многолетнюю историю версий. В каталоге его страница служит точкой доверия для разработчиков. Подделка с похожим отображаемым именем наследует это первое впечатление. По идентификатору language-pack-sol пакет читается как локализация, а не как компилятор, хотя отображаемое имя другое. Название расширения остаётся словом solidity с невидимыми символами, поэтому поиск по имени не выявляет подмену.

Первый этап ждёт от 60 до 150 секунд после запуска редактора. Затем он копирует вложенный архив во временный файл и вызывает штатную команду установки расширения из архива. Вложенное расширение использует идентификатор настоящего расширения juanblanco.solidity и имя "Solidity language runtime helpers". Если настоящее расширение уже установлено, вложенный пакет ничего не делает. На Linux и macOS скрипт развёртывания создаёт службу автозапуска, на Windows запускает установщик ScreenConnect.

Адрес командного сервера в пакете отсутствует, поэтому смена сервера не требует обновления пакета. Из смарт-контракта в сети Ethereum имплант читает этот адрес, поэтому оператор может сменить сервер одной транзакцией. С марта по сентябрь 2026 года история контракта показывает несколько смен адреса командного сервера. Последняя произошла 24 сентября, примерно за шесть часов до начала сентябрьской волны, и с тех пор адрес не менялся. Внешний пакет при этом обновлялся 22, 23, 24 и 25 октября.

Через 46 минут после первой появилась вторая сборка, которая изменила способ передачи управления. Первая полагалась на активацию вложенного расширения после установки, но поздняя установка не получала нужного события. Вторая сама находит его в каталогах Cursor и Visual Studio Code, активирует и запускает скрипт развёртывания из основного процесса. С 45-105 секунд до 3-10 секунд сократилась задержка во вложенном пакете. Полезная нагрузка не изменилась: видеофайл и все семь файлов архива совпадают с сентябрьской волной, как и содержимое загрузчика.

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

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

Комментарии: 0