В плагине UpdraftPlus для WordPress исправлена критическая уязвимость

Специалисты из Wordfence рапортовали об обнаружении критической уязвимости в плагине UpdraftPlus для WordPress, который имеет более 3 миллионов активных установок. Несмотря на такую популярность, уязвимость может эксплуатироваться только на сайтах, которые ранее были подключены к UpdraftCentral, панели удаленного управления сайтом.

На затронутых сайтах эта уязвимость позволяет неаутентифицированным злоумышленникам выполнять произвольные удаленные вызовы процедур (RPC) от имени подключенного администратора, например, загружать и активировать вредоносные плагины, что приводит к выполнению произвольного PHP-кода и полной компрометации сайта.

Обнаружил и ответственно сообщил о данной уязвимости пользователь vtim. В рамках программы Wordfence Bug Bounty Program он получил вознаграждение в размере 5 200 долларов.

Специалисты Wordfence предоставили полную информацию об уязвимости разработчикам UpdraftPlus 3 июня 2026 года. Патч вышел 5 июня 2026 года.

Технический анализ уязвимости

Уязвимость получила номер CVE-2026-10795 и имеет рейтинг опасности 8.1 (Высокий). Уязвимыми являются все версии плагина до 1.26.4 включительно. Исправленная версия – 1.26.5.

UpdraftPlus — популярный плагин для WordPress, предназначенный для создания резервных копий, миграции и удаленного управления сайтами. Он опционально интегрируется с UpdraftCentral, централизованной панелью управления сайтами, доступной как в виде облачного сервиса, так и в виде self-hosted продукта, что позволяет администраторам управлять несколькими сайтами WordPress из единого интерфейса.

Для поддержки этой интеграции плагин UpdraftPlus включает в себя библиотеку удаленной связи, которая после подключения сайта к UpdraftCentral регистрирует неаутентифицированного RPC-слушателя (listener) при каждой загрузке страницы. Этот слушатель принимает POST-запросы, содержащие сериализованное сообщение udrpc_message, и отправляет декодированную команду от имени подключающегося администратора.

После того как слушатель решает обработать сообщение, он вызывает функцию decrypt_message() из класса UpdraftPlus_Remote_Communications_V2, которая извлекает из сообщения зашифрованную симметричную часть ключа в кодировке base64, пытается расшифровать её с помощью локального приватного ключа RSA, а затем использует результат непосредственно в качестве AES-ключа для расшифровки тела сообщения.

public function decrypt_message($message) {
 
    if (!$this->key_local) throw new Exception('No decryption key has been set');
 
    $rsa = new phpseclib_Crypt_RSA();
    if (defined('UDRPC_PHPSECLIB_ENCRYPTION_MODE')) $rsa->setEncryptionMode(UDRPC_PHPSECLIB_ENCRYPTION_MODE);
    // Defaults to CRYPT_AES_MODE_CBC
    $rij = new phpseclib_Crypt_Rijndael();
 
    // Extract the Symmetric Key
    $len = substr($message, 0, 3);
    $len = hexdec($len);
    $sym_key = substr($message, 3, $len);
 
    // Extract the encrypted message
    $cipherlen = substr($message, ($len + 3), 16);
    $cipherlen = hexdec($cipherlen);
 
    $ciphertext = substr($message, ($len + 19), $cipherlen);
    $ciphertext = base64_decode($ciphertext);
 
    // Decrypt the encrypted symmetric key
    $rsa->loadKey($this->key_local);
    $sym_key = base64_decode($sym_key);
    $sym_key = $rsa->decrypt($sym_key);
 
    // Decrypt the message
    $rij->setKey($sym_key);
 
    return $rij->decrypt($ciphertext);
 
}

К сожалению, функция не проверяет возвращаемое значение $rsa->decrypt(). Если предоставленный зашифрованный ключ некорректен, RSA::decrypt() из phpseclib возвращает false вместо того, чтобы генерировать исключение. Передача false в Rijndael::setKey() позволяет получить детерминированный шифр с полностью нулевым ключом AES-128, полностью нулевым вектором инициализации и PKCS7 дополнением. Злоумышленник может воспроизвести эту конфигурацию локально, зашифровать сообщение по своему выбору и добиться его успешного расшифрования сервером без необходимости доступа к ключам сайта.

Это означает, что неаутентифицированный злоумышленник может создать полностью поддельное сообщение udrpc_message, которое слушатель примет и отправит так, как если бы оно было подписано и зашифровано подключенной панелью управления UpdraftCentral.

Когда диспетчер передает сообщение слушателю UpdraftCentral в функции UpdraftCentral_Listener::udrpc_action(), он вызывает функцию wp_set_current_user() с ID администратора, который первоначально подключил сайт к UpdraftCentral. С этого момента каждая проверка прав доступа WordPress рассматривает запрос как исходящий от полностью аутентифицированного администратора.

UpdraftPlus реализует ряд мощных RPC-команд, например, plugin.upload_plugin, которая записывает произвольный ZIP-архив плагина на диск с помощью file_put_contents() и устанавливает его через Plugin_Upgrader::install(), и plugin.activate_plugin, которая активирует только что установленный плагин. Загрузив плагин, содержащий простую PHP-оболочку, злоумышленник может получить доступ к выполнению произвольного PHP-кода и команд ОС.

Разработчик решил эту проблему, добавив проверку возвращаемого значения в функцию decrypt_message().

Мы настоятельно рекомендуем пользователям как можно скорее обновить свои сайты до последней исправленной версии UpdraftPlus.

Источник: https://www.wordfence.com

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

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