1. Что это за уязвимость и чем она опасна
Плагин «Database for Contact Form 7, WPforms, Elementor forms» решает одну задачу: сохраняет в базу данных WordPress заявки, которые приходят через формы других плагинов. У него около 60 тысяч активных установок. В версиях до 1.5.1 включительно он недостаточно проверяет путь к файлу перед его удалением — и из-за этого посторонний человек может добиться удаления произвольного файла на сервере.
Опасность не в самом удалении, а в том, какой файл можно удалить. Если это wp-config.php — файл с паролем к базе и секретными ключами, — WordPress теряет настройки и при следующем открытии предлагает пройти установку заново. Злоумышленник, который и вызвал удаление, проходит эту установку первым, подключает сайт к своей базе и получает полный контроль. Так удаление одного файла оборачивается захватом всего сайта.
| Идентификатор | CVE-2026-9843 |
| Плагин | Database for Contact Form 7, WPforms, Elementor forms (contact-form-entries) |
| Уязвимые версии | 1.5.1 и все, что ниже |
| Исправлено в | 1.5.2 (ставьте последнюю — 1.5.5) |
| Тип | Выход за пределы каталога (path traversal) → удаление произвольного файла |
| Оценка CVSS 3.1 | 8.1 из 10 (высокая) |
| Нужен ли вход на сайт | Нет — заявку отправляет неавторизованный посетитель |
| Условие срабатывания | Администратор открывает или сохраняет отравленную заявку |
Уязвимость опубликована 20 июня 2026 года, её зарегистрировала команда Wordfence по заявке исследователя под псевдонимом daroo. К моменту публикации исправленная версия 1.5.2 уже вышла, так что обновление доступно всем.
2. Касается ли это вас: как найти плагин и версию
Проверка сводится к одному вопросу: установлен ли плагин contact-form-entries и какая у него версия. Версия 1.5.1 или ниже — вы под угрозой. Ниже три способа; выберите тот, что вам доступен. Важная деталь: название плагина в разных местах выглядит по-разному — в админке это «Contact Form Entries», в каталоге WordPress.org — длинное «Database for Contact Form 7, WPforms, Elementor forms», а в файлах и командах — короткое contact-form-entries. Это один и тот же плагин.
Способ 1. Через админку (подойдёт всем)
Войдите в панель WordPress, откройте раздел «Плагины» и найдите в списке «Contact Form Entries». Номер версии написан прямо под названием плагина. Если рядом WordPress показывает «Доступна новая версия» — значит, установленная устарела, и это само по себе повод обновиться. Если плагина в списке нет, он у вас не установлен и эта уязвимость вас не касается.
Способ 2. Через WP-CLI (точно и удобно для многих сайтов)
Если у вас есть доступ по SSH и установлен WP-CLI, зайдите в каталог сайта (туда, где лежит wp-config.php) и спросите версию напрямую:
wp plugin get contact-form-entries --field=versionУдобнее сразу увидеть и состояние, и наличие обновления одной строкой:
wp plugin list --fields=name,status,version,updateЕсли сайтов на сервере много и каждый лежит в своём каталоге, пройдитесь по ним циклом — так вы за один проход увидите версию плагина на всех сайтах сразу:
for d in /var/www/*/; do
if [ -f "$d/wp-config.php" ]; then
echo "$d"
wp --path="$d" --allow-root plugin get contact-form-entries --field=version 2>/dev/null || echo " плагин не установлен"
fi
doneСпособ 3. Прямо в файлах (когда ни админки, ни WP-CLI нет)
Версию плагина можно прочитать прямо на диске — она записана в заголовке его главного файла. Сначала найдите, установлен ли плагин вообще и где именно:
find /var/www -type d -path '*/plugins/contact-form-entries' 2>/dev/nullДля каждого найденного пути посмотрите строку Version в главном файле плагина — подставьте путь из предыдущей команды:
grep -m1 -i 'version:' /var/www/site/wp-content/plugins/contact-form-entries/contact-form-entries.phpЦифры в ответе и есть установленная версия. Сравните с 1.5.1: если ваша равна ей или меньше — переходите к разделу 4 и закрывайте дыру.
3. Как это работает — коротко, чтобы реагировать правильно
Разбирать атаку по шагам здесь незачем, но общий механизм знать полезно: от него зависит, какие действия помогают, а какие бесполезны.
- Заявку отправляет кто угодно. Форма на сайте открыта для всех, вход не нужен. В поле, куда обычно прикладывают файл, злоумышленник подставляет не файл, а путь с переходом вверх по каталогам — указатель на чужой файл за пределами папки загрузок. Плагин сохраняет это значение в базу как обычную заявку.
- Удаление происходит при участии администратора. Файл стирается не в момент отправки формы, а когда администратор открывает или сохраняет эту заявку в панели. Поэтому атака и рассчитана на то, что вы рано или поздно заглянете в заявки.
- Цель — удалить нужный файл. Удаление
wp-config.phpпереводит сайт в режим установки и открывает дорогу к захвату; но вред можно нанести и стиранием других файлов.
Отсюда два практических вывода. Первый: пока плагин активен и не обновлён, не открывайте подозрительные заявки — отравленная могла быть сохранена заранее. Второй: исправленная версия добавляет строгую проверку пути перед удалением, поэтому обновление снимает угрозу полностью, а не маскирует её.
4. Быстрое решение: обновить плагин
Главное и достаточное действие — обновить плагин до версии 1.5.2 или новее. Дыру закрывает уже 1.5.2, но ставить стоит последнюю доступную версию: в выпусках после неё автор закрыл ещё несколько проблем. На момент этой статьи последняя версия — 1.5.5.
Через админку
Откройте раздел «Плагины», найдите «Contact Form Entries» и нажмите «Обновить» на его строке. Если кнопки обновления нет, а версия старая, откройте Консоль → Обновления и запустите проверку обновлений вручную — WordPress подтянет свежий список и покажет плагин там.
Через WP-CLI
На одном сайте — из его каталога:
wp plugin update contact-form-entriesСразу на всех сайтах сервера — тем же циклом, что и при проверке:
for d in /var/www/*/; do
if [ -f "$d/wp-config.php" ]; then
wp --path="$d" --allow-root plugin update contact-form-entries 2>/dev/null
fi
doneПроверить, что обновление встало
После обновления убедитесь, что версия действительно сменилась — той же командой, что и при проверке:
wp plugin get contact-form-entries --field=versionВ админке то же самое видно на странице «Плагины»: номер версии под названием обновится, а надпись о доступном обновлении исчезнет. Если число 1.5.2 или больше — дыра закрыта.
5. Если обновиться нельзя: деактивация и временная защита
Иногда обновить плагин сразу не выходит: сайт на старой версии WordPress, обновление ломает совместимость, подрядчик недоступен. В этом случае есть надёжная промежуточная мера — деактивировать плагин. Деактивированный плагин не подключает свой код, поэтому ни приём новых заявок, ни удаление файлов не выполняются. Уязвимость исчезает в тот же момент.
В админке это кнопка «Деактивировать» на строке плагина. Через WP-CLI — одна команда:
wp plugin deactivate contact-form-entriesУдалять плагин не нужно: деактивации достаточно, а сохранённые заявки останутся на месте. Когда появится возможность обновиться, включите плагин обратно уже на безопасной версии.
Если нельзя и деактивировать
Бывает, что плагин нужен прямо сейчас и выключить его тоже нельзя. Тогда до обновления держитесь двух правил. Во-первых, не открывайте и не сохраняйте в админке новые заявки, в происхождении которых не уверены, — именно это действие запускает удаление. Во-вторых, если перед сайтом стоит файрвол приложений (например, модуль защиты у хостинга или плагин-брандмауэр), включите в нём блокировку запросов с последовательностью ../ в значениях полей. Это не замена обновлению, а способ продержаться до него.
6. Проверить, не сработало ли уже
Закрыв дыру, стоит убедиться, что ею не успели воспользоваться. Публичных сообщений о массовой эксплуатации на момент статьи нет, но проверка занимает минуты и снимает вопрос.
Самое важное: на месте ли ключевые файлы
Главный признак успешной атаки — пропавший wp-config.php. Если сайт открывается нормально, а не предлагает пройти установку WordPress заново, этот файл на месте. Для надёжности проверьте его наличие напрямую (подставьте каталог своего сайта):
ls -la /var/www/site/wp-config.phpПоискать заявки-ловушки в базе
Подделанное значение с переходом по каталогам сохраняется в таблице заявок плагина. Её можно просмотреть безопасным запросом только на чтение — он ничего не меняет, лишь показывает подозрительные строки:
wp db query "SELECT lead_id, name, value FROM wp_vxcf_leads_detail WHERE value LIKE '%../%';"Пустой ответ — в таком виде следов подделки не нашлось. Если строки нашлись и в поле value видны переходы ../ в пути к файлу, это заявка-ловушка: не открывайте её в админке, пока не обновили плагин, а после обновления удалите такие заявки через панель. На безопасной версии они уже не причинят вреда.
Если wp-config.php всё-таки удалён
Не проходите установку WordPress поверх рабочего сайта — так можно затереть данные и отдать сайт тому, кто и затеял атаку. Порядок другой: восстановите wp-config.php из резервной копии, затем на всякий случай смените пароль пользователя базы данных и обновите соль-ключи (секции AUTH_KEY и подобные) — их генерирует официальный сервис api.wordpress.org/secret-key/1.1/salt/. После этого обновите сам плагин, иначе дыра останется открытой.
7. Чтобы это не повторилось
Уязвимость в плагине — не редкость: это один из главных путей, которыми ломают сайты на WordPress. Отдельно взятую дыру вы закрыли, но защищает от следующей не разовое действие, а привычка.
- Включите автообновления плагинов. На странице «Плагины» у каждого есть ссылка «Включить автообновления». Для критичного по безопасности плагина форм это разумный выбор: исправление приедет само, не дожидаясь, пока вы о нём узнаете.
- Держите меньше плагинов. Каждый плагин — это чужой код с правами на вашем сайте. Плагины, которыми вы не пользуетесь, не деактивируйте, а удаляйте: даже выключенный плагин остаётся файлами на диске и может быть уязвим.
- Делайте бэкапы и проверяйте их. Эта история — наглядный довод: удаление одного файла может стоить всего сайта, а резервная копия возвращает его за минуты. Копия, которую ни разу не восстанавливали, не считается рабочей, пока вы это не проверили.
Базовая защита самого сервера — SSH-ключи, файрвол, автоматическая блокировка ботов — разобрана в статье про безопасность VPS, а установка и обслуживание WordPress на своём сервере — в статье про WordPress на VPS. Про резервные копии, которые снимаются сами и хранятся отдельно от сервера, — разбор бэкапов на restic и rclone.