Блог

Платили за безопасность — получили бэкдор. Как взлом сборочного конвейера ShapedPlugin ударил по платным клиентам WordPress

backdoor_hapedPlugin_WordPress
CVE / Linux / Wordpress / Безопасность

Платили за безопасность — получили бэкдор. Как взлом сборочного конвейера ShapedPlugin ударил по платным клиентам WordPress

Вы заплатили за Pro-версию плагина, настроили автообновления и спите спокойно — потому что вы клиент коммерческого продукта, а не пользователь бесплатного мусора с WordPress.org. Логично? Именно так думали тысячи администраторов WordPress, использующих плагины ShapedPlugin. И именно они получили бэкдор через официальный канал обновлений — тот самый, которому доверяли.

21 мая 2026 года злоумышленники внедрили вредоносный загрузчик в сборки трёх коммерческих плагинов ShapedPlugin: Product Slider Pro для WooCommerce (до версии 3.5.4), Real Testimonials Pro (версия 3.2.5) и Smart Post Show Pro (до версии 4.0.2). Бесплатные версии на WordPress.org не пострадали — атака была точечной и целенаправленной против платящих клиентов. Инцидент отслеживается как CVE-2026-10735 с оценкой CVSS 9.8 — это Critical, backdoor access к заражённым сайтам без какой-либо аутентификации. CVE-2026-49777 принят как дублирующий номер.

Команда Wordfence Threat Intelligence получила сигнал об инциденте 11 июня, подтвердила заражение 12 июня после скачивания файлов напрямую с сайта ShapedPlugin, и к 16 июня вендор признал факт компрометации. Если ваш сайт использовал любой из трёх Pro-плагинов в период с апреля по июнь 2026 года — считайте его скомпрометированным до обратного.

КАК УСТРОЕНА АТАКА

Механика атаки двухступенчатая и намеренно сложная — каждый этап прикрывает следующий.

Первая стадия — файл src/Includes/LicenseLoader.php, вшитый прямо в дистрибутив плагина. Он активируется на хуке admin_init, то есть запускается автоматически в момент, когда администратор сайта открывает панель управления WordPress. Загрузчик устанавливает соединение с C2-сервером на 194[.]76[.]217[.]28:2871, скачивает вторую стадию через стандартный WordPress Plugin_Upgrader — чтобы установка выглядела как обычное обновление плагина — после чего удаляет себя, физически стирая файл и оставляя минимум следов для форензики.

Вторая стадия устанавливается в директорию wp-content/plugins/woocommerce-subscription/ или wp-content/plugins/woocommerce-notification/ — названия намеренно выбраны похожими на легитимные компоненты WooCommerce. Плагин скрывает себя из списка установленных через фильтр all_plugins, поэтому в административной панели его не видно. Внутри — готовый арсенал: Tiny File Manager 2.6 (полноценный файловый менеджер с веб-интерфейсом), Adminer 5.2.1 (управление базой данных прямо из браузера), бэкдор через REST API по адресу /wp-json/wc/v3/settings/apply, URL-параметрический веб-шелл и обход аутентификации через захардкоженный MD5-хэш e268c35a06d85f672e70c9beecb4e5d1.

Цепочка короткая: администратор открыл Dashboard — загрузчик отработал, поставил бэкдор, доложил домен жертвы на C2, исчез. Бэкдор остался невидимым и ждёт команды.

ЧТО КРАЛИ

Список похищаемых данных — это именно то, что стоит дороже всего на сайте с реальными продажами. Бэкдор целенаправленно извлекал логины и пароли пользователей, сессионные cookie активных сессий, роли пользователей с упором на администраторов, данные WooCommerce-заказов за последние три месяца включая информацию о способах оплаты, SMTP-учётные данные, ключи безопасности WordPress из wp-config.php и полный список администраторов сайта.

Отдельного внимания заслуживает кража секретов двухфакторной аутентификации. Бэкдор специально заточен под TOTP-реализации четырёх популярных плагинов: WP 2FA, Wordfence Login Security, Really Simple SSL и Two-Factor. Он извлекает TOTP seed — тот самый секрет, из которого генерируются одноразовые коды. Получив seed, атакующий генерирует валидные 2FA-коды самостоятельно и полностью обходит второй фактор — независимо от того, насколько аккуратно пользователь его настроил.

Параллельно со сбором данных бэкдор давал операторам возможность записывать произвольные файлы на сервер через Tiny File Manager или веб-шелл. На практике это означает размещение дополнительных PHP-шеллов и любого другого кода в любом месте файловой системы, доступной веб-серверу. Данные крадут один раз; доступ через файловый менеджер — это постоянная точка входа.

КАК ВЗЛОМАЛИ СБОРОЧНЫЙ КОНВЕЙЕР

Wordfence не нашёл следов взлома самих плагинов после публикации. Анализ временных меток показал: четыре файла были изменены в двухчасовом окне 21 мая 2026 года — поведение, характерное для автоматизированного процесса инъекции, а не ручной правки. По данным Wordfence, внутри метаданных плагинов обнаружились ссылки на приватные Git-репозитории, а паттерн изменений совпал с workflow публикации релизов ShapedPlugin.

Всё это указывает на компрометацию не самих файлов плагинов, а сборочного и дистрибуционного конвейера вендора — инфраструктуры, которая собирает ZIP-архивы релизов и раздаёт их платным клиентам через официальный сайт. Именно поэтому бесплатные версии на WordPress.org остались чистыми: у них другой публикационный путь. Атакующие имели доступ к обоим каналам — и сознательно трогали только платный.

Это классический supply chain attack через build pipeline. Не взлом конкретного сайта, не уязвимость в коде плагина — а компрометация точки, из которой код уходит к тысячам клиентов одновременно. Из недавних аналогов — атака на OptinMonster через CDN-ключ в июне 2026 года. Механики разные, результат один: вредоносный код приходит к пользователям с доверенного адреса.

ХРОНОЛОГИЯ

21 мая 2026 — вредоносный код внедрён в Pro-сборки через скомпрометированный build pipeline ShapedPlugin.

10 июня 2026 — первые жалобы клиентов на подозрительные обновления.

11 июня 2026 — Wordfence Threat Intelligence получает уведомление о потенциальной компрометации.

12 июня 2026 — исследователи Wordfence подтверждают заражение после скачивания файлов напрямую с сайта ShapedPlugin. Заражённый Real Testimonials Pro версии 3.2.5 всё ещё раздаётся с официального endpoint обновлений.

16 июня 2026 — ShapedPlugin признаёт инцидент и сообщает о начале расследования.

17–18 июня 2026 — выходят исправленные версии: Product Slider Pro 3.5.4, Smart Post Show Pro 4.0.2, Real Testimonials Pro 3.2.6.

ПОЧЕМУ ЭТО ВАЖНО

Платные плагины продают не только функциональность — они продают доверие. Профессиональная команда, коммерческая ответственность, официальный канал обновлений. ShapedPlugin показал, что именно этот канал можно скомпрометировать, не трогая сам продукт. Атакующие не взламывали код плагина и не эксплуатировали уязвимость в логике — они вошли в конвейер, который собирает и раздаёт релизы, и дальше работа по доставке вредоноса досталась самому WordPress.

Особенно неприятна избирательность атаки. Атакующие имели доступ к обоим каналам — платному и бесплатному — и сознательно трогали только первый. Бесплатные пользователи WordPress.org на этот раз оказались в безопасности. Те, кто заплатил — нет. С точки зрения операционной логики это понятно: платные клиенты с активными WooCommerce-магазинами — это данные карт, SMTP-доступ к реальному домену, учётные записи с историей транзакций. Значительно ценнее, чем аккаунт на тестовом сайте.

CVSS 9.8 здесь не формальность. Атака не требует никакой предварительной аутентификации — бэкдор уже внутри, он ждёт только первого визита администратора в Dashboard. После этого у атакующих есть Adminer для базы данных, Tiny File Manager для файловой системы, веб-шелл для выполнения команд и все учётные данные включая TOTP-сиды. Полный контроль над сайтом без единого взломанного пароля.

КАК ЗАЩИТИТЬСЯ

Первое и срочное: обновите затронутые плагины. Product Slider Pro — минимум до 3.5.4, Smart Post Show Pro — до 4.0.2, Real Testimonials Pro — до 3.2.6. Но обновление закрывает только канал доставки — оно не удаляет бэкдор, если тот уже установлен.

Проверьте файловую систему на наличие фейковых плагинов. Через Dashboard их не увидите — бэкдор скрывает себя через фильтр all_plugins. Смотрите напрямую: искать нужно директории woocommerce-subscription (именно в единственном числе, не woocommerce-subscriptions) и woocommerce-notification:

ls -la /var/www/html/wp-content/plugins/ | grep -E "woocommerce-subscription$|woocommerce-notification"

Если директория найдена — сайт был скомпрометирован. Удалите её, но учитывайте: через Tiny File Manager или веб-шелл к этому моменту могли быть размещены дополнительные бэкдоры в любом месте файловой системы. Проверка одной директории не даёт полной картины.

Сбросьте все учётные данные: пароли пользователей WordPress, API-ключи, SMTP-пароли. Если на сайте используется любой из четырёх затронутых 2FA-плагинов — WP 2FA, Wordfence Login Security, Really Simple SSL или Two-Factor — аннулируйте TOTP-сиды и перевыпустите их для всех пользователей. Старые QR-коды считайте скомпрометированными.

Обновите секретные ключи WordPress в wp-config.php — это мгновенно инвалидирует все активные сессии. Новые восемь строк от AUTH_KEY до NONCE_SALT берите с официального генератора: https://api.wordpress.org/secret-key/1.1/salt/.

Проверьте список администраторов — в этой атаке аккаунты не создавались автоматически (в отличие от OptinMonster, где появлялся developer_api1), но записи могли быть внесены вручную через полученный доступ. Команда выводит только пользователей с ролью administrator, показывая ID, логин, email и дату регистрации. Последнее поле — ключевое: новая учётная запись с датой в период мая–июня 2026 года это красный флаг. Флаг --path указывает WP-CLI где находится установка WordPress — без него команда падает с ошибкой «This does not seem to be a WordPress installation»:

wp user list --path=/var/www/html --role=administrator --fields=ID,user_login,user_email,user_registered

Если команда не выполняется из-за ограничений open_basedir — запускайте от имени веб-пользователя:

sudo -u www-data wp user list --path=/var/www/html --role=administrator --fields=ID,user_login,user_email,user_registered

Заблокируйте C2-адрес на уровне firewall. Правило добавляется в цепочку output и сбрасывает все исходящие пакеты к IP 194.76.217.28 — адресу командного сервера атаки. Даже если на сервере остался необнаруженный остаточный код, связь с C2 не пройдёт:

nft add rule inet filter output ip daddr 194.76.217.28 drop

КАК ЗАЩИТИТЬСЯ ПРЕВЕНТИВНО

Блокировка конкретного C2-адреса закрывает эту атаку, но не следующую. Реальная защита — ограничить исходящие соединения от PHP-процесса в принципе. Загрузчик типа LicenseLoader.php работает от имени веб-пользователя (www-data на Debian/Ubuntu) и соединяется с C2 на нестандартном порту 2871. Правило nftables по uid убивает весь этот класс атак: PHP сможет делать HTTP/HTTPS наружу, но не произвольные TCP-соединения на случайные порты:

nft add rule inet filter output skuid www-data tcp dport != { 80, 443 } drop

Если WordPress использует нестандартные порты для легитимных нужд (например, SMTP напрямую) — добавьте их в список исключений. Проверить uid веб-пользователя можно командой id www-data; если пул PHP-FPM запускается под другим пользователем — подставьте его имя.

На уровне PHP-FPM можно отключить функции, которые загрузчик использует для сетевых соединений. В конфигурации пула WordPress в файле наподобие /etc/php/8.3/fpm/pool.d/wordpress.conf добавьте:

php_admin_value[disable_functions] = fsockopen,pfsockopen,stream_socket_client

Это лишает PHP-код возможности открывать произвольные TCP-сокеты. Большинство легитимных WordPress-плагинов используют cURL или wp_remote_get() для HTTP-запросов — они не пострадают. После изменения перезапустите PHP-FPM: systemctl restart php8.3-fpm.

Мониторинг файловой системы — единственный способ поймать Stage 2 в момент записи, до того как загрузчик себя удалил. inotifywait из пакета inotify-tools следит за директорией плагинов и немедленно пишет в лог при появлении нового файла или директории:

inotifywait -m -r -e create,moved_to --format '%T %w%f' \
  --timefmt '%Y-%m-%d %H:%M:%S' \
  /var/www/html/wp-content/plugins/ >> /var/log/wp-plugins-monitor.log 2>&1 &

Для постоянного мониторинга оформите это как systemd-сервис — иначе процесс пропадёт после перезагрузки. AIDE даёт более глубокую проверку: он фиксирует baseline файловой системы и при каждом запуске сравнивает с ним текущее состояние. Новая директория в wp-content/plugins/ будет обнаружена при следующей проверке, даже если загрузчик к тому моменту уже удалился:

# Инициализировать baseline на чистой системе
aide --init
mv /var/lib/aide/aide.db.new /var/lib/aide/aide.db

# Проверить текущее состояние
aide --check

Запускайте aide --check ежедневно через systemd timer — любое отклонение от baseline придёт в отчёт. Для WordPress-сервера с реальными транзакциями это не опциональная мера.

ВЫВОДЫ

ShapedPlugin — не уникальный случай. Это второй крупный supply chain инцидент в экосистеме WordPress за один месяц, после OptinMonster. Вектор через build pipeline или дистрибуционную инфраструктуру становится стандартным инструментом — он позволяет атаковать сразу всех пользователей продукта, используя их собственное доверие к вендору.

Практический вывод один: Dashboard WordPress — не авторитетный источник информации о том, что установлено на сервере. Плагин может отсутствовать в списке и при этом работать. AIDE на файловой системе, мониторинг новых файлов в wp-content/plugins/, аудит через WP-CLI — это не паранойя для параноиков. Это минимум для сайта с реальными транзакциями.

Окно компрометации — около месяца: с 21 мая по 16 июня. Исправленные версии доступны. Если вы использовали один из трёх Pro-плагинов в этот период, воспринимайте свой сайт как скомпрометированный и работайте исходя из этого — а не из надежды что вас не задело.

Leave your thought here

Ваш адрес email не будет опубликован. Обязательные поля помечены *