Уведомление о безопасности Simple Membership
Если вы получили от меня письмо со ссылкой на эту страницу, значит ваш сайт, по всей видимости,
использует версию плагина Simple Membership (плагин WordPress для организации членства от
smp7 / wp.insider, который лежит у вас в файлах по пути
/wp-content/plugins/simple-membership/), попадающую в затронутый диапазон известной проблемы
безопасности. На этой странице описано, в чём состоит проблема, как проверить, какая версия у вас
установлена, как обновиться и какой дальнейший шаг важнее всего после этого.
Проблема отслеживается как CVE-2026-15930: это захват учётной записи администратора без аутентификации через собственную форму регистрации участников плагина. Она затрагивает все выпуски до 4.7.8 и исправлена в 4.7.8. Если у вас установлена версия старше 4.7.8, обновите Simple Membership до 4.7.8 или новее (4.7.9 вышла позже и сохраняет исправление, поэтому тоже подходит).
Хочу прояснить один момент, поскольку он отличается от некоторых других уведомлений, которые я рассылал: более старой безопасной версии не существует. Это не изъян, который был внесён в какой-то момент, а затем исправлен. Он присутствовал в плагине с самого первого опубликованного выпуска и вплоть до 4.7.7, так что довод «мой сайт слишком старый, чтобы быть затронутым» здесь не работает. Незатронутыми являются только версии 4.7.8 и новее.
Это уведомление также не зависит от того, как настроен ваш сайт. Здесь нет настройки, которую
нужно было бы включить: при активации плагин публикует страницу membership-registration со
своей формой регистрации, так что стандартная установка открывает эту форму посетителям, не
вошедшим в систему. Если у вас версия старше 4.7.8, обновление стоит выполнить незамедлительно.
Это уязвимость плагина, а не ядра WordPress. Полностью обновлённый WordPress не защитит вас, если сам плагин Simple Membership остаётся на затронутой версии.
Это письмо настоящее?
Да. Это добросовестное уведомление в рамках ответственного раскрытия от независимого исследователя безопасности. Я не прошу у вас денег, паролей или доступа к сайту и не пытался в него проникнуть, что-либо ему отправить или что-либо эксплуатировать.
Я лишь посмотрел общедоступные файлы, которые ваш сайт отдаёт любому посетителю (так же, как публична ваша главная страница), и отметил номер версии, который публикует плагин. Я специально не отправлял вашу форму регистрации и не посылал ей ничего, и эта проверка никак не затрагивает ваши данные, вашу панель управления или какую-либо закрытую часть сайта (подробнее ниже, в разделе Что я делал и чего не делал).
Если вы хотите убедиться, кто я, контактные данные приведены внизу этой страницы и на странице Обо мне.
Почему это важно
Simple Membership добавляет на сайт WordPress уровни членства и защищённый контент, а также даёт посетителям публичную форму регистрации, чтобы они могли самостоятельно оформить членство. Именно эта форма и служит точкой входа для данной проблемы.
В затронутых версиях плагин не проверял, действительно ли WordPress создал новую учётную запись, прежде чем сохранить отправленные данные. Когда запрошенную регистрацию не удавалось выполнить как создание по-настоящему новой учётной записи, потому что выбранное имя совпадало с уже существующей учётной записью, плагин всё равно продолжал работу и записывал отправленные данные поверх этой уже существующей учётной записи. Практический эффект: адрес электронной почты и пароль, введённые в публичную форму регистрации, становятся данными для входа в учётную запись, которая уже была на сайте. На практике перезаписанной оказывается исходная учётная запись администратора сайта, что передаёт контроль над сайтом тому, кто заполнил форму.
Стоит прямо сказать о двух вещах. Во-первых, вход в систему не требуется, и ничего не должно быть неправильно настроено: достаточно анонимного посетителя и страницы регистрации, которую плагин публикует сам по себе. Во-вторых, результатом становится административный контроль, а не ограниченная утечка данных, поэтому рекомендация здесь такова: обновиться незамедлительно, а не откладывать до следующего планового обслуживания.
Я описываю это на том уровне, который нужен владельцу сайта, чтобы действовать, и не глубже. Я не публикую подробностей, которые позволили бы кому-то это воспроизвести, и прошу вас не пробовать это ни на своём сайте, ни на чужом. Проверка номера вашей версии, как описано ниже, даёт всё необходимое, чтобы решить, что делать.
Если в моём письме упоминалась эта проблема, значит версия, о которой сообщает ваш сайт, старше 4.7.8. Я не проверял, эксплуатируем ли именно ваш сайт; всё, что я наблюдал, это версия.
Затронут ли я?
Всё сводится к одному вопросу: какая у вас установлена версия Simple Membership? Вам не обязательно верить мне на слово, и есть три способа это проверить. В отличие от некоторых плагинов, о которых я пишу, здесь все три заслуживают доверия, поскольку все они сообщают один и тот же базовый номер версии.
В панели управления WordPress (главный источник):
- Войдите в консоль WordPress (обычно по адресу
yourdomain.com/wp-admin). - Перейдите в Плагины, затем Установленные плагины.
- Найдите Simple Membership, запись, папка которой называется
simple-membership, и посмотрите версию, указанную под названием.
Из публичного файла манифеста (без входа в систему): откройте в браузере
yourdomain.com/wp-content/plugins/simple-membership/readme.txt. Строка Stable tag: ближе к
началу файла показывает версию, которую сообщает ваша установка: это тот же публичный файл, который
читал я.
Из исходного кода страницы (без входа в систему): откройте исходный код любой страницы вашего
сайта и найдите таблицу стилей плагина, css/swpm.common.css, по пути
/wp-content/plugins/simple-membership/. Число после ?ver= показывает версию плагина: оно
берётся из собственной константы версии плагина, поэтому для этого плагина такое чтение надёжно, а
не является ложным следом.
Затем примените это правило, учитывая, что версии сравниваются численно, а не по алфавиту, поэтому 4.7.10 будет новее, чем 4.7.8, даже если в виде текста она выглядит меньше:
- Всё, что старше 4.7.8: затронуто. Обновляйтесь сейчас. Нет такой более старой границы, ниже которой более старый выпуск снова становится безопасным.
- 4.7.8 или новее: уже исправлено. Сюда входит и 4.7.9, которая сохраняет исправление.
Замечание о дополнениях Simple Membership. Платные дополнения плагина устанавливаются как
отдельные плагины, в собственных папках, со своими собственными версиями. Номер версии
дополнения ничего не говорит об этой проблеме. Важна версия основного плагина Simple
Membership, папка simple-membership, полученная любым из трёх способов проверки выше.
Как обновиться
Самый безопасный путь: обновиться средствами самого WordPress, предварительно сделав резервную копию:
- Сделайте резервную копию сайта (файлы и базу данных), прежде чем что-либо менять. Большинство хостинг-провайдеров предлагают резервное копирование в один клик, либо воспользуйтесь плагином резервного копирования для WordPress.
- В панели управления WordPress перейдите в Консоль, затем Обновления, либо в Плагины, затем Установленные плагины. Если обновление Simple Membership есть в списке, установите его отсюда.
- Если вам удобнее командная строка, WP-CLI делает то же самое:
wp plugin update simple-membership. - Если обновление не появляется, последний выпуск можно взять напрямую со страницы плагина в каталоге WordPress.org, Simple Membership, и обновиться через Плагины, затем Добавить плагин, затем Загрузить плагин.
- После обновления подтвердите новый номер версии (4.7.8 или новее) описанными выше способами и проверьте, что форма регистрации, уровни членства и защищённый контент по-прежнему работают как обычно.
Если вы используете платные дополнения Simple Membership, обновите их вместе с основным плагином, поскольку их выпуски обычно выпускаются парами.
Раз уж вы этим занялись, стоит убедиться, что ядро WordPress и остальные ваши плагины тоже обновлены, поскольку тот же принцип относится ко всем.
После обновления
Обновление до 4.7.8 или новее закрывает проблему. Есть один дополнительный шаг, который здесь важнее обычных мер предосторожности, и его стоит прочитать, даже если вы уверены, что ничего не произошло.
Обычный совет здесь не сработает. Когда люди проверяют сайт после подобного захвата, они ищут незнакомые новые учётные записи администратора. В данном случае такая проверка ничего не найдёт, потому что новая учётная запись не создаётся. Уже существующая учётная запись перезаписывается, поэтому количество администраторов не меняется и в списке не появляется незнакомое имя. Меняются данные для входа в учётную запись, которую вы уже знаете. Поэтому:
- Проверьте адрес электронной почты на каждой учётной записи администратора. В панели управления WordPress перейдите в Пользователи, отфильтруйте по Администратор и убедитесь, что у каждой учётной записи по-прежнему указан правильный адрес электронной почты. Если адрес электронной почты в учётной записи администратора больше не принадлежит нужному человеку, это и есть признак данной проблемы.
- Сбросьте пароли на учётных записях администраторов, а также на любых других важных учётных записях. Сделайте это, даже если все адреса электронной почты выглядят правильными.
- Разумным дополнительным шагом будет перегенерировать секретные ключи и «соли» WordPress в
wp-config.php(новые значения находятся в одном клике в официальном генераторе секретных ключей; их замена разово завершает сеансы всех пользователей).
Обратите внимание, что обновление закрывает уязвимость, но не отменяет уже полученный доступ. Если кто-то захватил учётную запись до того, как вы обновились, после обновления эти данные для входа по-прежнему остаются у него, именно поэтому и важен сброс паролей, описанный выше. Если вы обнаружите что-то, что вас беспокоит, отнеситесь к этому так же, как к любому другому подозрению на несанкционированный доступ.
У меня нет возможности узнать, произошло ли что-то на самом деле на вашем сайте, и я не проверял. Это уведомление на всякий случай, а не отчёт об инциденте.
Что я делал и чего не делал
Чтобы полностью прояснить, на чём основана проверка за моим письмом: я читал только два публичных
файла, которые ваш сайт и так отдаёт каждому посетителю, а именно публичный файл readme.txt
плагина и вашу главную страницу. Я не обращался ни к панели управления WordPress, ни к базе
данных, ни к какой-либо закрытой части сайта.
В частности, я ни разу не отправлял вашу форму регистрации и не посылал ей ничего. Ничего не было отправлено, протестировано или проэксплуатировано. Здесь это важнее, чем на большинстве подобных страниц, потому что форма регистрации и есть то самое, чего касается эта проблема, так что «я к этому не прикасался» и составляет всю разницу между раскрытием и вторжением.
Я также намеренно не публикую подробностей, которые помогли бы кому-то воспользоваться этой проблемой. Описание выше останавливается на уровне, нужном владельцу сайта, и я не даю ссылок ни на какой демонстрационный код.
Это наблюдение по версии: ваш сайт сообщает версию старше 4.7.8. Сайт из этого диапазона может уже быть защищён другими средствами, например межсетевым экраном веб-приложений или исправлением, перенесённым в более старую ветку. Это уведомление не является утверждением, что ваш сайт был эксплуатируем на момент проверки.
У меня нет вебмастера / я не справляюсь
Если сайтом занимаетесь не вы, перешлите, пожалуйста, эту страницу тому, кто им занимается (вашему веб-разработчику, агентству или хостинг-провайдеру). Шаги выше он узнает сразу.
Если вы ведёте сайт сами и застряли, я с удовольствием бесплатно подскажу вам направление. Напишите по контактам ниже.
Контакты
Evan Harris, исследователь безопасности
- Эл. почта: security@mail.mcpsec.dev
- X: @Evan__Harris
- GitHub: eharris128
- LinkedIn: Evan Harris
Я обращаюсь по таким вопросам исключительно ради того, чтобы помочь операторам защитить свои сайты. Если вы предпочитаете больше не получать от меня писем, просто сообщите, и я это учту.
Источники
Официальные бюллетени и отслеживание
Разработчик / плагин