Критический баг в Active Storage

Разработчики Ruby on Rails выпустили срочные обновления, закрывающие критическую уязвимость в компоненте Active Storage. Проблема получила идентификатор CVE-2026-66066 и оценку 9,5 балла по шкале CVSS. Баг позволяет неаутентифицированному атакующему загрузить специально подготовленное изображение и прочитать произвольные файлы, доступные процессу приложения, а в определённых условиях — выполнить произвольный код.

Что именно позволяет сделать атака

С помощью бага злоумышленник может вытащить переменные окружения, secret_key_base, мастер-ключ Rails, пароли баз данных, облачные учётные данные и API-токены. Проблему независимо обнаружили специалисты Ethiack и GMO Flatt Security.

Кто в зоне риска

  • Уязвимы только приложения, использующие библиотеку libvips для обработки изображений через Active Storage и принимающие загрузки от недоверенных пользователей.
  • Приложения на MiniMagick проблеме не подвержены.
  • Затронуты версии Rails от 7.0.0 до 7.2.3.1, от 8.0.0 до 8.0.5 и от 8.1.0 до 8.1.3, а также ветка 6.x, если администратор вручную выбрал Vips в качестве процессора изображений.

Как работает эксплойт

Исследователи Ethiack подготовили PoC-эксплойт в виде MAT-файла формата 7.3 — по сути, это HDF5-контейнер с внешней ссылкой на нужный файл на сервере. Пейлоад маскируется под PNG: в поле content_type указывается image/png, поэтому Active Storage без подозрений передаёт его библиотеке libvips. Обработчик открывает контейнер, считывает файл по внешней ссылке, а данные превращаются в значения пикселей сгенерированного изображения, которое возвращается атакующему.

Получив secret_key_base, злоумышленник может сформировать поддельный подписанный токен с параметрами преобразования изображения и довести атаку до выполнения Ruby-кода. Такую цепочку продемонстрировали, скомбинировав свежую уязвимость с ранее известной CVE-2025-24293.

Что делать

Исправления уже вошли в состав Ruby on Rails 7.2.3.2, 8.0.5.1 и 8.1.3.1. Также потребуется libvips версии 8.13 или новее, а в случае использования ruby-vips — версия не ниже 2.2.1.

Специалисты подчёркивают: простого обновления недостаточно — все секреты, которые мог прочитать процесс приложения, следует считать скомпрометированными и заменить. Если установить обновления невозможно, стоит задать переменную окружения VIPS_BLOCK_UNTRUSTED или вызвать Vips.block_untrusted(true) — это заблокирует обработку непроверенных данных до установки патча.