flawopen.com/Incidents/wordpress-stored-xss-admin-session-campaign-october-2026
Кампания Stored XSS в WordPress: два плагина и цепочка закрепления
Patchstack наблюдала попытки использовать один и тот же постэксплуатационный имплант через две уязвимости Stored XSS в WordPress. Обновите оба плагина и проверьте систему на закрепление: исправление не очищает уже скомпрометированный сайт.[1], [2], [3], [4], [5]
Представьте две общедоступные коробки для предложений, записки из которых позже открывает администратор сайта. Если сайт сохраняет записку как исполняемую разметку, а не как текст, при открытии она может действовать с полномочиями браузера администратора. Согласно отчёту, две отдельные уязвимости плагинов стали точками входа, после чего злоумышленники пытались сохранить доступ даже после обновления.[1], [8], [9]
Ключевые понятия и термины
Stored XSS- Контролируемый атакующим текст сохраняется и позднее отображается в браузере как исполняемая разметка. Здесь важным контекстом была административная часть WordPress.[2], [3], [8], [9]
Сеанс того же источника- Браузер автоматически отправляет сеанс сайта с запросами к тому же источнику. Уже запущенный на сайте скрипт может выполнять действия через страницу, не читая cookie HttpOnly.[1], [17], [18]
Закрепление- Доступ, который сохраняется после устранения исходной уязвимости, например несанкционированные учётные записи или файлы. Обновление не удаляет такие изменения.[1]
Источник оценки CVSS- В записях Wordfence CNA для каждой CVE указан CVSS 3.1 7,2. В уведомлении Patchstack для WPC Product Bundles указано 7,1; в этой статье используется оценка из записи CVE с указанием источника.[2], [3], [6]
Ссылки на исходный код- В ссылках Wordfence CNA указаны версии файлов WPC Product Bundles и Ninja Forms, относящихся к проверке, хранению и отображению в панели администратора. Это ориентиры для изучения, а не проверенный diff исправления. Пример PHP выше иллюстрирует кодирование вывода и не является восстановленным кодом плагинов.[8], [9], [10], [11], [12], [13], [14], [15], [16]
Связи со стандартами
- Ссылка CWE для слабого места, описанного в этом руководстве: CWE-79
- OWASP Top 10:2025 — A05:2025 Injection
Хронология инцидента
Patchstack сообщает о попытках с одной и той же постэксплуатационной стадией: сначала через WPC Product Bundles, затем через Ninja Forms. Анализ опубликован Patchstack 6 октября.[1]
Пошаговый сценарий атаки
Сохранённые данные открывает администратор
Отправленные данные сохраняются и позднее отображаются в административном представлении заказа или формы. При небезопасном выводе они исполняются как разметка, а посещение администратора предоставляет контекст браузера.[1], [8], [9], [10], [11], [12], [13], [14]
Исходный код: Уязвимый vs Защищённый вариант
Это изменение исходного кода метода Textarea::admin_form_element() в Ninja Forms, а не общий пример. В версии 3.15.3 сохранённый текст отправки напрямую подставлялся в HTML-содержимое textarea; в версии 3.15.4 перед выводом применяется esc_textarea(). Поэтому в этом контексте данные больше не интерпретируются как разметка. Пример описывает только путь Ninja Forms для CVE-2026-94504; это не исправление WPC Product Bundles для CVE-2026-93836. В других HTML-контекстах нужна соответствующая им функция экранирования.[13], [15], [16]
public function admin_form_element( $id, $value )
{
return "<textarea class='widefat' name='fields[$id]'>$value</textarea>";
}public function admin_form_element( $id, $value )
{
return "<textarea class='widefat' name='fields[$id]'>" . esc_textarea( $value ) . "</textarea>";
}Чек-лист по защите системы для инженеров
- ✓Для
CVE-2026-93836обновите WPC Product Bundles как минимум до 8.6.7; при проверке 11 октября 2026 года WordPress.org указывал 8.7.4 как текущую версию. В журнале 8.7.3 также упомянуто усиление защиты от Stored XSS, но оно не связано там с этой CVE; установите текущую версию. ДляCVE-2026-94504обновите Ninja Forms как минимум до 3.15.4; при проверке 11 октября 2026 года WordPress.org указывал 3.15.5 как текущую. В журнале 3.15.5 добавлено отдельное усиление защиты от Stored XSS для отправок поля Paragraph Text (Rich Text), не связанное с исправлением CVE в 3.15.4. Проверьте установленные версии обоих плагинов на всех рабочих сайтах.[2], [3], [4], [5] - ✓Если уязвимая версия была доступна извне, до объявления о восстановлении сравните администраторов в базе данных с панелью и проверьте неожиданные плагины, включая must-use.[1]
- ✓Проверьте веб-журналы, журналы WordPress и хостинга на неожиданные административные действия, установку плагинов и изменения при просмотре заказов или отправленных форм.[1]
- ✓Практическая рекомендация FlawOpen: Удаляйте несанкционированный доступ в рамках проверенного процесса реагирования; после сдерживания смените привилегированные учётные данные и соли аутентификации WordPress, проверьте другие доступные секреты.
- ✓Практическая рекомендация FlawOpen: Сохраните чистую резервную копию и проверьте базу данных, файлы плагинов и работу оформления заказов/форм до возобновления сервиса; само обновление не доказывает отсутствие закрепления.
Источники
- Patchstack — Four ways back in: the WordPress XSS campaign that hides its own admin account (2026-10-06)
- CVE-2026-93836 — CVE record (Wordfence CNA)
- CVE-2026-94504 — CVE record (Wordfence CNA)
- WPC Product Bundles for WooCommerce — WordPress.org changelog
- Ninja Forms — WordPress.org changelog
- Patchstack — WPC Product Bundles advisory
- NCSA Qatar — Cybersecurity advisories (October 7, 2026)
- Wordfence CNA — CVE-2026-93836 vulnerability record
- Wordfence CNA — CVE-2026-94504 vulnerability record
- CVE-2026-93836 — WPC Product Bundles 8.6.5 source pointer: class-woosb.php
- CVE-2026-93836 — WPC Product Bundles 8.6.5 source pointer: class-backend.php
- CVE-2026-94504 — Ninja Forms 3.15.3 source pointer: Submission.php
- CVE-2026-94504 — Ninja Forms 3.15.3 source pointer: Textarea.php
- CVE-2026-94504 — Ninja Forms 3.15.3 source pointer: admin submission template
- Ninja Forms 3.15.3 to 3.15.4 changeset referenced by CVE-2026-94504
- Исправление в коде Ninja Forms 3.15.4 — Textarea::admin_form_element()
- MDN — Политика одного источника