KindaRails2Shell: критическая уязвимость Ruby on Rails грозит утечкой секретов и RCE

Коротко о главном
29 июля 2026 года команда Ethiack раскрыла CVE-2026-66066 (KindaRails2Shell) — критическую уязвимость Active Storage в Ruby on Rails с оценкой CVSS 9.5. Загрузив специально сформированное изображение, атакующий заставляет обработчик libvips прочитать произвольные файлы сервера, а через утёкший ключ SECRET_KEY_BASE — добиться удалённого выполнения кода. Исправление — обновление до Rails 7.2.3.2, 8.0.5.1 или 8.1.3.1.
Опасность в том, что уязвимы конфигурации по умолчанию: если приложение на Rails 7.0–8.1 принимает пользовательские изображения через Active Storage и обрабатывает их через vips, оно под ударом «из коробки», без экзотических настроек. Исследователи Ethiack оценили масштаб потенциально уязвимых сайтов в сотни тысяч.
Для команд, которые ведут веб-разработку на Rails, это повод сегодня же свериться с версией фреймворка и libvips, а не откладывать патч до планового спринта. Если нужен внешний взгляд на периметр, пригодится и регулярная проверка безопасности сайта.
Что именно нашли
Уязвимость живёт в варианте обработки изображений Active Storage — стандартном механизме Rails для загрузки файлов и генерации превью. По умолчанию Active Storage использует libvips (через гем ruby-vips), но не отключает операции libvips, помеченные как небезопасные для недоверенного контента. Из-за этого сформированное злоумышленником изображение при обработке достигает опасных путей и раскрывает файлы, доступные процессу Rails-приложения. Классификатор CWE — CWE-1188 (небезопасная инициализация ресурса по умолчанию).
Прямое следствие — чтение произвольных файлов: конфигурации, учётные данные Rails (credentials), пароли БД, ключи облачных хранилищ, сторонние токены. Но настоящая эскалация начинается дальше. Извлекая криптографический секрет SECRET_KEY_BASE из прочитанных файлов, атакующий может подделать подписанный Marshal-payload и добиться удалённого выполнения кода. Именно поэтому уязвимость и назвали KindaRails2Shell — «почти шелл» через цепочку из безобидной на вид загрузки картинки.
Кого затрагивает: версии и условия
Уязвимость касается широкого диапазона поддерживаемых веток Rails, но с важной оговоркой для старых версий.
Rails 7.0.0–7.2.3.1, 8.0.0–8.0.5 и 8.1.0–8.1.3 уязвимы в конфигурации по умолчанию — достаточно, чтобы Active Storage принимал недоверенные изображения и использовал процессор vips.
Rails 6.0.0–6.1.7.10 затронуты только при нестандартной настройке Active Storage — дефолтная конфигурация этих версий использовала другой обработчик.
Три условия эксплуатации совпадают у типичного продакшена: включён Active Storage, задействован процессор vips и приложение принимает загрузку изображений от пользователей. Это делает уязвимыми не «редкие кейсы», а массовый паттерн — формы аватаров, вложений, галерей.
Что это значит для команд разработки
Rails остаётся одним из самых распространённых фреймворков для бэкенда веб-продуктов, поэтому CVE-2026-66066 бьёт по большому числу боевых систем сразу. Опасна именно тривиальность вектора: загрузка картинки — обыденная функция, которую редко воспринимают как поверхность атаки, а здесь она превращается в чтение секретов и потенциальный контроль над сервером.
Особенность этой уязвимости — патча мало. Обновление Rails чинит логику Active Storage, но работает только в связке со свежим libvips: без обновления системной библиотеки исправление не вступает в силу. Это значит, что командам нужно проверить не только версию гема, но и версию нативной зависимости на всех окружениях — включая контейнерные образы и CI, где libvips часто «замораживается» вместе с базовым образом.
Отдельно стоит оценить, что уже могло утечь. Если приложение было доступно в интернете и принимало загрузки изображений, консервативный сценарий — считать, что чувствительные файлы могли быть прочитаны, и планировать ротацию критичных секретов (в первую очередь SECRET_KEY_BASE и ключей доступа к облаку) после закрытия уязвимости.
Как действовать: пошагово
Последовательность для команд, у которых есть Rails в проде:
1. Обновите Rails до исправленной версии своей ветки: 7.2.3.2, 8.0.5.1 или 8.1.3.1 (либо новее). Это первый и главный шаг.
2. Обновите libvips до версии 8.13 или новее — без этого патч Rails не заработает. Проверьте версию на всех средах, включая Docker-образы.
3. Если немедленный патч невозможен, примените стопгап: переменную окружения VIPS_BLOCK_UNTRUSTED=1, либо (для ruby-vips 2.2.1+) вызов Vips.block_untrusted(true) в инициализаторе приложения.
4. Проверьте журналы Active Storage и веб-сервера на подозрительные загрузки изображений в период до обновления и оцените, требуется ли ротация секретов.
5. Зафиксируйте проверку версий Rails и libvips в CI, чтобы регресс не вернул уязвимую связку при следующем деплое.
Часто задаваемые вопросы
Насколько это серьёзно? Оценка CVSS 9.5 (критическая). Вектор — от чтения произвольных файлов до удалённого выполнения кода через подделку подписанного Marshal-payload, а условия эксплуатации выполняются в конфигурации Rails по умолчанию.
Мне точно нужно что-то делать? Если ваш продукт на Rails 7.0–8.1 принимает пользовательские изображения через Active Storage с процессором vips — да, обновляйтесь немедленно. Версии 6.x затронуты только при нестандартной настройке.
Достаточно ли обновить только гем Rails? Нет. Патч работает лишь с libvips 8.13+. Нужно обновить и Rails, и нативную библиотеку на всех окружениях.
Что делать, если обновиться прямо сейчас нельзя? Задайте VIPS_BLOCK_UNTRUSTED=1 или вызовите Vips.block_untrusted(true) как временную меру, после чего как можно скорее переходите на исправленную версию.
Источники
Ethiack — KindaRails2Shell: Critical RCE in Rails via Active Storage (CVE-2026-66066), 29 июля 2026 года (первоисточник, команда-исследователь).
Rapid7 — KindaRails2Shell: CVE-2026-66066, Critical Arbitrary File Read and Possible Remote Code Execution in Ruby on Rails, 30 июля 2026 года.
HeroDevs — CVE-2026-66066: Rails Active Storage Arbitrary File Read and RCE, 2026.