27 апреля 2020 года команда Wordfence Threat Intelligence обнаружила уязвимость подделки межсайтовых запросов (CSRF) в Ninja Forms, плагине WordPress с более чем 1 миллионом установок. Эта уязвимость может позволить злоумышленнику обманом заставить администратора импортировать контактную форму, содержащую вредоносный JavaScript, и заменить любую существующую контактную форму вредоносной версией.
Мы связались с командой безопасности Ninja Form в соответствии с их руководящими принципами ответственного раскрытия информации, и они ответили в течение нескольких часов. Плагин был исправлен менее чем через 24 часа после нашего первого контакта, 28 апреля 2020 года.
Все пользователи Wordfence, включая как премиум-пользователей Wordfence, так и бесплатных пользователей Wordfence, защищены от попыток XSS устранить эту уязвимость встроенной защитой XSS брандмауэра Wordfence.
Описание: подделка межсайтовых запросов к хранимым межсайтовый скриптинг
пострадавших плагин: ниндзя форм
плагин пули: ниндзя-форм
уязвимые версии: < 3.4.24.2
CVE идентификатор: уязвимость CVE-2020-12462
CVSS оценка: 8.8 (высокий)
CVSS вектор: CVSS:3.0/кабель AV:N/переменного тока:л/пр-во:N/интерфейс:Р/С:П/С:Н/И:Н/А:ч
Полная исправленная версия: 3.4.24.2
Плагин Ninja Forms имеет режим” legacy", который позволяет пользователям вернуть свой стиль и функции к тем, которые были в финальной версии плагина 2.9.версия X. В рамках этой функции он добавляет несколько функций AJAX, которые, по-видимому, предназначены для импорта форм и полей между “устаревшим” режимом и режимом по умолчанию. Хотя все эти функции использовали проверку возможностей, две из них не смогли проверить nonces, которые используются для проверки того, что запрос был преднамеренно отправлен законным пользователем. В частности, одна функция ninja_forms_ajax_import_form
позволяла импортировать формы, содержащие Пользовательский HTML:
25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | add_action( 'wp_ajax_ninja_forms_ajax_import_form' , 'ninja_forms_ajax_import_form' ); function ninja_forms_ajax_import_form(){ if ( ! current_user_can( apply_filters( 'ninja_forms_admin_upgrade_import_form_capabilities' , 'manage_options' ) ) ) return ; $import = stripslashes ( $_POST [ 'import' ] ); $form_id = ( isset( $_POST [ 'formID' ] ) ) ? absint( $_POST [ 'formID' ] ) : '' ; WPN_Helper::delete_nf_cache( $form_id ); // Bust the cache. Ninja_Forms()->form()->import_form( $import , TRUE, $form_id , TRUE ); if ( isset( $_POST [ 'flagged' ] ) && $_POST [ 'flagged' ] ){ $form = Ninja_Forms()->form( $form_id )->get(); $form ->update_setting( 'lock' , TRUE ); $form ->save(); } echo json_encode( array ( 'export' => WPN_Helper::esc_html( $_POST [ 'import' ]), 'import' => $import ) ); wp_die(); } |
Таким образом, если злоумышленник смог обманом заставить администратора перейти по созданной ссылке, он мог подделать запрос, используя сеанс этого администратора, и импортировать форму, содержащую вредоносный JavaScript, на сайт. Что еще хуже, можно было заменить любую существующую форму на сайте одной из этих импортированных формformID
$_POST
, установив параметр в идентификатор существующей формы.
В зависимости от того, где JavaScript был помещен в импортированную форму, он мог выполняться в браузере жертвы всякий раз, когда она посещала страницу, содержащую форму, всякий раз, когда администратор посещал страницу импорта/экспорта плагина, или всякий раз, когда администратор пытался отредактировать любое из полей формы. Как это обычно бывает при атаках с использованием межсайтовых сценариев (XSS), вредоносный сценарий, выполняемый в браузере администратора, может быть использован для добавления новых учетных записей администратора, что приведет к полному захвату сайта, в то время как вредоносный сценарий, выполняемый в браузере посетителя, может быть использован для перенаправления этого посетителя на вредоносный сайт.
Политика раскрытия уязвимостей очень важна
Одна из причин, по которой этот плагин был исправлен так быстро, заключалась в том, что команда плагина поддерживает ответственную политику раскрытия информации о безопасности, часто называемую политикой раскрытия уязвимостей. Это позволило нам связаться с ними напрямую с нашим полным раскрытием, а не тратить дни, пытаясь найти или проверить соответствующий контактный канал. Хотя в прошлом мы иногда видели Плагины, исправленные менее чем за 24 часа, такие ответы являются исключительными и указывают на серьезную приверженность безопасности.
Если вы несете ответственность за какой-либо программный продукт или услугу, наличие политики раскрытия уязвимостей (VDP) не только повышает ваши шансы быть предупрежденным о серьезных проблемах безопасности, но и позволяет вам установить ожидания для вашей реакции. Самое главное, это снижает риск того, что уязвимости в ваших продуктах будут преждевременно или безответственно раскрыты и атакованы плохими участниками, прежде чем у вас появится шанс исправить их. По этим причинам мы настоятельно рекомендуем внедрить VDP для повышения не только эффективности вашего реагирования на конкретные недостатки, но и общей безопасности вашего продукта.
Временная шкала
27 апреля 2020 года 19: 00 UTC-наша команда по анализу угроз обнаруживает и анализирует уязвимость и проверяет, что наши существующие правила брандмауэра обеспечивают достаточную защиту от XSS.
27 апреля 2020 года 19: 24 UTC - мы предоставляем полную информацию разработчику плагина в соответствии с их ответственной политикой раскрытия информации о безопасности.
27 апреля 2020 года 20: 27 UTC-мы получаем ответ, что патч должен быть доступен на следующий день.
28 апреля 2020 года 19: 00 UTC-выпущена исправленная версия плагина.