Разработчики системы управления web-контентом Joomla опубликовали экстренное обновление 3.6.4, в котором устранены две уязвимости, которым присвоен наивысший уровень опасности. Проблемы с безопасностью затрагивают версии от 3.4.4 до 3.6.3. Уязвимостям присвоены CVE-2016-8870  и  CVE-2016-8869.

Обе уязвимости затрагивают ядро CMS и обозначены как очень опасные. CVE-2016-8870 позволяет любому пользователю зарегистрироваться на сайте, даже если регистрация была деактивирована. CVE-2016-8869 также позволяет зарегистрироваться на сайте, но с повышенными привилегиями. Проблема возникает из-за некорректного использования нефильтрованных данных.

Уязвимый код находится в компоненте components/com_users/controllers/user.php:
- * Method to register a user.
- *
- * @return boolean
- *
- * @since 1.6
- */
- public function register()
- {
- JSession::checkToken('post') or jexit(JText::_('JINVALID_TOKEN'));
-
- // Get the application
- $app = JFactory::getApplication();
-
- // Get the form data.
- $data = $this->input->post->get('user', array(), 'array');
-
- // Get the model and validate the data.
- $model = $this->getModel('Registration', 'UsersModel');
-
- $form = $model->getForm();
-
- if (!$form)
- {
- JError::raiseError(500, $model->getError());
-
- return false;
- }
-
- $return = $model->validate($form, $data);
-
- // Check for errors.
- if ($return === false)
- {
- // Get the validation messages.
- $errors = $model->getErrors();
-
- // Push up to three validation messages out to the user.
- for ($i = 0, $n = count($errors); $i < $n && $i < 3; $i++) - { - if ($errors[$i] instanceof Exception) - { - $app->enqueueMessage($errors[$i]->getMessage(), 'notice');
-
- continue;
- }
-
- $app->enqueueMessage($errors[$i], 'notice');
- }
-
- // Save the data in the session.
- $app->setUserState('users.registration.form.data', $data);
-
- // Redirect back to the registration form.
- $this->setRedirect('index.php?option=com_users&view=registration');
-
- return false;
- }
-
- // Finish the registration.
- $return = $model->register($data);
-
- // Check for errors.
- if ($return === false)
- {
- // Save the data in the session.
- $app->setUserState('users.registration.form.data', $data);
-
- // Redirect back to the registration form.
- $message = JText::sprintf('COM_USERS_REGISTRATION_SAVE_FAILED', $model->getError());
- $this->setRedirect('index.php?option=com_users&view=registration', $message, 'error');
-
- return false;
- }
-
- // Flush the data from the session.
- $app->setUserState('users.registration.form.data', null);
-
- return true;
- }
-
- /**

Первая уязвимость (CVE-2016-8870) позволяет зарегистрировать на сайте новую учётную запись, даже если регистрация новых пользователей запрещена в настройках. Вторая уязвимость (CVE-2016-8869) позволяет любому внешнему посетителю создать нового пользователя и добавить его в любую группу доступа, в том числе передать ему права администратора. Проблемы проявляются в Joomla, начиная с выпуска 3.4.4, и вызваны оставлением в коде доступного для внешних обращений и не требующего аутентификации обработчика для регистрации новых пользователей.

Видео-запись эксплуатации уязвимости: