
Набор инструментов для обнаружения, проверки и реагирования на инциденты для CVE-2026-85097: удалённая оценка Bricksforge, поиск IOC в журналах, аудит имплантов в файловой системе, а также правила Sigma и WAF.
Неаутентифицированная загрузка произвольных файлов → RCE в плагине Bricksforge для WordPress
Инструментарий для обнаружения, проверки и реагирования на инциденты для CVE-2026-85097 — CVSS 10.0
неаутентифицированной загрузки произвольных файлов в плагине Bricksforge
для WordPress, которая активно эксплуатируется в реальных атаках.
Один скрипт, три режима: удалённая оценка цели, поиск следов эксплуатации в исторических логах и аудит корневой директории веб-сервера на наличие внедрённых имплантов.
____ _ _ _ __ ___ _ _
| __ ) _ __(_) | _| | __/ _| ___ _ __ __ _ / _ \ ___| | _| | ___ _ __
| _ \| '__| | |/ / |/ / |_ / _ \| '__/ _` | | | / __| |/ / |/ _ \| '_ \
| |_) | | | | <| <| _| (_) | | | (_| | |_| \__ \ <| | (_) | | | |
|____/|_| |_|_|\_\_|\_\_| \___/|_| \__, |\___/|___/_|\_\_|\___/|_| |_|
|___/
CVE-2026-85097 | Unauthenticated Arbitrary File Upload -> RCE
CVSS 10.0 CRITICAL | Bricksforge <= 3.1.8.9 | Fixed 3.1.8.10
| Поле | Значение |
|---|---|
| CVE | CVE-2026-85097 |
| Продукт | Bricksforge (плагин WordPress, дополнение для Bricks Builder) |
| Тип | Неаутентифицированная загрузка произвольных файлов → удалённое выполнение кода |
| CWE | CWE-434: Неограниченная загрузка файлов опасного типа |
| CVSS | 10.0 КРИТИЧЕСКИЙ: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H (вектор выведен, см. Ограничения) |
| Аутентификация | Отсутствует |
| Затронуто | <= 3.1.8.9 |
| Исправлено | 3.1.8.10 (линейка релизов вендора, упомянутая в прессе: 4.0.1) |
| Эксплуатация | АКТИВНА В ДИКОЙ ПРИРОДЕ |
| Первое наблюдение | 2026-10-07 21:47:17 UTC |
| Установки | ~6 000 |
| Наблюдаемые исходные IP | 63 уникальных (топ-6 ≈ 46% запросов) |
| Основная конечная точка | POST /wp-json/bricksforge/v1/form_submit |
| Резервная конечная точка | POST /wp-admin/admin-ajax.php (action=bricksforge_form_submit) |
| Именование импланта | login_admin_*.php |
[!CAUTION] Только авторизованное использование. Этот инструмент предназначен для разрешённой оценки безопасности, защитной валидации и реагирования на инциденты. Запуск любого активного теста против системы, которой вы не владеете или на тестирование которой у вас нет письменного разрешения, незаконен в большинстве юрисдикций. См. SAFETY-AND-LEGAL.md.
Bricksforge расширяет Bricks Builder продвинутыми формами,
анимациями и динамическими данными. Его функция Pro Forms принимает загрузку файлов. Плагин
корректно проверяет MIME-тип файла при первой загрузке, но когда форма
впоследствии отправляется, он доверяет метаданным файла, отправленным клиентом, и никогда
не проверяет поле url внутри параметра temporaryFileUploads.
Эта единственная отсутствующая проверка превращает безобидную загрузку изображения в
неаутентифицированное удалённое выполнение кода. Атакующему не нужен ни аккаунт, ни
CSRF-токен, который он не может сгенерировать сам, ни взаимодействие с пользователем.
Patchstack наблюдал эксплуатацию начиная с
2026-10-07 21:47:17 UTC с 63 уникальных исходных IP, охватывающих дата-центры, облачную,
VPN- и резидентную инфраструктуру.
file (серверный путь, который прошёл проверку MIME) и url (назначение, куда плагин
будет записывать) развязаны. Плагин повторно считывает предоставленный клиентом url
в момент отправки и записывает туда подготовленные байты.
{
"temporaryFileUploads": [
{
"field": "form-field-file",
"file": {
"file": "/var/www/example.com/wp-content/uploads/bricksforge/tmp/img_example.gif",
"url": "https://example.com/wp-content/uploads/bricksforge/tmp/img_example.php",
"type": "image/gif"
}
}
]
}
Подпись — это несоответствие: серверный путь оканчивается на .gif, а URL назначения — на .php. В 95% перехваченных запросов серверный путь оканчивался на .gif или .png.
| Файл | Роль |
|---|---|
wp-content/plugins/bricksforge/includes/elements/pro-forms/actions/init.php | Точка инъекции: предоставляемые клиентом метаданные (включая url) объединяются с контекстом действия формы без валидации. |
wp-content/plugins/bricksforge/includes/elements/pro-forms/actions/base.php | Сток (sink): доверенные метаданные управляют финальной записью файла, поэтому атакующий контролирует имя файла назначения на диске и его расширение. |
| # | Шаг | Наблюдаемое |
|---|---|---|
| 1 | Получить nonce без аутентификации: POST /wp-admin/admin-ajax.php с action=bricksforge_regenerate_nonce. Аутентификация не требуется; возвращается валидный nonce. | Запрос к admin-ajax.php с action=bricksforge_regenerate_nonce |
| 2 | Загрузить полиглот GIF/PHP: валидное изображение, которое также несёт PHP-код. Проверка MIME выполняется здесь, поэтому файл проходит её и попадает в wp-content/uploads/bricksforge/tmp/. | Multipart-загрузка с записью в /wp-content/uploads/bricksforge/tmp/ |
| 3 | Отправить форму с несоответствующими метаданными: file указывает на прошедший валидацию .gif, url оканчивается на .php. | Запрос form_submit, содержащий temporaryFileUploads |
| 4 | Плагин записывает содержимое в PHP-расположение → RCE. Запрос этого URL выполняет внедрённый код: веб-шеллы, изменение контента, кража данных, закрепление. | HTTP GET к только что созданному .php-файлу в каталоге uploads |
Атакующие активно ищут способы обойти фильтрацию расширений. Четыре семейства:
| Семейство | Образцы | Намерение |
|---|---|---|
| Альтернативные PHP-расширения | .php .php5 .php7 .php8 .phtml .pht .phtm .phps | Достичь PHP-обработчика под именем, которое фильтр не блокирует |
| Манипуляция регистром | .PHP .Php .pHp .PHTML | Обойти чёрные списки с учётом регистра; Windows/некоторые конфигурации Apache разрешают имена без учёта регистра |
| Кодированные расширения | %2ephp .%70hp .%2570%2568%2570 | Протащить расширение мимо фильтра, проверяющего до URL-декодирования |
| Изменённые метаданные | изменённые/отсутствующие path, name, originalFilename, url | Определить, какие поля плагин действительно валидирует |
Этот инструмент обнаруживает все 18 вариантов первых трёх семейств (см. Результаты валидации).