Если вы получили от меня письмо со ссылкой на эту страницу, значит ваш сайт, по всей видимости, использует версию плагина Forminator Forms (плагин WordPress от WPMU DEV, который лежит у вас в файлах по пути /wp-content/plugins/forminator/), попадающую в затронутый диапазон известной проблемы безопасности. На этой странице описано, в чём состоит проблема, как определить, применима ли она вообще к вашему сайту, как проверить свою версию, не будучи введённым в заблуждение, и как обновиться.

Прежде всего, самое важное о данном уведомлении: версия из затронутого диапазона сама по себе ещё не означает, что ваш сайт уязвим. Описанная ниже проблема проявляется только на сайтах, чьи формы содержат поле загрузки файла, а как устроены ваши формы, снаружи увидеть невозможно:

  • Проблема достижима только через форму Forminator, которая содержит поле загрузки файла. Если ни одна из ваших форм не позволяет посетителям загружать файлы, это вас не касается, даже на затронутой версии.
  • Обратите внимание: важно именно наличие поля загрузки, а не то, как оно настроено. Ограничение поля конкретными типами (например, изображениями или PDF) не устраняет эту проблему, поскольку уязвимость обходит это ограничение. Единственное, что выводит вас из затронутого диапазона, это отсутствие в формах поля загрузки файла как такового.

Я могу узнать версию вашего плагина из публичного файла, но не могу увидеть настройки ваших форм, поэтому это уведомление является предупреждением на всякий случай, а не подтверждённой находкой о вашем сайте.

Проблема отслеживается как CVE-2026-15748: это уязвимость в обработке форм плагином, доступная без аутентификации, связанная с загрузкой файлов. Она затрагивает версии с 1.18.1 по 1.56.1 и исправлена в 1.56.2, выпущенной 30 июля 2026 года. Если у вас установлена затронутая версия, обновите Forminator Forms до 1.56.2 или новее (на момент написания актуальный выпуск относится к линейке 1.57.x).

Пару слов о срочности, поскольку это условное уведомление. Если ни у одной из ваших форм нет поля загрузки файла, обновление является обычным плановым обслуживанием. Если же у какой-либо есть, пожалуйста, отнеситесь к обновлению как к приоритетной задаче: при такой настройке уязвимость может позволить посетителю без какой-либо учётной записи сохранить на вашем сервере произвольный файл по своему выбору, который сервер затем может выполнить, что способно привести к полному захвату сайта.

Это уязвимость плагина, а не ядра WordPress. Полностью обновлённый WordPress не защитит вас, если сам плагин Forminator остаётся на затронутой версии.

Это письмо настоящее?

Да. Это добросовестное уведомление в рамках ответственного раскрытия от независимого исследователя безопасности. Я не прошу у вас денег, паролей или доступа к сайту и не пытался в него проникнуть, отправить какую-либо из ваших форм или что-либо на него загрузить.

Я лишь посмотрел общедоступные файлы, которые ваш сайт отдаёт любому посетителю (так же, как публична ваша главная страница), и отметил номер версии, который публикует плагин. Я специально не отправлял никакую форму, не загружал файл и не приближался к обработчику загрузки плагина. Эта проверка никак не затрагивает ваши данные, вашу панель управления или какую-либо закрытую часть сайта (подробнее ниже, в разделе Что я делал и чего не делал).

Если вы хотите убедиться, кто я, контактные данные приведены внизу этой страницы и на странице Обо мне.

Почему это важно

Forminator позволяет создавать контактные формы, викторины, опросы и формы для приёма платежей, и в некоторых из них можно предложить посетителям поле загрузки файла, чтобы они могли прикрепить документ или изображение. Чтобы это оставалось безопасным, плагин должен контролировать, какие файлы он принимает и куда их сохраняет.

В затронутых версиях эти проверки можно было обойти. Специально сформированная отправка формы могла протащить подделанное значение поля через ту часть плагина, которая сохраняет запись, а оттуда дальше, в процедуру сохранения файлов, чей список запрещённых типов файлов можно было обойти особым образом составленным запросом. В результате файл, который плагин должен был отклонить, мог быть записан в вашу директорию загрузок. Там, где сервер затем обрабатывает такой файл как то, что можно выполнить, результатом становится выполнение чужого файла на вашем сайте.

Отсюда следуют два вывода, которые тянут в разные стороны. Первый: это имеет значение только там, где в форме действительно есть поле загрузки файла; сайт, формы которого не собирают файлы, через эту проблему недостижим. Второй: там, где такое поле есть, не требуется ни учётной записи, ни пароля, ни чьего-либо содействия: форма открыта для всех по замыслу. И вот часть, которую легче всего понять неверно: ограничение этого поля значениями «только изображения» или «только PDF» вас не спасает, поскольку уязвимость обходит собственную проверку типа поля. Вопрос просто в том, есть ли поле загрузки файла хоть на одной из ваших форм.

Я описываю это на том уровне, который нужен владельцу сайта, чтобы действовать, и не глубже. Я не публикую подробностей, которые позволили бы кому-то это воспроизвести, и прошу вас не пробовать это ни на своём сайте, ни на чужом. Проверка ваших форм и версии, как описано ниже, даёт всё необходимое, чтобы решить, что делать.

Если в моём письме упоминалась эта проблема, значит версия, о которой сообщает ваш сайт, попадает в затронутый диапазон. Я не проверял, эксплуатируем ли именно ваш сайт, и не могу увидеть, как устроены ваши формы. Всё, что я наблюдал, это версия.

Затронут ли я?

Всё решают два вопроса, в этом порядке.

Первый: есть ли в какой-либо форме поле загрузки файла?

Это решающий вопрос, и ответить на него можете только вы. Проверить свои собственные формы совершенно безопасно, и в этом весь смысл данной страницы.

  1. Войдите в консоль WordPress и откройте в боковом меню пункт Forminator, затем Формы.
  2. Откройте каждую форму и найдите в ней поле Upload (тип поля Forminator для загрузки файлов).
  3. Если поля загрузки нет ни в одной из ваших форм, эта проблема не достигает вашего сайта, даже на затронутой версии, хотя обновиться всё же стоит в рамках обычного планового обслуживания.
  4. Если поле загрузки есть хотя бы в одной форме, проблема касается вас, и обновиться следует незамедлительно. Ограничить поле теми типами файлов, которые вам действительно нужны, разумная практика, но это не устраняет данную проблему: устраняет её именно обновление.

Пожалуйста, не пытайтесь воспроизвести эту проблему ни на своём сайте, ни на чужом; чтобы ответить на вопрос выше, это не требуется.

Второй: какая у вас версия?

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

В панели управления WordPress (главный источник):

  1. В консоли WordPress перейдите в Плагины, затем Установленные плагины.
  2. Найдите Forminator Forms, запись, папка которой называется forminator, и посмотрите версию, указанную под названием.

Из исходного кода страницы (без входа): откройте исходный код страницы вашего сайта, на которой отображается форма Forminator, и найдите один из клиентских файлов плагина строго по следующим путям:

/wp-content/plugins/forminator/build/front/front.multi.min.js?ver=...
/wp-content/plugins/forminator/assets/forminator-ui/js/forminator-form.min.js?ver=...
/wp-content/plugins/forminator/assets/forminator-ui/css/forminator-icons.min.css?ver=...

Число после ?ver= у этих файлов именно в папке forminator и есть собственная версия плагина. Для этого плагина оно в точности соответствует выпуску, поэтому я считаю такую проверку надёжной. Обратите внимание, что эти файлы появляются только на странице, где действительно отображается форма Forminator, поэтому проверяйте страницу с формой (голая главная страница без формы часто ничего не показывает).

Здесь есть две ловушки, которых стоит избегать. Обе приводят к тому, что при небрежной проверке вы получите версию, которая вообще не относится к Forminator:

  • Встроенная библиотека для работы с телефонными номерами. Forminator включает в себя копию сторонней библиотеки intlTelInput, у которой есть собственный номер версии, 4.0.3. В зависимости от вашей версии он привязан либо к файлу assets/css/intlTelInput.min.css, либо к assets/js/library/intlTelInput.min.js, оба внутри папки Forminator. Если вы считаете ?ver=4.0.3 с одного из них, это версия библиотеки, а не Forminator. У Forminator никогда не было выпуска 4.x. Читайте версию только с файлов, перечисленных выше, и считайте любую версию, не начинающуюся с 1., «не версией Forminator».
  • Таблица стилей отдельной формы в папке загрузок. Для каждой опубликованной формы Forminator записывает небольшую таблицу стилей по пути вида /wp-content/uploads/forminator/<нечто>/style-<число>.css?ver=<длинное 10-значное число>. Это длинное число является временной меткой, а не версией. Оно находится в wp-content/uploads/, а не в папке плагина, поэтому его следует полностью игнорировать.

Ещё одно замечание, специфичное для этого плагина: строка Stable tag: во встроенном файле readme.txt здесь не является надёжной, поскольку может отставать от фактического выпуска (обе сборки, 1.56.1 и 1.56.2, сообщают 1.56.0), так что, в отличие от некоторых других плагинов, этот файл не подскажет вам, какая из этих двух версий у вас установлена. Доверять стоит экрану в панели управления и значению ?ver= у файлов выше.

Затем примените это правило, учитывая, что версии сравниваются численно, а не по алфавиту:

  • С 1.18.1 по 1.56.1: потенциально затронуто, в зависимости от ответа на вопрос о поле загрузки выше. Обновляйтесь сейчас.
  • 1.56.2 или новее: уже исправлено в части этой проблемы. Лучше всего установить самую свежую доступную версию (на момент написания это линейка 1.57.x).
  • Старше 1.18.1: этой проблемой не затронуто. Описанная выше конкретная уязвимость появилась начиная с 1.18.1. Тем не менее выпуск такой давности сильно отстал по всем остальным параметрам, и обновиться стоит и по общим соображениям.

Если ни одна из проверок выше не дала читаемой версии, в этом нет ничего необычного: плагины кеширования или оптимизации нередко удаляют значение ?ver=, а файлы появляются только там, где отображается форма. Экран в панели управления из первого способа даёт ответ всегда.

Как обновиться

Плагин бесплатный, по-прежнему опубликован и активно поддерживается, так что исправление сводится к обычному обновлению. Самый безопасный путь: обновиться средствами самого WordPress, предварительно сделав резервную копию.

  1. Сделайте резервную копию сайта (файлы и базу данных), прежде чем что-либо менять. Большинство хостинг-провайдеров предлагают резервное копирование в один клик, либо воспользуйтесь плагином резервного копирования для WordPress.
  2. В панели управления WordPress перейдите в Консоль, затем Обновления, либо в Плагины, затем Установленные плагины. Если обновление Forminator есть в списке, установите его отсюда.
  3. Если вам удобнее командная строка, WP-CLI делает то же самое: wp plugin update forminator (команда использует имя папки).
  4. Если обновление не появляется, последний выпуск можно взять напрямую со страницы плагина в каталоге WordPress.org, Forminator Forms, и обновиться через Плагины, затем Добавить плагин, затем Загрузить плагин.
  5. После обновления подтвердите новый номер версии (1.56.2 или новее) описанными выше способами и проверьте, что ваши формы и загрузка файлов на них по-прежнему работают как обычно.

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

После обновления

Обновление до 1.56.2 или новее закрывает проблему, и для большинства сайтов на этом всё заканчивается. Эта страница является предупреждением на всякий случай, а не отчётом об инциденте: у меня нет возможности узнать, произошло ли что-то на вашем сайте, и я не проверял.

Стоит рассмотреть один дополнительный шаг, и он зависит от того же вопроса о поле загрузки. Если на вашем сайте была форма с полем загрузки файла, пока сайт работал на затронутой версии, то по крайней мере теоретически файл мог быть сохранён на вашем сервере. Обновление закрывает уязвимость, но не удаляет то, что уже могло быть сохранено, поэтому в таком случае разумны несколько обычных мер предосторожности:

  • Просмотрите каталог загрузок (обычно находится в wp-content/uploads/, включая поддиректорию wp-content/uploads/forminator/) на предмет файлов, которые вы не узнаёте, особенно таких, что не относятся к документам или изображениям, которые ваши формы должны принимать.
  • Проверьте учётные записи администраторов, недавние входы и все активные сеансы на предмет всего, что вы не можете объяснить.
  • Сбросьте пароли на учётных записях администраторов. Разумным дополнительным шагом будет перегенерировать секретные ключи и «соли» WordPress в wp-config.php (новые значения находятся в одном клике в официальном генераторе секретных ключей, и их замена разово завершает сеансы всех пользователей).

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

Что я делал и чего не делал

Чтобы полностью прояснить, на чём основана проверка за моим письмом: я читал только файлы, которые ваш сайт и так отдаёт каждому посетителю, а именно публичный файл readme.txt плагина, вашу главную страницу и адреса файлов, указанные на этой странице. Я не обращался ни к панели управления WordPress, ни к базе данных, ни к какой-либо закрытой части сайта.

В частности, я ни разу не отправлял ни одну из ваших форм, не загружал файл и не касался обработчика загрузки плагина. Ничего не было отправлено, протестировано или проэксплуатировано. Здесь это важнее, чем на большинстве подобных страниц, потому что загрузка файла и есть то самое действие, которого касается эта проблема, так что «я к этому не прикасался» и составляет всю разницу между раскрытием и вторжением.

Я также намеренно не публикую подробностей, которые помогли бы кому-то воспользоваться этой проблемой. Описание выше останавливается на уровне, нужном владельцу сайта, и я не даю ссылок ни на какой демонстрационный код.

Это наблюдение по версии: ваш сайт сообщает версию из затронутого диапазона. Это не утверждение, что ваш сайт был эксплуатируем на момент проверки. Поскольку проблема зависит от того, есть ли в какой-либо из ваших форм поле загрузки файла, а этого я увидеть не могу, сайт из этого диапазона вполне может быть вообще не уязвим, а также отдельно может быть защищён другими средствами, например межсетевым экраном веб-приложений.

У меня нет вебмастера / я не справляюсь

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

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

Контакты

Evan Harris, исследователь безопасности

Я обращаюсь по таким вопросам исключительно ради того, чтобы помочь операторам защитить свои сайты. Если вы предпочитаете больше не получать от меня писем, просто сообщите, и я это учту.

Источники

Официальные бюллетени и отслеживание

Разработчик / плагин