Об уязвимости в плагине WordPress SEO от Yoast

В дополнение к статье «Критическая уязвимость в плагине WordPress SEO от Yoast» я провел небольшое расследование и выяснил, что уязвимость была не у всех и, например, на моем сайте ее не было. Подробности уязвимости на WP Scan

Вкратце — у меня на сайте отключена capability, необходимая для “дырявого” пункта меню, поэтому, как я понял, у меня не было такой уязвимости. Отложив все за и против этого ненужного балк редактора, посмотрим что внутри исходного кода.

Страницы для админки регистрируются в plugins/wordpress-seo/admin/class-admin.php. Фрагмент массива с данными для регистрации страницы с “дыркой”:

array(
'wpseo_dashboard',
'',
__( 'Bulk Editor', 'wordpress-seo' ),
'wpseo_bulk_edit',
'wpseo_bulk-editor',
array( $this, 'load_page' ),
array( array( $this, 'bulk_edit_options' ) ),
),

Для этой страницы используется capability wpseo_bulk_edit, которая добавляется и удаляется при активации или удалении плагина. Насколько я понимаю те, у кого этой capability нет (я например на своем сайте выключил ее для всех учетных записей кроме администраторских), не смогут выполнить уязвимость, потому что при вызове /wp-admin/admin.php?page=wpseo_bulk-editor произойдет сценарий событий описанных ниже.

Откроется страница admin.php, в ней на строчке 128 сработает

require(ABSPATH . 'wp-admin/menu.php');

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

require_once(ABSPATH . 'wp-admin/includes/menu.php');

Далее производятся некоторые манипуляции с элементами меню и выкидываются те элементы, к которым доступ перекрыт, а в самом конце есть условие:

if ( !user_can_access_admin_page() ) {
   do_action( 'admin_page_access_denied' );
   wp_die( __( 'You do not have sufficient permissions to access this page.' ), 403 );
}

Оно заставит WordPress отдать 403 и “умереть”, т. к. в случае отсутствия данной capability мы попадаем в это условие.

Отключение Bulk Editor

Отключить эту capability можно через любой плагин для редактирования ролей. Я пользуюсь https://wordpress.org/plugins/members/ от Джастина Тедлока.

Также отключить добавление capability к некоторым типам учетных записей можно через фильтр. Для этого только надо сначала выключить плагин SEO, включить плагин с этим фильтром и потом заново активировать SEO плагин 🙂 Потому что этот фильтр используется для удаления и добавления capability. Такие дела.

/*
 * Выключаем bulk editor для всех, кроме администратора
 */
function selena_network_clean_seo_by_yoast ($roles) {
	$roles = array ('administrator');
	return $roles;
}
add_filter ('wpseo_bulk_edit_roles', 'selena_network_clean_seo_by_yoast');
Advertisements

2 thoughts on “Об уязвимости в плагине WordPress SEO от Yoast

  1. Хорошо пишете, жизненно. Но, для того, чтобы делать
    по-настоящему интересный сайт, нужно не только говорить о чем-то, но и предоставлять это в интересной
    форме:)

    • Это была скорее заметка для себя и может быть каких-то «фанатов кода» (назовем их так), которые сотню раз уже видели все эти файлы, понимают что где происходит и т. п. Для неподготовленного читателя, не знающего досконально этот «узел», заметка будет выглядеть странно и неинтересно. Короче, я согласен, что это не идеальная форма подачи.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s