Уязвимость в Active Storage для Rails открывает доступ к произвольным файлам на сервере

Ruby on Rails

Неавторизованный злоумышленник может прочитать произвольные файлы на сервере Rails-приложения через уязвимость в компоненте Active Storage - разработчики выпустили исправление. Проблема, зарегистрированная как CVE-2026-66066, затрагивает обработку вариантов изображений в приложениях, использующих библиотеку libvips. В отдельных сценариях чтение файлов может привести к удалённому выполнению кода.

Уязвимость CVE-2026-66066

Уязвимость связана с тем, как Active Storage взаимодействует с libvips. Эта библиотека для обработки изображений поддерживает множество форматов через загрузчики, сохраняторы и другие операции. Часть из них реализована сторонними библиотеками. libvips маркирует такие операции как "unfuzzed" - то есть небезопасные для вызова с контентом, контролируемым атакующим. Ранее Active Storage не блокировал эти операции. В результате атакующий мог загрузить специально сформированный файл и при генерации варианта изображения инициировать выполнение одной из опасных операций. Исследователи продемонстрировали механизм, позволяющий раскрыть содержимое произвольных файлов, доступных процессу Rails-приложения.

Особую опасность представляет возможность чтения переменных окружения. Во многих Rails-развёртываниях переменные окружения содержат секретный ключ secret_key_base, ключи доступа к облачным хранилищам, учётные данные базы данных, токены сторонних API и другие секреты развёртывания. Если атакующий получит secret_key_base, он сможет подделывать подписанные данные или скомпрометировать сессии. Утечка учётных данных для служб Active Storage (например, ключей S3, GCS или Azure) может открыть доступ к облачным ресурсам. В результате одного вектора - чтения произвольного файла - может быть достигнуто удалённое выполнение кода, боковое перемещение по сети или более широкая компрометация инфраструктуры, в зависимости от того, какие секреты доступны приложению.

Разработчики Rails раскрыли информацию об уязвимости 29 июля 2026 года. Технические детали атаки по соглашению с исследователями умышленно не публикуются до 28 августа 2026 года, чтобы администраторы успели установить исправление до начала массовой эксплуатации. Исследователи из компаний Ethiack и GMO Flatt Security ответственно сообщили о проблеме.

Приложение подвержено уязвимости, если выполняются три условия: используется libvips для обработки изображений в Active Storage (настройка "config.active_storage.variant_processor = :vips"), разрешена загрузка изображений от недоверенных пользователей, и используется уязвимая версия Active Storage. Процессор libvips стал умолчательным для приложений, применяющих "load_defaults 7.0" и более новые версии, поэтому проблема затрагивает широкий круг современных Rails-окружений.

Уязвимые версии Active Storage: все выпуски до 7.2.3.2 включительно, версии 8.0.0-8.0.4 и 8.1.0-8.1.2. Разработчики выпустили исправленные версии Active Storage. Для безопасной работы требуется также обновить libvips до версии 8.13.8 или новее, поскольку старые версии не позволяют отключать небезопасные операции. Исправленный Active Storage при загрузке будет вызывать исключение, если обнаружит небезопасную версию библиотеки.

Для администраторов, которые не могут немедленно обновить Rails, предусмотрено временное решение. При наличии libvips 8.13.8 или новее можно установить переменную окружения "VIPS_BLOCK_UNTRUSTED". В развёртываниях с ruby-vips 2.2.1 или выше можно вызвать "Vips.block_untrusted(true)" из инициализатора. Системы со старыми версиями libvips (до 8.13) не имеют безопасных обходных путей - единственным выходом остаётся удаление зависимости от libvips. Некоторые приложения могут использовать ruby-vips только для анализа изображений; в таком случае достаточно удалить gem из Gemfile.

Установка патча закрывает уязвимость, но не отменяет возможную компрометацию секретов, если они уже были похищены. Rails рекомендует считать каждый секрет, читаемый процессом приложения, потенциально раскрытым. Необходимо сменить secret_key_base, мастер-ключ (хранящийся в "config/master.key" или переменной "RAILS_MASTER_KEY"), все данные из "config/credentials.yml.enc", учётные данные Active Storage (S3, GCS, Azure), пароли баз данных и токены сторонних сервисов. Смена secret_key_base приведёт к завершению активных сессий, аннулированию подписанных и зашифрованных куки, подписанных Global ID и URL для Active Storage - пользователям потребуется пройти аутентификацию заново. Ротацию следует выполнять без сохранения старого ключа в качестве запасного.

Уязвимость затрагивает значительную базу установленных Rails-приложений из-за того, что libvips стал процессором по умолчанию. Администраторам необходимо провести инвентаризацию конечных точек загрузки и немедленно проверить версии Active Storage и системной libvips. Обновление библиотек и последующая ротация секретов - минимально необходимые шаги для устранения риска.

Ссылки

Комментарии: 0