Безопасность · WordPress · Загрузка файлов

CVE-2026-19513: Gravity Forms допускал загрузку PNG/PDF-полиглота как PHP-скрипта

В плагине Gravity Forms для WordPress (версии ≤ 3.0.2) обнаружена уязвимость произвольной загрузки файлов. Неавторизованный атакующий мог загрузить файл-полиглот — одновременно валидный PNG или PDF и исполняемый PHP-скрипт — под выбранным именем в директорию временных файлов плагина.

4 сентября 2026 Редакция Loadfile ~5 мин
PNG- и PDF-файлы с PHP-кодом внутри на фоне серверной комнаты
Содержание
  1. Что произошло: CVE-2026-19513
  2. Что такое файл-полиглот PNG/PDF
  3. Как работала уязвимость
  4. Apache vs NGINX: кому реально угрожает
  5. Как защититься
  6. Источники

Коротко: 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-записи, механизм атаки выглядит следующим образом:

  1. Хэш публичной формы переиспользуется. Gravity Forms выдаёт публичный хэш состояния формы для отслеживания многофайловых загрузок. Этот же хэш атакующий может подставить как хэш продолжения чанка загрузки.
  2. Имя временного файла передаётся до санации. Плагин принимает имя временного файла, указанное атакующим, ещё до применения фильтров безопасности. Это позволяет задать имя вроде shell.php.
  3. Полиглот проходит валидацию. Файл с содержимым PNG/PDF-полиглота успешно проходит проверку типа файла, поскольку сигнатура соответствует изображению или документу.
  4. Файл сохраняется в директорию плагина. В результате 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 в директориях плагина.

Уязвимость атакует только публичные формы с полем «Файл» в режиме множественной загрузки. Если форма закрыта авторизацией или поле не используется в режиме множественной загрузки, риск значительно снижается.

Как защититься

Основной способ защиты — обновление плагина. Дополнительно стоит проверить конфигурацию сервера.

  1. Обновите Gravity Forms до версии 3.0.3 или выше. Это единственное полное исправление уязвимости. Сделать это следует немедленно, не ожидая планового обслуживания.
  2. Проверьте наличие .htaccess в директории загрузок. Убедитесь, что в папке временных загрузок Gravity Forms существует файл .htaccess с запретом исполнения PHP. Если плагин был нестандартно настроен — файл мог отсутствовать.
  3. Настройте NGINX на запрет PHP в директориях загрузок. Если ваш сервер работает на NGINX, добавьте в конфигурацию блок location, запрещающий исполнение PHP-файлов в директориях wp-content/uploads/ и директориях плагинов.
  4. Аудит формы: используете ли вы множественную загрузку? Если поле «Загрузка файлов» с режимом Multiple Files не нужно — отключите его. Это сужает поверхность атаки независимо от версии плагина.
  5. Проверьте директорию временных загрузок. Если сайт работал с уязвимой версией плагина, проверьте директорию временных файлов Gravity Forms на наличие подозрительных .php-файлов.

Для анализа загружаемых файлов по байтовой сигнатуре без отправки на сервер воспользуйтесь инструментом «Определить формат файла» — он показывает реальный тип файла, в том числе позволяя обнаружить несоответствие расширения и содержимого. Подробнее о том, какие расширения несут риск исполнения кода, — в разделе «Карта опасных расширений».

Источники