Критическая уязвимость в Ruby on Rails может позволить неаутентифицированному злоумышленнику записывать произвольные файлы на сервер приложения, загрузив специально созданный файл, если приложение обрабатывает загрузки с помощью ImageMagick. Проект Rails раскрыл уязвимость в консультативном документе и исправил ее в версиях 8.1.4.1 и 8.0.5.2.
Уязвимость находится в Active Storage, части Rails, отвечающей за загрузку файлов. Некоторые приложения хранят загруженные файлы с помощью службы Disk в Active Storage, которая сохраняет их на диске сервера. В таких приложениях злоумышленник также может читать любые файлы, доступные приложению.
По данным Rails, эти файлы обычно включают секретный ключ приложения (secret_key_base) и его учетные данные для других систем. Их чтение, в свою очередь, может привести к удаленному выполнению кода или боковому перемещению в эти системы.
Rails оценивает уязвимость в 9,8 из 10 по шкале CVSS. Она отслеживается как GHSA-f3w6-w445-fwh9 и пока не имеет идентификатора CVE.
ImageMagick выбирает обработчик формата, который он называет кодером, на основе содержимого файла. Некоторые кодеры работают с другими файлами, указанными в изображении, а не с самим изображением. Active Storage не накладывает ограничений на то, какие кодеры может использовать загружаемый файл, поэтому единственным ограничением была собственная политика ImageMagick сервера.
Анализатор ImageMagick в Active Storage запускается при прикреплении файла. Прикрепления загружаемого файла достаточно для использования уязвимости. Приложение не должно создавать вариант (преобразованную копию изображения) или предварительный просмотр, или вызывать анализ.
Загруженный файл SVG достиг кодера MSL в ImageMagick через этот анализатор, согласно коммиту, который исправил уязвимость. MSL — это скриптовый кодер, который читает и записывает файлы, указанные в его скрипте.
Rails заявила, что ей была сообщена одна цепочка атак, но она «не предполагает, что это единственная существующая». В консультативном документе не указано, была ли уязвимость использована.
Уязвимость была сообщена через HackerOne РайотойК, исследователем из GMO Flatt Security.
Приложение затронуто, только если выполняются все три условия:
Чтобы проверить первое условие, посмотрите на config.active_storage.variant_processor. Если оно не установлено, значение по умолчанию зависит от load_defaults: :mini_magick до 7.0 и :vips с 7.0. Та же настройка определяет, какая библиотека анализирует загружаемые файлы, а не только какая создает варианты.
Затронуты все версии Active Storage до 8.0.5.2, а также версии 8.1 до 8.1.4.1. Серии выпусков старше 8.0 больше не поддерживаются, и Rails не будет выпускать для них исправленные версии.
В июле Rails исправила другую критическую уязвимость Active Storage, CVE-2026-66066, которая затрагивала приложения, использующие libvips вместо ImageMagick. Приложения, использующие ImageMagick, не были подвержены пути атаки этой уязвимости, но они могут быть подвержены этой.
Те же выпуски исправляют вторую уязвимость Active Storage, GHSA-v924-7rp8-4mxh, которую Rails оценивает как высокую с показателем CVSS 8,8. Active Storage передавал загружаемые файлы в ImageMagick и FFmpeg под временными именами файлов, которые сохраняли расширение загруженного файла.
Эти инструменты могут выбирать декодер по расширению, когда содержимое файла не указывает на его формат. Таким образом, злоумышленник, выбравший имя файла загрузки и указавший его тип содержимого, мог выбрать декодер, который его обрабатывает.
Rails настоятельно рекомендует как можно скорее обновиться. Два выпуска исправляют 21 проблему безопасности в общей сложности.
Исправленные версии поставляются с политикой безопасности ImageMagick. MiniMagick — это гем Ruby, который Active Storage использует для вызова ImageMagick. В его настройках по умолчанию каждая команда ImageMagick, которую он запускает, применяет политику, а не только команды из Active Storage.
Политика блокирует кодер MSL; кодеры, которые читают или удаляют файлы, кроме изображения; кодеры, которые извлекают удаленные или локальные ссылки или отображают их на экране; каждый кодер, поддерживаемый Ghostscript, вместе с делегатом gs; и косвенное обращение по @filename.
В консультативном документе не объясняется, как проверить, было ли приложение уже целью атаки.
Всегда имейте в виду, что редакции могут придерживаться предвзятых взглядов в освещении новостей.
Автор – Swati Khandelwal




