Уязвимость в Ruby on Rails позволяет XSS при нестандартной конфигурации санитайзера

Ruby on Rails

Разработчики Ruby on Rails выпустили обновление безопасности для библиотеки rails-html-sanitizer, закрывающее уязвимость, которая могла привести к межсайтовому скриптингу (XSS). Патч получил номер версии 1.7.1 и предназначен для всех инсталляций, где санитайзер используется с переопределённым списком разрешённых тегов. Сообщение об уязвимости опубликовано в официальном бюллетене безопасности проекта 16 июля 2026 года.

Детали уязвимости

Проблема затрагивает версии rails-html-sanitizer начиная с 1.0.3 и заканчивая 1.7.1. Более старые сборки (до 1.0.3) не подвержены риску. Уязвимость связана с некорректной обработкой SVG-элементов, предназначенных для ссылок на внешние ресурсы, таких как "<use>" и "<feImage>". В стандартной конфигурации эти элементы не входят в перечень разрешённых тегов, поэтому большинство пользователей не пострадают. Однако администраторы, которые вручную расширяли белый список для поддержки SVG-графики, могли случайно открыть приложение для XSS-атак.

Корень проблемы кроется в логике работы класса "Rails::HTML::PermitScrubber". Он ограничивает использование атрибутов "xlink:href" для SVG-элементов только локальными ссылками в пределах того же документа. Но, как выяснилось, браузеры также поддерживают атрибут "href" в соответствии со спецификацией SVG 2. Именно этот атрибут не был включён в список запрещённых, что позволяло вставлять ссылки на произвольные внешние документы. Элемент "<use>" может загружать и отображать внешнее SVG-содержимое, а если такой документ находится в том же источнике (same-origin) и содержит скрипты, вредоносный код выполнится в контексте страницы, прошедшей санитацию. Элемент "<feImage>", в свою очередь, позволяет подгружать внешние изображения, которые могут использоваться для отслеживания пользователей.

В случае эксплуатации злоумышленник мог бы внедрить в санитизированный HTML-код ссылку на подконтрольный SVG-файл, содержащий JavaScript. Если сервер, на котором размещено приложение, не устанавливает строгие заголовки Content-Security-Policy, скрипт выполнится в контексте сессии текущего пользователя. Это даёт возможность красть cookie, подделывать запросы или похищать токены аутентификации. Особенно опасна атака для приложений, которые сохраняют и отображают пользовательский контент, прошедший санитацию, например, форумы, системы комментирования или вики.

Разработчик библиотеки Майк Далессио, сообщивший об уязвимости, уточнил, что атака возможна только при нестандартной настройке санитайзера. В официальном обсуждении на форуме Ruby on Rails он отметил, что проблема является следствием более ранней уязвимости в пакете Loofah (GHSA-9wjq-cp2p-hrgf), чья логика проверки локальных ссылок была повторена в rails-html-sanitizer. Соответствующее исправление выпущено в составе версии 1.7.1, и всем пользователям, модифицировавшим разрешённые теги, настоятельно рекомендуется обновиться.

В качестве временной меры защиты до установки патча предлагается удалить SVG-элементы "<use>" и "<feImage>" из переопределённого списка разрешённых тегов. Приложения, использующие стандартную конфигурацию, не требуют никаких дополнительных действий, так как по умолчанию эти элементы не допускаются. Для проверки своей версии rails-html-sanitizer можно выполнить команду "bundle list | grep rails-html-sanitizer" или "gem list rails-html-sanitizer". Если версия ниже 1.7.1, необходимо обновить гем через "bundle update rails-html-sanitizer" или "gem update rails-html-sanitizer".

Публикация данной уязвимости вновь поднимает вопрос о безопасности механизмов санитации HTML. Разработчики, использующие библиотеки очистки, должны внимательно относиться к любым переопределениям разрешённых тегов, особенно когда речь идёт об элементах SVG, способных загружать внешние ресурсы. Встроенная поддержка SVG в современных браузерах значительно расширяет вектор атаки: даже один пропущенный атрибут может открыть доступ к межсайтовому скриптингу. Регулярное обновление зависимостей и следование рекомендованным настройкам безопасности остаётся наиболее надёжной стратегией защиты для приложений на Ruby on Rails.

Ссылки

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