Рекомендуем
VPS на Windows и Linux — от 49 ₽ за 7 дней Быстрый запуск сервера на NVMe для сайтов, ботов и других задач.
Выбрать VPS

Уязвимости Ruby в Onigmo — какие приложения рискуют столкнуться с выполнением кода

Ошибки в движке регулярных выражений Onigmo позволяли добиваться удалённого выполнения кода на серверах GitLab. Для исправления причин этих уязвимостей 23 октября 2026 года вышли Ruby 4.0.9, 3.4.12 и 3.3.13. Анализ, опубликованный 25 октября, объясняет, при каких условиях проблема затрагивает и другие приложения на Ruby.

Уязвимости Ruby в Onigmo
Уязвимости Ruby в Onigmo

Повреждение памяти происходило при компиляции регулярного выражения

Регулярное выражение — это шаблон, по которому программа находит нужные фрагменты текста. Например, с его помощью можно описать формат строки в поиске или правило обработки имени файла. В Ruby такие шаблоны обрабатывает встроенный движок Onigmo.

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

За четырьмя идентификаторами CVE, опубликованными GitLab с сентября по октябрь, стоят три ошибки в Ruby:

  • Повторное освобождение памяти (double free) при неудачном разборе некоторых конструкций регулярного выражения — связано с CVE-2026-89078.
  • Переполнение целого числа при расчёте размера скомпилированного шаблона — лежит в основе CVE-2026-93577 и CVE-2026-97229.
  • Переполнение внутренних идентификаторов при многочисленных повторениях в шаблоне — связано с CVE-2026-110264.

Последняя из этих проблем получила в GitLab максимальные 10,0 балла по шкале CVSS 3.1. Оценка относится к конкретному сценарию атаки на GitLab: переносить её автоматически на каждое приложение Ruby было бы некорректно.

Другие приложения Ruby уязвимы при обработке пользовательских шаблонов

Разработчики Ruby отдельно описали границу риска. Ошибки доступны атакующему, когда приложение создаёт регулярное выражение из текста, который тот может контролировать. Такое происходит, например, если сервис принимает от пользователя собственный шаблон поиска или фильтрации и передаёт его в Regexp.new, Regexp.compile либо Regexp.union.

Представим веб-сервис, в котором клиент задаёт правило поиска с помощью регулярного выражения. Сервер принимает строку и компилирует её для последующей обработки данных. Именно в этот момент специально подобранный ввод способен задействовать ошибку Onigmo. В приложении, где используются только заранее написанные разработчиками шаблоны, описанный путь атаки отсутствует.

Есть и менее очевидный вариант: пользовательский ввод может превращаться в регулярное выражение внутри стороннего gem — библиотеки, подключённой к приложению. Аналитики Rescana 25 октября обратили внимание на этот сценарий, поскольку сам код приложения может не содержать прямых вызовов Regexp.new.

Ограничение длины шаблона и Regexp.timeout не устраняют ошибку

Для защиты от некоторых проблем с регулярными выражениями Ruby поддерживает Regexp.timeout: он ограничивает время выполнения сопоставления с текстом. Здесь сбой возникает раньше, во время компиляции шаблона. Поэтому, согласно официальному предупреждению Ruby, настройка тайм-аута от выявленных ошибок не защищает.

Нельзя рассчитывать и на простой лимит количества символов. Разработчики указывают, что часть сбоев вызывается сравнительно короткими выражениями. Риск определяется содержимым шаблона и тем, кто может передать его программе.

Это объясняет, почему проблема заслуживает внимания даже в проектах, где поиск по тексту работает быстро и ранее не наблюдалось зависаний: обычные ограничения времени работы регулярных выражений не перекрывают выявленный механизм повреждения памяти.

В каких версиях Ruby исправлены ошибки Onigmo

23 октября команда Ruby выпустила три версии, объединяющие все необходимые исправления:

Ветка RubyВерсия со всеми исправлениямиОсобенности
4.04.0.9В 4.0.8 ещё отсутствует исправление переполнения внутренних идентификаторов
3.43.4.12Содержит все три изменения для Onigmo
3.33.3.13Исправления включены в ветку, находящуюся на этапе поддержки безопасности
3.2 и старшеИсправленного выпуска нетЭти ветки завершили жизненный цикл поддержки

Ситуация с Ruby 4.0 особенно показательна. Исправление повторного освобождения памяти присутствовало уже в 4.0.0, а защита от переполнения размера шаблона появилась в 4.0.8. Для устранения третьей ошибки потребовалась версия 4.0.9. Поэтому номер «4.0.8» сам по себе ещё не означает наличия полного набора исправлений.

Ruby 3.2 прекратила получать обновления 1 апреля 2026 года. В официальном перечне поддерживаемых веток она уже помечена как EOL — окончание жизненного цикла.

Почему сканер уязвимостей может не сообщить о проблеме Ruby

У четырёх ошибок есть номера CVE, но формально эти идентификаторы выдала GitLab для своих уязвимостей. Команда Ruby сообщила 23 октября, что пока не запрашивала отдельные CVE для исправлений в самом языке.

В опубликованном 25 октября исследовании Rescana отмечается возможный пробел: сканер, который сопоставляет установленные продукты с записями CVE, может распознать уязвимую версию GitLab и при этом не связать те же ошибки с отдельной установкой Ruby. Такой результат зависит от конкретной базы уязвимостей и способа проверки, поэтому отсутствие предупреждения само по себе не доказывает наличие исправления.

Это различие существенно и для приложений, использующих Ruby через контейнеры, менеджеры версий или сторонние пакеты. Версия интерпретатора и путь поступления пользовательского регулярного выражения позволяют точнее определить, относится ли к проекту описанный механизм атаки.

Подтверждённых атак за пределами GitLab пока не описано

По данным анализа Rescana от 25 октября, опубликованные сведения не подтверждали эксплуатацию этих ошибок в реальных атаках; четыре CVE отсутствовали в проверенной исследователями версии каталога CISA Known Exploited Vulnerabilities. Такая проверка отражает состояние общедоступных данных на конкретную дату и не позволяет установить, были ли неизвестные попытки эксплуатации.

Команда Ruby ещё обсуждает, нужно ли присваивать исправленным ошибкам собственные номера CVE и уточнять документацию об обработке недоверенных регулярных выражений. Для GitLab последствия уже продемонстрированы; применимость того же механизма к другим продуктам определяется тем, могут ли внешние данные попасть в компилятор шаблонов Onigmo.

Источники

При использовании материалов сайта необходимо указывать ссылку на TGLand.ru. Если вы копируете фрагменты текста в интернете, прямая гиперссылка, доступная для индексации поисковыми системами, должна быть размещена в начале материала.

Вам также может понравиться