FlawOpen

flawopen.com/Incidents/wordpress-stored-xss-admin-session-campaign-october-2026

● WordPress plugin installations (campaign observations attributed to Patchstack) · CVE-2026-93836 · 2026-10-04 · CVSS 7.2 · Высокий
Исследования · FlawOpen

Кампания Stored XSS в WordPress: два плагина и цепочка закрепления

Patchstack наблюдала попытки использовать один и тот же постэксплуатационный имплант через две уязвимости Stored XSS в WordPress. Обновите оба плагина и проверьте систему на закрепление: исправление не очищает уже скомпрометированный сайт.[1], [2], [3], [4], [5]

💡 Простыми словами (ELI5)

Представьте две общедоступные коробки для предложений, записки из которых позже открывает администратор сайта. Если сайт сохраняет записку как исполняемую разметку, а не как текст, при открытии она может действовать с полномочиями браузера администратора. Согласно отчёту, две отдельные уязвимости плагинов стали точками входа, после чего злоумышленники пытались сохранить доступ даже после обновления.[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]

Связи со стандартами

Хронология инцидента

2026-09-21 / 2026-09-22

В записях CNA Wordfence указана дата публикации 21 сентября, тогда как Patchstack сообщает, что уязвимости были публично раскрыты 22 сентября. Источники расходятся на один день; записи CVE указывают затронутые версии плагинов до 8.6.6 и 3.15.3 соответственно.[2], [3], [8], [9], [1]

2026-10-04 — 2026-10-05

Patchstack сообщает о попытках с одной и той же постэксплуатационной стадией: сначала через WPC Product Bundles, затем через Ninja Forms. Анализ опубликован Patchstack 6 октября.[1]

Пошаговый сценарий атаки

Шаг 1

Две отдельные точки входа Stored XSS

По данным Patchstack, кампания использовала CVE-2026-93836 в WPC Product Bundles и CVE-2026-94504 в Ninja Forms. Это отдельные уязвимости, связанные общей последующей активностью.[1], [2], [3], [8], [9]

Шаг 2

Сохранённые данные открывает администратор

Отправленные данные сохраняются и позднее отображаются в административном представлении заказа или формы. При небезопасном выводе они исполняются как разметка, а посещение администратора предоставляет контекст браузера.[1], [8], [9], [10], [11], [12], [13], [14]

Шаг 3

Скрипт наследует контекст сайта

Код в источнике WordPress может отправлять запросы к тому же источнику с существующим сеансом администратора. HttpOnly защищает конфиденциальность cookie, но не мешает коду, уже работающему в этом источнике, использовать сеанс.[1], [17], [18]

Шаг 4

Последующий доступ может пережить уязвимость

Patchstack сообщает о попытках установить плагин и создать дополнительное закрепление. Это наблюдения кампании, а не подтверждённый исход для каждой цели; обновление закрывает уязвимую точку входа, но не отменяет уже внесённые изменения.[1], [4], [5]

Исходный код: Уязвимый 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>";
}

Чек-лист по защите системы для инженеров

Источники