Произошла атака на цепочку поставок OptinMonster, TrustPulse и PushEngage

Атака на цепочку поставок, подробно описанная 13 июня компанией Sansec, затронула JavaScript, используемый в плагинах OptinMonster, TrustPulse и PushEngage, разработанных компанией Awesome Motive.

Особенностью атаки стало то, что вредоносный код запускался внутри браузера любого авторизованного администратора, загрузившего страницу сайта, после чего создавался новый аккаунт администратора и устанавливался плагин с бэкдором. Новые учетные данные передавались на сайт tidio.cc, который представляет собой клон реального сайта tidio.com.

Один только OptinMonster имеет более 1 миллиона установок WordPress. Вредоносная программа срабатывает только для авторизованных администраторов, а не для обычных посетителей. Но поскольку злоумышленник фактически получает полный контроль над сайтом, дальнейшее злоупотребление в отношении посетителей вполне ожидаемо.

Awesome Motive управляет одним из крупнейших в мире портфелей плагинов для WordPress, используемым на десятках миллионов сайтов. Среди других продуктов — WPForms (более 6 миллионов активных установок), MonsterInsights (около 2 миллионов) и All in One SEO (около 3 миллионов). Пока компания Sansec подтвердила только взлом кода OptinMonster, TrustPulse и PushEngage, но всем, кто использует плагины Awesome Motive, следует сохранять бдительность, следить за индикаторами и устанавливать исправления по мере реагирования разработчика.

Вредоносный код был распространен на миллион сайтов WordPress через конечные точки CDN Awesome Motive. Любой сайт WordPress, загружающий один из этих скриптов, получал измененный файл непосредственно из источника:

  • OptinMonster: a.omappapi.com/app/js/api.min.js
  • OptinMonster: a.opmnstr.com/app/js/api.min.js
  • OptinMonster: a.optnmstr.com/app/js/api.min.js
  • TrustPulse: a.trstplse.com/app/js/api.min.js
  • PushEngage: clientcdn.pushengage.com/sdks/pushengage-web-sdk.js

Вредоносная программа имеет строгий контроль и выполняется поэтапно:

  1. Она немедленно завершает работу при использовании navigator.webdriver, безголовых браузеров или окна нулевого размера. Она продолжает работу только в том случае, если обнаруживает контекст административной панели WordPress: путь wp-admin, админ-бар или куки wordpress_logged_in_. Повторное выполнение программы ограничено 24-часовым лимитом, хранящимся в localStorage[‘_pe_ts’].
  2. Она выявляет корневой каталог WordPress и путь к административной панели, определяет версию WordPress и собирает REST и AJAX nonce (wpApiSettings.nonce, admin-ajax.php?action=rest-nonce и данные, полученные из user-new.php).
  3. Она создает администратора, используя четыре резервных метода последовательно: форму user-new.php, admin-ajax.php, REST-эндпоинт wp/v2/users и, наконец, скрытую iframe-форму. Она даже распознает ответы «Пользователь уже существует» примерно на двадцати языках. Программа создает фиксированный аккаунт developer_api1 / customer1usx@gmail.com, а также случайные аккаунты dev_xxxxxx.
  4. Программа незаметно загружает скрытый PHP-плагин.
  5. Новые данные администратора: пароль, источник сайта, URL для выхода, путь к админке, метод, время и версия WordPress шифруются с помощью XOR (ключ jX9kM2nP4qR6sT8v), кодируются в base64 и отправляются на tidio.cc/cdn-cgi/*. Доставка осуществляется либо через sendBeacon, либо через fetch (no-cors), через XHR или через веб-маяк Image().src.

Плагин-бэкдор, скрытый от пользователя

Устанавливаемый плагин создан так, чтобы его нельзя было увидеть. Он скрывается из списка пользователей, списка плагинов (как на экране администратора, так и в REST-интерфейсе /wp/v2/plugins), проверок обновлений и списка «недавно активных». При инициализации init, без необходимости аутентификации, он предоставляет две точки входа:

  • ?developer_api1_fm открывает веб-оболочку под названием «WPM File Manager & Shell», которая запускает system($_POST[‘cmd’]) и принимает загрузку файлов.
  • POST-запрос к developer_api1_eval запускает eval(base64_decode(…)) с входными данными, предоставленными злоумышленником.

Оператор меняет маскировку плагина, сохраняя при этом логику байтовой идентичности при переименовании. Мы наблюдали его распространение под названиями «Content Delivery Helper» (content-delivery-helper, v2.7.1) и «Database Optimizer» (database-optimizer, v2.9.4). ZIP-архив плагина генерируется заново при каждом запросе: скрипт загружает tidio.cc/cdn-cgi/{pe-,}l?t=gen&u=developer_api1, который возвращает base64-объект, декодируемый с помощью того же XOR-ключа в ID плагина, его слаг и ZIP-архив.

Активная эксплуатация

Специалисты из Patchstack быстро создали правила обнаружения и сообщили о блокировке 271 попытки взлома административных панелей на 13 сайтах 14 и 15 июня, подтвердив фактическое злоупотребление уязвимости WordPress. Почти все (263) обращались к REST-эндпоинту wp/v2/users, остальные были распределены между user-new.php и admin-ajax.php, что соответствует резервному порядку в полезной нагрузке. 267 использовали случайный идентификатор dev_xxxxxx, а 4 — фиксированную учетную запись developer_api1, с 81 уникального IP-адреса.

Вредоносное ПО распространялось через домены Awesome Motive в CDN BunnyNet.

В своих уведомлениях об инциденте компания Awesome Motive заявила, что злоумышленник использовал известную уязвимость в плагине UpdraftPlus для WordPress, чтобы получить доступ к серверу с маркетинговым веб-сайтом, обнаружил API-ключ CDN, хранящийся на этом сервере, и использовал его для изменения файлов SDK, предоставляемых клиентам.

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

Затронут ли я атакой?

Если у вас установлен один из этих плагинов и вы заходили на сайт под аккаунтом администратора во временной промежуток примерно с 12 по 14 июня, ущерб вам уже нанесен.

  1. Найдите аккаунт developer_api1 (customer1usx@gmail.com) и любые неожиданные аккаунты dev_xxxxxx. Удалите их.
  2. Найдите в файловой системе по адресу wp-content/plugins каталоги content-delivery-helper / «Content Delivery Helper» и database-optimizer / «Database Optimizer». Этот плагин скрыт в панели управления, поэтому доверяйте диску больше, чем пользовательскому интерфейсу администратора.

Если вы обнаружили какие-либо признаки компрометации, поменяйте все пароли и секретные ключи администратора.

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

Источник: https://sansec.io

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

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