Сайты на WordPress с поддержкой плагина WooCommerce подвержены новой уязвимости, которая может позволить злонамеренному или взломанному привилегированному пользователю получить полный контроль над сайтом. Об этой уязвимости сообщил Саймон Сканелл (Simon Scannell), исследователь компании RIPS Technologies.

Плагин WooCommerce является одним из самых популярных плагинов электронной коммерции для WordPress, на котором работает почти 35% электронных магазинов в Интернете, с более 4 миллионами установок.

Выявленная уязвимость позволяет, используя особенности обработки пользовательских привилегий WordPress и возможность удаления файлов WooCommerce, учетной записи с ролью "Менеджер магазина" сбросить пароль от учетной записи администратора и контролировать работу веб-сайта.

При установке, плагин WooCommerce создает учетную запись "Менеджер магазина" с разрешением edit_user, позволяя редактировать учетные записи клиентов магазина, чтобы управлять своими заказами, профилями, продуктами и т.д.

   
        add_role(
	   'shop_manager',      // Internal name of the new role
	   'Shop manager',      // The label for displaying
	   array(               // Capabilities
                   ⋮
		   'read_private_posts'     => true,
		   'edit_users'             => true,
		   'edit_posts'             => true,
                   ⋮
	         )
         );

Но в WordPress учетная запись с полномочиями "edit_user" позволяет редактировать даже учетную запись администратора, поэтому плагины, такие как WooCommerce, могут добавлять мета-возможности.

Возможности Meta реализованы как функции, вызываемые current_user_can(). Вместо того, чтобы просто возвращать true в качестве поведения по умолчанию, возвращаемое значение функции meta privilege будет определять, сможет ли текущий пользователь выполнить это действие.

Пример метаобработки:

            
             function disallow_editing_of_admins( $capability, $target_user_id ) {

             // If the user is an admin return false and disallow the action
             if($capability == "edit_user" &&; user_is_admin($target_user_id)) {
             return false;
             } else {
               return true;
             }
           }
           add_filter( 'map_meta_cap', 'disallow_editing_of_admins');

Данный фильтр определяет, является ли редактируемый пользователь администратором. И если да, то действие прекращается и возвращается false, в противном случае, редактирование продолжается. Фильтры работают только при активном плагине WooCommerce, но роли сохраняются даже если плагин отключен. Поэтому, если по каким-то причинам администратор отключит плагин WooCommerce или менеджер магазина сможет удалить основной файл woocommerce.php, что не позволит WordPress загрузить плагин, конфигурация, которая ограничивает учетные записи менеджеров магазина, исчезнет, а это позволит менеджерам редактировать и сбрасывать пароль от учетной записи администратора.

Данная уязвимость актуальна для версии WooCommerce 3.4.6 и более ранних.