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"
}
Временное решение
Если немедленное обновление невозможно, ограничьте доступ к маршруту сброса пароля.
-
Настройка веб-сервера (Nginx): Добавьте правило, блокирующее прямой доступ к
password/resetдля всех, кроме доверенных IP-адресов (например, администраторов).nginx location ~ ^/password/reset { allow 192.168.1.100; # Ваш доверенный IP deny all; try_files $uri $uri/ /index.php?$query_string; } -
Настройка WAF (Web Application Firewall): Создайте правило, блокирующее запросы POST к пути
/password/reset, которые не содержат валидный, предварительно выданный системой токен (параметрtoken). Это правило должно проверять наличие и формат токена. -
На уровне приложения (временный хот-фикс): В файле маршрутов или в
Plugin.phpвашего плагина добавьте промежуточное ПО для проверки реферера или пользовательского заголовка. Внимание: это ненадежная мера.php // Пример в routes.php Route::post('password/reset', function () { // Простая проверка источника запроса (можно обойти) if (request()->header('X-Secure-Reset') !== 'YourSecretKey') { abort(403, 'Access denied.'); } // ... оригинальный код контроллера });
Важно: Временные решения лишь усложняют эксплуатацию. Полноценное исправление — только обновление ядра CMS.