
Proof-of-concept и технический анализ CVE-2026-12227 — неаутентифицированное LFI в плагине WordPress Visual Composer (<=45.16.0), позволяющее включать файлы и выполнять удалённый код (RCE).
CVE-2026-12227 — критическая (CVSS 9.8) неаутентифицированная уязвимость локального включения файлов (LFI) в плагине Visual Composer Website Builder для WordPress, затрагивающая все версии вплоть до 45.16.0 включительно. Уязвимость находится в параметре vcv-template, который позволяет злоумышленнику включать и исполнять произвольные файлы на сервере. Это может привести к раскрытию конфиденциальных данных, обходу контроля доступа или даже к полному удалённому исполнению кода (RCE), если серверное окружение настроено неправильно.
CVE-2026-12227
9.8/10
Плагин Visual Composer Website Builder (до версии 45.16.0 включительно)
Первопричина: Уязвимость классифицируется как CWE-98: Ненадлежащий контроль имени файла для оператора include/require в PHP-программе (часто называемая PHP Remote File Inclusion). Она проистекает из логической ошибки в файле PageTemplatesController.php, а именно в функции viewPageTemplate(), которая подключается к фильтру template_include WordPress с приоритетом 11 без какой-либо проверки аутентификации.
Основная проблема — это ошибка типа «сначала проверка, потом изменение»:
Проверка (на исходных данных): Сначала код вызывает функцию WordPress validate_file() для исходного, предоставленного пользователем значения параметра vcv-template. Эта функция предназначена для отклонения путей, содержащих буквальные последовательности обхода каталогов, такие как ... На этом этапе вредоносные входные данные theme:.theme:./.theme:./.theme:./wp-links-opml.php не содержат буквальных .., поэтому проходят проверку.
Изменение (после проверки): Сразу после проверки код проверяет, имеет ли тип шаблона значение vc-custom-layout и содержит ли значение строку theme:. Если да, выполняется str_replace('theme:', '', $current['value']), что удаляет все вхождения theme: из значения.
Точка использования: Изменённое значение затем передаётся в locate_template(), которая разрешает путь и включает файл. Поскольку строки theme: были удалены, фрагментированные последовательности обхода объединяются вместе, создавая допустимый путь вида ../../../../wp-links-opml.php, который никогда не проверялся в своей окончательной форме.
Поверхность атаки: Вектор атаки: Сеть (AV:N) — уязвимость достижима напрямую через HTTP/HTTPS.
Аутентификация: Не требуется (PR:N) — это неаутентифицированная уязвимость. Любой удалённый злоумышленник может её активировать без действующей учётной записи.
Взаимодействие с пользователем: Не требуется (UI:N).
Затронутый компонент: Плагин Visual Composer Website Builder для WordPress.
Уязвимый параметр: Параметр vcv-template, используемый совместно с параметром vcv-template-type.
Условие срабатывания: Плагин должен быть установлен и активен на сайте WordPress, а фронтенд-страница должна быть построена с помощью Visual Composer (т.е. должен существовать обычный постоянный URL).
Замечания по эксплуатации: Воздействие: Уязвимость позволяет неаутентифицированному злоумышленнику включать и исполнять произвольные локальные файлы на сервере. Поскольку включённые PHP-файлы исполняются, это может привести к удалённому исполнению кода (RCE), позволяя полностью скомпрометировать конфиденциальность, целостность и доступность сервера.
Техника эксплуатации: Злоумышленники могут эксплуатировать это, создавая вредоносное значение vcv-template, использующее префикс theme: для обхода проверки, как описано в первопричине. Например, запрос может выглядеть так: POST /?vcv-template-type=vc-custom-layout&vcv-template=theme:.theme:./.theme:./.theme:./wp-links-opml.php.
Эскалация до RCE: Хотя сама LFI является критической, достижение RCE часто зависит от серверного окружения. Распространённый метод — включить файл, который уже был загружен на сервер (например, безобидный на вид файл изображения, содержащий встроенный PHP-код), или использовать другие ошибки конфигурации сервера.
Наличие PoC: Несколько публичных эксплойтов-доказательств концепции доступны, включая Python-скрипт и шаблон Nuclei, которые можно использовать для проверки в авторизованной лабораторной среде
[*] Код на Python приведён выше
Версия с патчем: 45.16.1