Обслуживание WordPress Взломали сайт? Плагин безопасности Цены Блог
Главная / Блог / Безопасность сайта
29 сентября, 2026

WPForms и Stripe: как ошибка могла вернуть чужой платеж

В понедельник вы открываете Stripe, а там - полный возврат заказа на 240 €, который вы не делали. Заодно отменена ежемесячная подписка. В заметках к заказу тишина: никто ничего не объясняет.

Это вымышленная ситуация, не сообщение о реальной атаке. Но именно к такому могла привести ошибка WPForms, CVE-2026-74991. В версиях с 1.8.8.2 по 2.0.1.1 человек, знающий нужный Stripe ID платежа, мог через открытую платежную форму запустить полный возврат и отменить подписку. Даже если платеж приняло другое приложение. В 2.0.2 ошибку исправили.

У WPForms больше 5 миллионов активных установок. Нет, это не значит, что под ударом все эти сайты. Важно, как именно у вас подключен Stripe.


Как форма могла вернуть чужой платеж?

Некоторые платежи картой требуют дополнительного подтверждения - например, в банковском приложении. После него форма WPForms отправляется повторно, уже с ID платежа Stripe. Такой ID начинается с pi_.

При повторной отправке WPForms запрашивал платеж у Stripe и сравнивал его сумму с суммой в форме. Суммы не совпали? Проверка от мошенничества возвращала весь платеж, указывала причину «fraudulent» («мошенничество») и сразу отменяла подписку, если платеж был за нее. Посетитель получал сообщение: «Irregular activity detected. Your submission has been declined and payment refunded» - обнаружена подозрительная активность, отправка отклонена, платеж возвращен.

А вот чего не хватало: проверки принадлежности платежа. WPForms не убеждался, что этот ID пришел именно от его формы. Для отправки открытой платежной формы логин не нужен. Можно было подставить ID другого платежа и сумму, которая с ним не совпадает. Платежи, уже записанные самим WPForms, эта проверка пропускала. Поэтому главный вопрос - принимали ли другие приложения платежи через тот же аккаунт Stripe.

Начиная с 2.0.2 WPForms сначала сверяет ID формы, сохраненный у платежа в Stripe. Если платеж не относится к этой форме, отправку отклоняют - без возврата.


Ваш сайт вообще затрагивает эта ошибка?

Откройте WPForms > Settings > Payments. Подключен Stripe? Есть хотя бы одна форма с включенными платежами Stripe? Уязвимый код работал только для таких форм. Если WPForms у вас собирает лишь сообщения через форму обратной связи, эта ошибка не затрагивает ваши платежи.

Но плагин все равно обновите.

Первым делом я бы проверил магазин на WooCommerce, где карты принимает шлюз Stripe, а задатки или пожертвования идут через WPForms на тот же аккаунт. Его могут делить и сервис бронирования, плагин подписок, счета Stripe, Payment Links, другие приложения. С подписками особенно неприятно: у клиента, который каждый месяц платит за курс или услугу, доступ может оборваться сразу после отмены.

Это не история про «открыл страницу и забрал деньги». Злоумышленнику нужен Stripe ID конкретного платежа, а обычно его не публикуют. Оценка CVE-2026-74991 по CVSS - 6,8, то есть средняя; Patchstack пометил проблему как низкоприоритетную. Но речь идет о деньгах, так что я бы обновился сегодня. WPScan планирует опубликовать детали для воспроизведения ошибки 6 октября 2026 года - после этого повторить атаку станет проще. По состоянию на 29 сентября 2026 года публичных сообщений о реальных атаках не было.

Боитесь, что после апдейта сломается прием платежей? Вот как обновлять WordPress без неприятных сюрпризов. Но откладывать исправление на недели не стоит.


Обновите WPForms сейчас

Исправление вышло 22 сентября 2026 года. В тот же день WPScan опубликовал предупреждение. Строчку в списке изменений легко пропустить среди новостей про панель управления и ИИ-чат: «Security hardening for the Stripe payment refund process» - усилена защита возвратов Stripe.

  1. В WordPress откройте Plugins > Installed Plugins («Плагины > Установленные»). Найдите WPForms - бесплатный WPForms Lite или платный WPForms Pro - и посмотрите версию.
  2. Если стоит версия с 1.8.8.2 по 2.0.1.1, обновите до 2.0.2 или новее. Версия 2.0.2.1 вышла 23 сентября 2026 года и на 29 сентября остается актуальной.
  3. Перезагрузите страницу плагинов, убедитесь, что номер изменился, и проведите тестовый платеж через форму.
  4. Включите автообновления WPForms или поручите кому-то проверять его раз в неделю. Не можете обновить сегодня? Временно выключите платежи Stripe в формах WPForms или снимите эти формы с публикации.

На проверку версии уйдет пара минут, на обновление и тест формы - обычно еще 10-20. Длинный список изменений тут плохая замена уведомлениям: проверка уязвимостей поможет заметить CVE в установленном плагине.

Но одного уведомления мало. При обслуживании WordPress кто-то должен поставить апдейт и после него проверить, что форма по-прежнему принимает платежи.


Проверьте Stripe: нет ли чужих возвратов

Начните с 22 сентября 2026 года и загляните дальше назад, если можете. Версия 1.8.8.2 вышла еще в апреле 2024 года. Хорошая отправная точка - день, когда у вас появилась любая затронутая версия. Названия разделов Stripe иногда меняются, так что ищите ближайший аналог.

  • Payments (Transactions): отфильтруйте возвращенные платежи. Ищите полные возвраты, которые никто из команды не делал, особенно с пометкой «Fraudulent». Проверьте заказы WooCommerce, счета и другие платежи вне WPForms.
  • Subscriptions: отфильтруйте отмененные подписки. Не закончилась ли подписка сразу после возврата, о котором клиент не просил?
  • Developers (Events / Logs / Workbench): посмотрите события возврата и отмены подписки за то же время. Какая интеграция или API-запрос их вызвали - подключение WPForms или ваш магазин?
  • Radar > Lists: проверьте стандартные списки блокировки. По информации Stripe, возврат с причиной «fraudulent» добавляет туда отпечаток карты и email клиента. Уберите тех, кого заблокировали по ошибке.
  • WooCommerce: сравните заказы с платежами в Stripe. Возврат рядом с заказом, который все еще отмечен как оплаченный или обрабатываемый, стоит проверить. Сам по себе он ничего не доказывает.

Если платежи принимают сразу несколько инструментов WordPress, пригодится материал про защиту интернет-магазина с оплатой на WordPress. А прямо сейчас начните со списка возвратов - на первую проверку можно выделить минут 20.


Нашли подозрительный возврат? Действуйте по порядку

Сохраните даты, ID платежей, суммы и скриншоты. Сначала обновите WPForms, потом сопоставьте события Stripe с записями форм WPForms за то же время. Один странный возврат еще не доказывает, что сработала именно эта ошибка.

Клиентам, которых это затронуло, объясните ситуацию без тумана. Деньги вернулись на исходную карту, а не тому, кто запустил возврат. Отменить возврат в Stripe нельзя - если оплата все еще нужна, отправьте новую ссылку на платеж. Отмененную подписку Stripe тоже нельзя включить обратно, придется создать новую. Перед повторной оплатой удалите пострадавших клиентов из стандартных списков блокировки Radar. Если возвраты складываются в цепочку, передайте собранные данные поддержке Stripe.


Один Stripe, несколько способов принимать деньги

Когда несколько приложений используют один аккаунт Stripe, слабое место в форме может задеть платежи, принятые совсем в другом месте. Заводить отдельный аккаунт для каждого инструмента маленького магазина - по-моему, перебор. Лучше знать, что подключено к Stripe, и удалять старые подключения, которыми никто уже не пользуется.

Сегодня проверьте версию WPForms. Потом откройте в Stripe список возвращенных платежей. Оценка «средняя» за вас эти две вещи не сделает.