Проблема затрагивает Active Storage, встроенный в Ruby on Rails механизм работы с загружаемыми файлами. Уязвимые приложения используют библиотеку libvips для обработки изображений и позволяют недоверенным пользователям загружать картинки. Начиная с Rails 7, libvips применяется в такой конфигурации по умолчанию. Ошибка получила 9,5 балла из 10 по CVSS и позволяет атаковать сервер без учётной записи.
Механика KindaRails2Shell построена на том, что разные части системы по-разному определяют тип одного и того же файла. Rails при прямой загрузке может принять тип содержимого, указанный клиентом, тогда как libvips позже смотрит уже на сигнатуру самого файла. Специально подготовленный объект проходит через несколько обработчиков форматов, пока библиотека HDF5 не обращается к внешнему файлу на сервере. В результате содержимое выбранного атакующим файла фактически превращается в пиксели изображения и возвращается наружу. Разработчики Rails позднее подробно описали цепочку после появления сторонних PoC.
Главная опасность кроется не столько в чтении отдельных файлов, сколько в секретах приложения. Через переменные окружения и конфигурацию можно получить
secret_key_base, мастер-ключ Rails, пароли от баз данных, ключи облачных хранилищ и токены сторонних сервисов. Секрет secret_key_base позволяет подделывать данные, которым Rails доверяет как подписанным самим приложением. Дальнейшая цепочка может добраться до небезопасной Marshal-десериализации и закончиться удалённым выполнением кода. Уязвимость независимо нашли специалисты Ethiack и исследователь RyotaK из GMO Flatt Security. Разработчики Rails выпустили исправления 29 июля в Active Storage 7.2.3.2, 8.0.5.1 и 8.1.3.1. Для безопасной работы также требуется libvips версии 8.13 или новее, поскольку более старые сборки вообще не умеют блокировать операции, небезопасные для недоверенных файлов.
Скорость перехода от исследования к настоящим атакам была вполне предсказуемой. Уже в начале августа VulnCheck подготовила собственный рабочий эксплоит и насчитала более 7100 доступных из интернета уязвимых экземпляров Rails. Вместе с эксплоитом компания создала правила Sigma, Suricata, Snort и YARA, а также сетевые дампы для обнаружения попыток эксплуатации. Через несколько недель ловушки VulnCheck начали принимать настоящий вредоносный трафик.
Одного обновления Rails недостаточно, если сервер мог быть доступен для атак до установки исправления. Разработчики рекомендуют считать скомпрометированными все секреты, которые процесс приложения способен был прочитать, и заменить
secret_key_base, мастер-ключ, учётные данные базы данных, ключи S3, Google Cloud Storage или Azure и токены внешних сервисов. Смена secret_key_base также завершит существующие пользовательские сеансы и сделает недействительными старые подписанные данные. Для проверки уже обновлённых систем команда Rails выпустила инструменты, которые помогают определить период уязвимости и искать следы KindaRails2Shell в Active Storage и объектном хранилище. Атака оставляет необычный след: обработанный вариант изображения способен содержать украденные с сервера байты прямо среди пиксельных данных. Поэтому администраторам Rails-систем теперь придётся выяснить не только установлен ли свежий релиз, но и успел ли кто-нибудь воспользоваться месячным окном между раскрытием KindaRails2Shell и появлением подтверждённой эксплуатации.