Выявлена компрометация цепочки поставок плагинов в экосистеме BdThemes

Команда Wordfence Threat Intelligence Team получила 7 августа 2026 года уведомление о компрометации цепочки поставок BdThemes – поставщика плагинов для WordPress. В настоящее время все затронутые плагины временно отключены в каталоге WordPress.org до проведения полной проверки и дальнейшего расследования.

Технический обзор уязвимости

Плагины BdThemes поставляются с компонентом Biggopti – внутренней системой, которая получает промо-баннеры с API-сервера и отображает их в административной панели WordPress. API работает на базе статического бакета DigitalOcean Spaces, защищенного Cloudflare. Это не динамический сервер приложений: это плоские JSON-файлы, предоставляемые из объектного хранилища.

XSS-уязвимость в плагине связана с кодом анализа JSON-ответов; злоумышленники получили write-доступ к этому бакету, заменив легитимные JSON-ответов специально созданными пейлоадами для эксплуатации дыры. XSS срабатывает в браузере каждого авторизованного администратора, незаметно, при каждой загрузке wp-admin. Затем внедренный скрипт создает фейковые аккаунты администраторов, загружает плагин веб-оболочки и связывается с C2-сервером.

Чтобы стать жертвой атаки, не нужно даже обновлять никаких плагинов. Файлы на диске не меняются. Атака полностью осуществляется через API, невидима для сканеров целостности файлов и практически незаметна для файрволов.

XSS-уязвимость затрагивает только администраторов

Каждый плагин BdThemes, использующий систему Biggopti, подключает клиентский JS-ресурс при вызове admin_init, заставляя его выполняться безусловно при каждой загрузке страниц wp-admin. Этот скрипт получает данные промо-баннеров из конечной точки API поставщика. Когда скрипт формирует HTML-контейнер с уведомлением в DOM, он напрямую конкатенирует поле display_id  из удаленного JSON-ответа с атрибутом id без экранирования на стороне клиента:

// unescaped
var f = t.display_id || t.id || "default";
 
// injected in DOM
var m = "bdt-admin-biggopti-api-biggopti-" + f;
A = 'id="' + m + '"';

 

По-видимому, это является недосмотром разработчиков, поскольку позже в том же самом коде атрибут data-display-id уже экранируется корректно.

История коммитов SVN показывает, что внедрение этого неэкранированного атрибута было произведено 1 марта 2026 года в Prime Slider (bdthemes-prime-slider-lite) 4.1.9, а затем применено и к другим плагинам. Хотя в более поздних релизах был введен DOMParser-санитайзер для поля содержимого баннера (удаляющий опасные HTML-теги и встроенные обработчики), внедрение атрибута id осталось неэкранированным.

Злоумышленник, имеющий права на запись в бакет поставщика, заменил легитимные JSON-ответы специально созданными пейлоадами. Внедренный в display_id код срабатывает автоматически без кликов со стороны администратора за счет хитрой комбинации HTML и CSS-анимации.

Гибкая архитектура с несколькими пейлоадами

Внедренный обработчик событий инициирует многоэтапную компрометацию, получая внешние скрипты в зависимости от доступности инфраструктуры злоумышленника.

Базовый пейлоад (w2.js)

  1. Основной пейлоад передается плагинам с использованием конечной точки API api-data-all-records. Когда w2.js выполняется в рамках аутентифицированной сессии администратора, он совершает следующую последовательность действий:
  2. Проверка C2: Он связывается с сервером C2 по адресу ia-cdn[.]com/fz/c, указывая на веб-сайт жертвы, чтобы получить инструкции по целям, прерывая процесс, если C2 возвращает статус «skip» или «done».
  3. Создание фейкового администратора: Используя X-WP-Nonce, присутствующий в активной сессии администратора, он создает нового администратора через REST API WordPress. Имеется также запасной fallback для создания админа через стандартную отправку формы.
  4. Установка вебшелла: Он загружает фейковый ZIP-архив плагина с C2-сервера и устанавливает его через стандартную форму загрузки плагина. Замаскированный под wp-smart-thumbnails или похожие нейтральные слаги, этот фейковый плагин содержит веб-оболочку с именем emer-run.php, которая вызывается напрямую по URL-адресу.
  5. Must-Use (MU) бэкдоры плагина: Вызов emer-run.php устанавливает два модуля обеспечения постоянного доступа в каталог Must-Use: wp-content/mu-plugins/. Оба полученных нами образца были датированы сентябрем 2025 года, чтобы соответствовать легитимным меткам времени файловой системы (имена файлов могут варьироваться в зависимости от заражения). Первый модуль — это бэкдор «магического входа», открывающий неавторизованный административный доступ через параметр URL (?_wplogin=<token>), нацеленный на администратора с самым длительным стажем регистрации на сайте. Второй модуль — это фоновый компонент защиты от анализа, который подключается к запросам к БД WordPress, чтобы скрыть созданные мошеннические аккаунты из списка администраторов и соответственно уменьшить общее количество пользователей.
  6. Эксфильтрация. Все результаты этапа выполнения отправляются обратно на C2-сервер через navigator.sendBeacon.

Альтернативный пейлоад

Вторичный скрипт размещается непосредственно в инфраструктуре BdThemes и предоставляется плагинам через конечную точку API api-data-records. Он генерирует детерминированные административные учетные данные, математически полученные из имени хоста веб-сайта-жертвы.

Этот алгоритм генерирует предсказуемые имена пользователей (bd_ с последующим 6-символьным хешем в формате Base36) и пароли (Bd@26! с последующим хешем и x), сопоставляя их с адресом электронной почты @wordpress.org. Поскольку учетные данные детерминированы, злоумышленникам не нужно централизованно хранить списки скомпрометированных сайтов.

Сгенерированные учетные данные затем используются для создания мошеннического администратора; результаты передаются на сервер C2, при этом в браузере жертвы сохраняется флаг localStorage (если он доступен).

Злоумышленники и масштабы атаки

Домен С2 связан с теми же злоумышленниками, которые стояли за атаками на Advanced Responsive Video Embedder и OptinMonster, произошедшими за последние два месяца.

Основная цель этой кампании — широкомасштабное, скрытое административное закрепление и удаленное выполнение кода в миллионах сред WordPress. Эта компрометация цепочки поставок особенно коварна, поскольку не требовала доступа к веб-сайтам; достаточно было отравления простого рекламного фида, чтобы использовать уязвимость в базовом коде отображения.

Тот факт, что вредоносные записи JSON и вторичный пейлоад x.js были загружены непосредственно в собственный бакет поставщика, указывает на серьезную компрометацию учетных данных облачного хранилища BdThemes или внутренней инфраструктуры.

Начиная с 08.08.2026, обе конечные точки API возвращают чистый JSON.

Затронутые плагины:

  • Element Pack Addons for Elementor (bdthemes-element-pack-lite)
  • Prime Slider Addons for Elementor (bdthemes-prime-slider-lite)
  • Pixel Gallery Addons for Elementor (pixel-gallery)
  • Ultimate Post Kit Addons for Elementor (ultimate-post-kit)
  • Ultimate Store Kit – Addon For WooCommerce, EDD and Elementor (ultimate-store-kit)
  • Live Copy Paste for Elementor (live-copy-paste)
  • Smart Admin Assistant (smart-admin-assistant)

Мы рекомендуем всем владельцам сайтов WordPress, использующим плагины BdThemes, немедленно проверить списки пользователей БД, каталоги плагинов и таблицу опций БД на наличие каких-либо признаков компрометации.

Источник: https://www.wordfence.com/blog

Дмитрий/ автор статьи
CCO, Senior SEM/PPC Specialist, WordPress-энтузиаст, переводчик с английского и немецкого. Серый кардинал русскоязычного WP-комьюнити.
Блог про WordPress
Добавить комментарий

Получать новые комментарии по электронной почте.