flawopen.com/Incidents/bricksforge-pro-forms-upload-metadata-october-2026
CVE-2026-85097 в Bricksforge: ошибка загрузки в Pro Forms
CVE-2026-85097 позволяла запросам без аутентификации использовать расхождение между проверенным содержимым временного файла и метаданными назначения, которыми управлял клиент, в Bricksforge Pro Forms. Patchstack сообщает о попытках эксплуатации; обновите плагин и проверьте открытые сайты.[1], [2], [3], [4], [5]
Представьте почтовую комнату: сотрудник проверяет, что в посылке безобидная картинка, а затем позволяет отправителю заменить ярлык перед доставкой в офис, где некоторые ярлыки запускают программы. Bricksforge проверял временную загрузку, но при последующей отправке формы можно было указать другое имя назначения. Защита — сохранять идентификатор и место хранения файла под контролем сервера на всём пути обработки.[3], [2]
Ключевые понятия и термины
Временная загрузка- Файл, временно сохранённый до завершения отправки формы. Проверка на этом этапе не делает доверенными метаданные, позднее переданные клиентом.[2], [3]
CWE-434- Неограниченная загрузка файла опасного типа: система принимает файл, который может быть опасно интерпретирован или исполнен.[1], [2]
Граница доверия метаданным- Точка, в которой приложение определяет, получены ли имя, URL, MIME-тип или путь из надёжной серверной записи либо от недоверенного клиента.[2], [3]
Оценка CVE и эксплуатация- Запись CVE от CNA Wordfence указывает CVSS 3.1 9.8, а обогащение CISA сообщает, что эксплуатация не отмечена. Patchstack указывает 10.0 и сообщает телеметрию с 7 октября 2026 года. Эти сведения имеют разных авторов; ни одно не подтверждает включение в CISA KEV.[1], [2], [3], [4]
Связи со стандартами
- Ссылка CWE для слабого места, описанного в этом руководстве: CWE-434
Сведения о версиях и действия для операторов
| Источник сведений | Что в нём сказано | Действие защиты |
|---|---|---|
| Запись CNA Wordfence / CVE | Описывает неаутентифицированную загрузку произвольных файлов; указанный диапазон затронутых версий заканчивается на 3.1.8.9. | Считайте это областью, указанной CNA, а не доказательством безопасности установленного сайта. |
| Patchstack (8 октября 2026) | Сообщает о попытках эксплуатации, впервые замеченных 7 октября, и указывает 3.1.8.10 как исправленную версию. | Считайте это границей исправления по данным Patchstack; проверьте фактически установленную версию плагина на каждом сайте. |
| Публичный журнал изменений Bricksforge | В версии 4.0.1 указано исправление безопасности загрузки в Pro Forms, но не подтверждена граница 3.1.8.10. | По одному журналу изменений не делайте вывод, что 4.0.1 — первая исправленная версия или что конкретная версия 3.x безопасна. |
| Открытый сайт или подозрение на компрометацию | Источники описывают попытки эксплуатации, но не подтверждают компрометацию каждого атакованного сайта. | Обновите до поддерживаемой версии; проверьте журналы загрузок и веб-сервера, расследуйте появление неожиданных файлов до завершения восстановления. |
Хронология инцидента
В анализе от 8 октября Patchstack описывает несоответствие проверки и наблюдавшиеся попытки, а версию 3.1.8.10 называет исправленной. В журнале Bricksforge отдельно указано исправление безопасности загрузки Pro Forms в версии 4.0.1, но точная исправленная версия ветки 3.x не установлена.[3], [4], [5]
Пошаговый сценарий атаки
Форма передаёт отдельные метаданные
По данным Patchstack, последующая обработка доверяла метаданным temporaryFileUploads от клиента, включая URL, который мог не соответствовать уже проверенному файлу. Ошибка возникла из-за разного уровня доверия к проверенному содержимому и непроверенному назначению.[2], [3]
Исходный код: Уязвимый vs Защищённый вариант
Этот общий пример показывает серверный идентификатор загрузки, поиск по пользователю, повторную проверку типа содержимого, случайные имена и приватное хранение. Это не код Bricksforge и не его реальный патч. В рабочей системе также нужны ограничения размера, безопасные права доступа, атомарные переходы состояния и подходящая выдача файла; затронутые сайты следует обновить до поддерживаемой исправленной версии Bricksforge.[2], [3]
function finalize_upload( array $item, string $stagedPath, string $uploadDir ): string {
// Метаданные клиента задают итоговое имя после предварительной проверки MIME-типа.
$name = basename( (string) parse_url( $item['file']['url'], PHP_URL_PATH ) );
$destination = $uploadDir . DIRECTORY_SEPARATOR . $name;
if ( ! rename( $stagedPath, $destination ) ) {
throw new RuntimeException( 'Could not finalize upload' );
}
return $destination;
}
function finalize_upload( string $uploadId, UploadRegistry $registry, string $privateDir ): string {
// Определяйте владельца и путь по серверной записи, а не по URL клиента.
$upload = $registry->findPendingForCurrentUser( $uploadId );
if ( $upload === null || ! is_file( $upload->path ) ) {
throw new RuntimeException( 'Unknown pending upload' );
}
$types = [ 'image/jpeg' => 'jpg', 'image/png' => 'png' ];
$mime = ( new finfo( FILEINFO_MIME_TYPE ) )->file( $upload->path );
if ( ! isset( $types[ $mime ] ) ) {
throw new RuntimeException( 'Unsupported file type' );
}
$destination = $privateDir . DIRECTORY_SEPARATOR . bin2hex( random_bytes( 16 ) ) . '.' . $types[ $mime ];
if ( ! rename( $upload->path, $destination ) ) {
throw new RuntimeException( 'Could not finalize upload' );
}
$registry->markConsumed( $uploadId );
return $destination;
}
Чек-лист по защите системы для инженеров
- ✓Проверьте версии Bricksforge в рабочей среде, тестировании и системах клиентов; обновите затронутые установки до последней версии, поддерживаемой поставщиком. Patchstack считает исправленной версию 3.1.8.10, а журнал поставщика описывает исправление в 4.0.1 без точной границы ветки 3.x.[1], [2], [3], [4], [5]
- ✓Практическая рекомендация FlawOpen: При завершении загрузки считайте недоверенными все переданные клиентом имена, URL, пути и MIME-метки; формируйте имя и путь из серверной записи и списка типов, основанного на проверенном содержимом.
- ✓Практическая рекомендация FlawOpen: По возможности храните загрузки вне исполняемых веб-каталогов; в противном случае запретите исполнение скриптов во всех каталогах загрузки и временных файлов на веб-сервере.
- ✓Практическая рекомендация FlawOpen: Свяжите каждую ожидающую загрузку с сессией формы, которая её создала, разрешайте использовать её один раз и отклоняйте отсутствующие, просроченные, повторные или несовпадающие идентификаторы.
- ✓Практическая рекомендация FlawOpen: Если уязвимый сайт был доступен из интернета, проверьте веб-журналы и журналы приложения на необычные загрузки и новые файлы; сохраните доказательства и следуйте процессу реагирования хостинга до очистки.
- ✓Практическая рекомендация FlawOpen: Добавьте регрессионные тесты на несовпадающие метаданные, запрещённый контент, идентификаторы другой сессии, просроченные и повторные идентификаторы; проверьте отказ и отсутствие записи файлов в исполняемый каталог.
Источники
- CVE-2026-85097 — запись CNA Wordfence
- Wordfence — уведомление о неавторизованной произвольной загрузке в Bricksforge
- Patchstack — критическая уязвимость неавторизованной загрузки в Bricksforge подвергается эксплуатации (2026-10-08)
- Patchstack — детали уязвимости Bricksforge и исправленная версия
- Bricksforge — журнал версий