Уязвимость в Discourse позволяет любому зарегистрированному пользователю читать и записывать файлы на сервере, где развёрнут форум. Рядом с ней исследователи из Searchlight Cyber описали вторую проблему: подмена страниц, из-за которой чужой код исполняется в браузере у анонимных посетителей. Обе срабатывают на стандартной конфигурации платформы. Discourse - открытая платформа для форумов и сообществ. По данным исследователей, на ней работают более 22 тысяч проектов, включая OpenAI, Atlassian и Cloudflare. Проблему с обработкой изображений они относят к критическим.
Уязвимости в загрузке изображений и кеше страниц
Чтение и запись файлов через обработку картинок
Уязвимость CVE-2026-55420 скрыта в конвейере загрузки изображений. Discourse проверяет вложенный файл двумя способами: по расширению и по первым байтам содержимого. Как только хотя бы одна проверка проходит, файл уходит в ImageMagick, библиотеку для преобразования графики. Обойти обе проверки помогает полиглот - файл, который разные программы читают как разные форматы. Исследователи собрали такой файл из структур формата JPEG XL и текста на PostScript (язык описания печатных документов).
Дальше срабатывает особенность настроек. В конфигурации ImageMagick модуль PostScript отключён. Однако обработка PDF всё равно передаёт файл в Ghostscript - внешний интерпретатор, который различает форматы по первым байтам. Подделанное вложение доходит до него и исполняется.
Одного исполнения мало для чтения файлов. Основной этап опирается на встроенный язык сценариев ImageMagick. Он умеет читать данные по локальному пути и записывать их в другое место. Чтобы подсунуть такой сценарий обработчику, исследователи применили состояние гонки (TOCTOU, расхождение между моментом проверки файла и моментом его использования). Временный файл подменяли уже после проверки.
Окно для подмены изначально слишком узкое. Расширить его помог специально подготовленный JPEG с большим объёмом служебных метаданных: этап оптимизации изображения занимал около 25 секунд. Замену выполняли атомарным переименованием. При таком приёме уже открытые файлы сохраняют прежнее содержимое, поэтому точное попадание в нужный момент перестаёт быть обязательным.
Результат выглядел обычно. Прочитанные данные сохранялись в картинку, а та попадала в хранилище платформы как обычная загрузка. В ответе сервер возвращал ссылку на неё, и знать структуру каталогов на сервере не требовалось. Исследователи остановились на чтении и записи. При этом они отмечают, что дальше путь ведёт к полному захвату сервера: похищенные секретные ключи приложения позволяют подписывать собственные данные от его имени. Такой подход известен с 2019 года по атакам на приложения на Rails.
Подмена кеша и исполнение кода у анонимных посетителей
Вторая уязвимость, CVE-2026-55674, связана с кукой (небольшим набором данных, который браузер хранит для конкретного сайта). Через неё посетитель выбирает цветовую схему форума. Значение куки подставляется в разметку страницы без экранирования. Проверка существования схемы проходит: база данных приводит строку к числу и отбрасывает остаток. В ответ при этом уходит исходная строка. Так в разметке оказывается произвольный HTML.
Сам по себе приём даёт возможность испортить только собственный ответ. Опасность создаёт анонимный кеш. Платформа хранит готовые страницы и различает их по адресу, схеме, узлу и заголовкам браузера, но не по этой куке. Отравленная страница достаётся всем последующим посетителям с теми же заголовками. Перебор распространённых браузеров автоматизируется, и это покрывает большинство аудитории форума.
Скрипты в такой разметке не срабатывают сразу. Платформа применяет строгую политику безопасности контента, которая разрешает выполнение только подписанных скриптов. Обход опирается на доверенный код самой платформы. При запуске он ищет в разметке ссылки на подключаемые модули и загружает их. Подставленный элемент заставляет загрузить чужой модуль с постороннего сервера, и тот исполняется в браузере как часть сайта.
Условия для обеих атак минимальны. Для первой достаточно обычной регистрации, для второй учётная запись не нужна вовсе.
Что исправлено и что делать
Хостинговым клиентам Discourse закрыл доступ к обеим проблемам 15 июня 2026 года. Публично исправление для обработки изображений вышло 30 июня, для подмены кеша - 28 июля.
Политику ImageMagick перевели на запрет по умолчанию. Теперь блокируются все внешние интерпретаторы, включая Ghostscript, а разрешены только те модули, которые нужны платформе. Для куки добавили строгую числовую проверку и включили её в ключ кеша.
Администраторам форумов стоит обновиться до актуальной сборки. Полезно проверить, что политика ImageMagick на сервере запрещает лишние модули и передачу обработки внешним программам. Загрузку изображений для пользователей с низким уровнем доверия лучше ограничить, если задачи сообщества это позволяют. Среди признаков атаки - файлы, чьё расширение не совпадает с содержимым, необычные вложения JPEG XL и PDF, а также подозрительная активность вокруг временных файлов.
ImageMagick снова оказался удобной точкой входа для исследователей. Отключение одного модуля не закрывает цепочку, пока рядом остаются внешние интерпретаторы и внутренние форматы, которые по-разному читают один и тот же файл.
Ссылки
- https://www.cve.org/CVERecord?id=CVE-2026-55420
- https://www.cve.org/CVERecord?id=CVE-2026-55674
- https://www.slcyber.io/research/a-jpeg-a-race-and-a-ghost-breaking-discourses-image-pipeline