CVE-2021-32648

October CMS October CMS

ВЫСОКАЯ ВЕРОЯТНОСТЬ

Дата обнаружения

2022-01-18

Официальное описание

In affected versions of the october/system package an attacker can request an account password reset and then gain access to the account using a specially crafted request.

🛡️
Технический анализ и план устранения

Суть уязвимости

Атакующий может: 1. Инициировать процедуру сброса пароля для учетной записи жертвы. 2. Использовать специально сформированный запрос к конечной точке сброса пароля (/password/reset). 3. Обойти проверку токена сброса, что позволит ему установить новый пароль и получить контроль над учетной записью без знания старого пароля или доступа к email жертвы.

Как исправить

Необходимо обновить ядро October CMS (october/system) до исправленной версии.

  • Для версий 1.0.x: обновитесь до версии 1.0.475 или выше.
  • Для версий 1.1.x: обновитесь до версии 1.1.11 или выше.

Способ обновления через Composer (рекомендуется):

# Для проекта на версии 1.0
composer require october/system:^1.0.475

# Для проекта на версии 1.1
composer require october/system:^1.1.11

# После обновления пакетов выполните миграции базы данных
php artisan october:up

Проверьте текущую версию в файле composer.json:

"require": {
    "october/system": "^1.0.475"
}

Временное решение

Если немедленное обновление невозможно, ограничьте доступ к маршруту сброса пароля.

  1. Настройка веб-сервера (Nginx): Добавьте правило, блокирующее прямой доступ к password/reset для всех, кроме доверенных IP-адресов (например, администраторов). nginx location ~ ^/password/reset { allow 192.168.1.100; # Ваш доверенный IP deny all; try_files $uri $uri/ /index.php?$query_string; }

  2. Настройка WAF (Web Application Firewall): Создайте правило, блокирующее запросы POST к пути /password/reset, которые не содержат валидный, предварительно выданный системой токен (параметр token). Это правило должно проверять наличие и формат токена.

  3. На уровне приложения (временный хот-фикс): В файле маршрутов или в Plugin.php вашего плагина добавьте промежуточное ПО для проверки реферера или пользовательского заголовка. Внимание: это ненадежная мера. php // Пример в routes.php Route::post('password/reset', function () { // Простая проверка источника запроса (можно обойти) if (request()->header('X-Secure-Reset') !== 'YourSecretKey') { abort(403, 'Access denied.'); } // ... оригинальный код контроллера });

Важно: Временные решения лишь усложняют эксплуатацию. Полноценное исправление — только обновление ядра CMS.