Чужой email в форме сброса пароля — и admin-аккаунт уже не ваш: CVE-2026-8206 в Kirki
Чужой email в форме сброса пароля — и admin-аккаунт уже не ваш: CVE-2026-8206 в Kirki
Вы устанавливаете тему для WordPress. Тема красивая, рейтинг высокий, 500 000 активных установок. В комплекте — плагин Kirki, framework для кастомизации WordPress Customizer. Kirki не просит внимания: он просто работает, позволяет теме предлагать красивые настройки цветов, шрифтов, отступов. Вы о нём не думаете.
Тем временем атакующий знает username вашего администратора — а это несложно, WordPress по умолчанию показывает его в архивах авторов. Он открывает форму сброса пароля, вводит этот username и подставляет свой email-адрес. WordPress Customizer послушно отправляет reset-ссылку не вам, а ему. Через тридцать секунд у атакующего новый пароль от admin-аккаунта. Сайт чужой.
Именно так работает CVE-2026-8206 — уязвимость в Kirki Freeform Page Builder версий 6.0.0 через 6.0.6. CVSS 9.8 (Critical), CWE-269 — Improper Privilege Management. Никакой аутентификации, никакого брутфорса, никакой сложной цепочки эксплуатации. Один HTTP-запрос с подменённым email — и admin-аккаунт захвачен. Уязвимость обнаружил исследователь CHOIGYEONGMIN и сообщил в Wordfence 15 мая 2026 года.
КАК РАБОТАЕТ УЯЗВИМОСТЬ
Kirki в версии 6.x добавил собственный механизм управления аккаунтами — включая форму сброса пароля для сайтов, которые используют компонент page builder. Форма регистрирует REST API endpoint, который принимает два параметра: username и email. Логика должна была работать так: получить username, найти связанный с ним аккаунт, отправить reset-ссылку на зарегистрированный email этого аккаунта.
Проблема в функции handle_forgot_password() в файле CompLibFormHandler.php. Функция корректно принимает username и находит нужный аккаунт по нему. Но затем для отправки письма она использует не email из базы данных WordPress, а email из параметра запроса — тот, который прислал клиент. Проверки на совпадение нет. Разработчик предполагал, что пользователь введёт свой email, и просто не добавил валидацию.
С точки зрения атакующего это выглядит так. Нужно знать username цели — admin, editor, или любой другой. Дальше — один HTTP-запрос к REST API endpoint сброса пароля:
POST /wp-json/kirki/v1/forgot-password HTTP/1.1
Host: example.com
Content-Type: application/json
{"username": "admin", "email": "[email protected]"}
Kirki принимает запрос, корректно идентифицирует аккаунт по username — и отправляет reset-ссылку не на зарегистрированный email аккаунта, а на [email protected] из тела запроса. WordPress генерирует легитимный reset-токен, привязанный к admin-аккаунту, и письмо уходит на адрес атакующего. Тот переходит по ссылке, устанавливает новый пароль. Атака завершена. Письмо отправляется от имени настоящего сайта — жертва ничего не видит, никаких уведомлений на свой настоящий email не приходит.
Уязвимы сайты, у которых активированы frontend-функции Kirki — в частности, page builder и форма управления аккаунтами. Просто установленного плагина без активных form builder-компонентов недостаточно для эксплуатации. Но большинство сайтов с Kirki именно так его и используют.
ХРОНОЛОГИЯ
CHOIGYEONGMIN сообщил об уязвимости в Wordfence через программу Bug Bounty 4 мая 2026 года и получил вознаграждение в размере $6 436. Wordfence верифицировал уязвимость и немедленно развернул правила файрвола для пользователей премиум-подписки — 9 мая. Три дня спустя, 15 мая, был уведомлён вендор — Themeum. Разработчики сработали быстро: патч был готов через три дня, Kirki 6.0.7 вышла 18 мая 2026 года.
1 июня 2026 года Wordfence опубликовал публичный advisory — к тому моменту патч уже две недели лежал в репозитории. Правила файрвола для бесплатных пользователей Wordfence были запланированы на 8 июня — то есть в промежутке с 1 по 8 июня сайты без премиум-подписки и без обновлённого Kirki были открыты. За первые сутки после публичного раскрытия Wordfence заблокировал более 222 попыток эксплуатации — автоматизированные сканеры отреагировали немедленно.
ПОЧЕМУ ЭТО ВАЖНО
Kirki — не экзотический плагин. Это один из самых популярных WordPress theme frameworks с более чем 500 000 активных установок. Уязвимость затронула ветку 6.0.x — примерно 40% пользователей базы, около 200 000 сайтов. При этом Kirki часто поставляется в комплекте с платными темами: пользователь покупает тему, активирует её, а Kirki устанавливается автоматически как зависимость. Многие администраторы даже не знают, что у них стоит Kirki — они управляют только темой.
Именно эта невидимость делает уязвимость особенно опасной. Администратор следит за обновлениями WordPress-core и своих основных плагинов. Но bundled dependency — плагин который пришёл вместе с темой — часто обновляется только вместе с самой темой. Если тема не выпустила обновление, Kirki может оставаться уязвимым бесконечно долго.
Захват admin-аккаунта — это не просто «плохо». Первое что делает атакующий после входа — устанавливает бэкдор, чтобы сохранить доступ даже если пароль потом сменят. Выглядит это как PHP-файл в папке темы или плагина — несколько строк обфусцированного кода, имя файла ничем не выделяется среди остальных. Найти такой файл вручную без сканера практически невозможно, особенно если в теме несколько сотен файлов. Атакующий может вернуться через неделю, через месяц — доступ у него будет. Именно поэтому после компрометации admin-аккаунта недостаточно сменить пароль: нужен полный аудит файловой системы и базы данных на предмет изменений.
Для интернет-магазина последствия ещё конкретнее: атакующий с правами администратора может подключить сторонний платёжный шлюз, перехватывающий данные карт, или внедрить JavaScript-скиммер прямо в шаблон страницы оформления заказа. Покупатели будут видеть обычный сайт, вводить данные карт — и эти данные уйдут на сервер атакующего. На shared-хостинге с плохой изоляцией компрометация одного сайта открывает доступ к файлам соседних.
Дополнительный риск — user enumeration. Для эксплуатации нужен username цели. WordPress по умолчанию раскрывает usernames через архивы авторов (/?author=1), через REST API (/wp-json/wp/v2/users) и через сообщения об ошибках при входе. Если на сайте не закрыт user enumeration — атакующий получит список всех usernames за секунды, после чего CVE-2026-8206 эксплуатируется против любого из них.
ЧТО ДЕЛАТЬ
Первым делом проверьте, установлен ли Kirki и какая версия используется. В WordPress dashboard это видно в разделе Plugins → Installed Plugins — ищите «Kirki» или «Kirki Freeform Page Builder». Через WP-CLI версия проверяется быстро:
wp plugin get kirki --field=version
Если версия от 6.0.0 до 6.0.6 включительно — обновите немедленно:
wp plugin update kirki
Если Kirki пришёл в комплекте с темой и не отображается как отдельный плагин в dashboard, проверьте папку плагинов напрямую:
ls /var/www/html/wp-content/plugins/ | grep -i kirki
cat /var/www/html/wp-content/plugins/kirki/kirki.php | grep "Version:"
После обновления — аудит администраторских аккаунтов. Если сайт работал на уязвимой версии в период с 1 июня, нужно проверить нет ли новых admin-аккаунтов или аккаунтов с изменёнными email-адресами. Через WP-CLI список администраторов выводится так — команда покажет ID, логин, email и дату регистрации каждого аккаунта с ролью administrator:
wp user list --role=administrator --fields=ID,user_login,user_email,user_registered
Незнакомые аккаунты или аккаунты с подозрительными email-адресами — немедленно удалять. Параллельно проверьте access-логи веб-сервера на POST-запросы к endpoint сброса пароля Kirki. Если такие записи есть — смотрите на IP-адреса и временные метки: несколько запросов с одного IP за короткое время — автоматизированный сканер, запросы с разных IP — endpoint попал в массовые сканеры. Дата первого попадания скажет с какого момента считать возможной компрометацию:
grep "kirki.*forgot-password" /var/log/nginx/access.log
# или для Apache:
grep "kirki.*forgot-password" /var/log/apache2/access.log
Дополнительная мера — закрыть user enumeration. Это не лечит CVE-2026-8206, но убирает один из предварительных шагов атаки. В nginx достаточно одного блока — он вернёт 403 на любой запрос с параметром author:
location ~ ^/\?author= {
return 403;
}
REST API user enumeration закрывается через mu-plugin — фильтр удаляет endpoint /wp/v2/users из реестра REST API целиком:
add_filter('rest_endpoints', function($endpoints) {
if (isset($endpoints['/wp/v2/users'])) {
unset($endpoints['/wp/v2/users']);
}
if (isset($endpoints['/wp/v2/users/(?P<id>[\d]+)'])) {
unset($endpoints['/wp/v2/users/(?P<id>[\d]+)']);
}
return $endpoints;
});
ВЫВОДЫ
CVE-2026-8206 — хороший пример того, как безопасность WordPress-сайта определяется не только основными плагинами, но и тем, что пришло в комплекте с темой. Kirki не просит лишнего внимания, не делает ничего очевидно опасного — он просто добавляет форму сброса пароля с одной незакрытой дырой в логике валидации. Одна функция, один непроверенный параметр — и CVSS 9.8.
Themeum исправил баг за три дня после получения отчёта. Это хорошая скорость реакции. Патч существовал с 18 мая, публичное раскрытие было 1 июня — две недели форы для тех, кто обновился вовремя. Если у вас на сервере WordPress с Kirki — проверьте версию прямо сейчас.
