29 июля 2021 года команда Wordfence Threat Intelligence начала процедуру координированного раскрытия уязвимости, найденной в плагине SEOPress. Этот плагин установлен на более 100 000 сайтов. Уязвимость позволяла злоумышленнику внедрять произвольные веб-скрипты на сайт, причем эти скрипты выполнялись всякий раз, когда пользователь заходил на страницу со всеми записями.
Пользователи Wordfence Premium получили новое правило для файрвола еще 29 июля 2021 года. Аналогичная защита появится в бесплатной версии Wordfence только 28 августа.
Специалисты Wordfence связались с разработчиком плагина 29 июля. Как только они получили от него обратную связь, был начат процесс полного раскрытия информации. В итоге готовый патч (релиз 5.0.4) появился 4 августа 2021 года.
Мы настоятельно рекомендуем вам немедленно выполнить обновление плагина SEOPress до последней версии 5.0.4.
SEOPress был создан для оптимизации SEO-показателей WordPress-сайтов. В него встроены разные функции, включая возможность добавлять SEO-метаданные, «хлебные крошки», схемы и т.д. Одной из опций плагина было добавление SEO-заголовка и описания к записям, что можно было сделать при сохранении изменений в записи или через новую конечную точку (эндпоинт) REST-API.
register_rest_route('seopress/v1', '/posts/(?P<id>d+)/title-description-metas', [ 'methods' => 'PUT', 'callback' => [$this, 'processPut'], 'args' => [ 'id' => [ 'validate_callback' => function ($param, $request, $key) { return is_numeric($param); },
К сожалению, реализация этой конечной точки REST-API оказалась небезопасной. Permissions_callback для эндпоинта проверялся только в том случае, когда у пользователя был валидный REST-API nonce-код в запросе. А валидный REST-API nonce-код может быть сгенерирован любым аутентифицированным пользователем WordPress с помощью встроенного в ядро WP AJAX-действия. Соответственно, любой аутентифицированный пользователь – скажем, подписчик, – мог вызвать REST-маршрут с валидным nonce-кодом и обновить SEO-заголовок и описание для любой записи.
'permission_callback' => function ($request) { $nonce = $request->get_header('x-wp-nonce'); if ( ! wp_verify_nonce($nonce, 'wp_rest')) { return false; } return true;
Также злоумышленники могли подключать вредоносные веб-скрипты, учитывая отсутствие очистки или эскейпинга сохраняемых параметров. В дальнейшем эти веб-скрипты могли выполняться каждый раз, когда пользователь посещает страницу «All Posts». XSS-уязвимости, подобные этой, приводят к разным последствиям, начиная от создания новых аккаунтов администратора и заканчивая внедрением веб-шеллов, произвольных редиректов и т.д.
Источник: wordfence.com