Коротко: CVE-2026-19513 в Gravity Forms ≤ 3.0.2 позволяет неавторизованному атакующему загрузить файл-полиглот, одновременно являющийся корректным PNG или PDF и PHP-скриптом, под произвольным именем. На серверах с NGINX без поддержки .htaccess файл выполняется как PHP — это ведёт к удалённому выполнению кода. Исправлено в Gravity Forms 3.0.3, выпущенном 20 августа 2026 года.
Что произошло: CVE-2026-19513
2 сентября 2026 года исследователи из Wordfence Argus опубликовали технические детали уязвимости CVE-2026-19513 в популярном плагине форм для WordPress — Gravity Forms. Уязвимость получила оценку CVSS 8.1 (High) и затрагивает все версии плагина до 3.0.2 включительно.
Gravity Forms — один из наиболее распространённых плагинов для создания форм на WordPress. Уязвимость кроется в обработке многофайловых загрузок: злоумышленник может загрузить файл с произвольным именем — в том числе с расширением .php или .html — в директорию временных файлов плагина без какой-либо авторизации.
Уязвимость активируется только при наличии на сайте публичной формы с полем «Загрузка файлов» в режиме множественной загрузки (Multiple Files). Если таких форм нет, риск минимален.
Уязвимость была исправлена в версии 3.0.3, выпущенной 20 августа 2026 года. Примечательно, что в официальном changelog Gravity Forms обновление значилось лишь как «Added security enhancements» без указания критичности — на это обратили внимание специалисты, изучающие практику ответственного разглашения.
Что такое файл-полиглот PNG/PDF
Файл-полиглот — это файл, одновременно удовлетворяющий спецификациям двух или более форматов. Такой файл проходит проверки обоих форматов и может быть обработан как один формат в одной среде и как другой — в другой.
Для атаки через Gravity Forms используется PNG/PDF-полиглот: файл, который:
- начинается с корректной PNG-сигнатуры (
\x89PNG\r\n\x1a\n), что позволяет пройти валидацию изображения; - содержит встроенный PHP-код внутри своей структуры;
- при необходимости может также удовлетворять требованиям формата PDF.
Форматы PNG и PDF имеют особую структуру, допускающую вложение произвольных данных в отдельные блоки или в конец файла. Именно это свойство исторически эксплуатируется при создании полиглотов — файлов, которые ведут себя по-разному в зависимости от того, чем их открывают. Аналогичный подход использовался в кампании TerminalFix для скрытия малвари в PNG-пикселях.
Валидатор изображений видит корректный PNG и пропускает файл. Интерпретатор PHP при исполнении видит PHP-код и выполняет его. Антивирус, проверяющий по сигнатурам исполняемых файлов, не обнаруживает PE-заголовок или вредоносную сигнатуру — перед ним картинка.
Как работала уязвимость
Уязвимость заложена в функции GFAsyncUpload::upload(), обрабатывающей загрузку файлов по частям (chunked upload). Согласно CVE-записи, механизм атаки выглядит следующим образом:
- Хэш публичной формы переиспользуется. Gravity Forms выдаёт публичный хэш состояния формы для отслеживания многофайловых загрузок. Этот же хэш атакующий может подставить как хэш продолжения чанка загрузки.
- Имя временного файла передаётся до санации. Плагин принимает имя временного файла, указанное атакующим, ещё до применения фильтров безопасности. Это позволяет задать имя вроде
shell.php. - Полиглот проходит валидацию. Файл с содержимым PNG/PDF-полиглота успешно проходит проверку типа файла, поскольку сигнатура соответствует изображению или документу.
- Файл сохраняется в директорию плагина. В результате PHP-файл оказывается в директории временных загрузок Gravity Forms на сервере.
По данным Patchstack, это уже четвёртая уязвимость произвольной загрузки файлов, зафиксированная для Gravity Forms с ноября 2025 года — паттерн, заслуживающий отдельного внимания при выборе плагинов с функционалом загрузки.
Apache vs NGINX: кому реально угрожает
Практические последствия уязвимости существенно зависят от конфигурации веб-сервера:
Apache с .htaccess
Gravity Forms при установке и активации создаёт файл .htaccess в директории временных загрузок. На серверах Apache и совместимых, поддерживающих этот механизм, директива блокирует исполнение PHP. Остаточный риск — хранимый XSS, если жертва откроет URL загруженного файла.
NGINX без .htaccess
NGINX и ряд других серверов не читают файлы .htaccess. На таких серверах загруженный PHP-файл доступен к исполнению по прямому URL — это приводит к удалённому выполнению кода (RCE) без какой-либо авторизации.
Таким образом, реальная угроза RCE существует прежде всего для сайтов на хостингах или VPS с NGINX, где конфигурация PHP-исполнения для директории загрузок задаётся отдельно. Под угрозой также сайты на управляемом хостинге, где оператор не блокирует исполнение PHP в директориях плагина.
Уязвимость атакует только публичные формы с полем «Файл» в режиме множественной загрузки. Если форма закрыта авторизацией или поле не используется в режиме множественной загрузки, риск значительно снижается.
Как защититься
Основной способ защиты — обновление плагина. Дополнительно стоит проверить конфигурацию сервера.
- Обновите Gravity Forms до версии 3.0.3 или выше. Это единственное полное исправление уязвимости. Сделать это следует немедленно, не ожидая планового обслуживания.
- Проверьте наличие .htaccess в директории загрузок. Убедитесь, что в папке временных загрузок Gravity Forms существует файл
.htaccessс запретом исполнения PHP. Если плагин был нестандартно настроен — файл мог отсутствовать. - Настройте NGINX на запрет PHP в директориях загрузок. Если ваш сервер работает на NGINX, добавьте в конфигурацию блок
location, запрещающий исполнение PHP-файлов в директорияхwp-content/uploads/и директориях плагинов. - Аудит формы: используете ли вы множественную загрузку? Если поле «Загрузка файлов» с режимом Multiple Files не нужно — отключите его. Это сужает поверхность атаки независимо от версии плагина.
- Проверьте директорию временных загрузок. Если сайт работал с уязвимой версией плагина, проверьте директорию временных файлов Gravity Forms на наличие подозрительных
.php-файлов.
Для анализа загружаемых файлов по байтовой сигнатуре без отправки на сервер воспользуйтесь инструментом «Определить формат файла» — он показывает реальный тип файла, в том числе позволяя обнаружить несоответствие расширения и содержимого. Подробнее о том, какие расширения несут риск исполнения кода, — в разделе «Карта опасных расширений».
