Критическая уязвимость в Ruby on Rails: RCE через Active Storage
Критический баг в 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) — это заблокирует обработку непроверенных данных до установки патча.
А получается, что любой сайт на Rails, куда можно загрузить картинку, в зоне риска? Интересно, как быстро успевают обновить версию, пока уязвимость не начали активно эксплуатировать.