Разработчики Ruby выпустили версии 4.0.9, 3.4.12 и 3.3.13 после четырех уязвимостей GitLab, которые позволяли запускать произвольный код на сервере через специально подготовленные регулярные выражения. За четырьмя CVE стоят три ошибки в движке Onigmo, встроенном в Ruby, причем две из них GitLab оценила в 10 баллов из 10.
GitLab разрешает пользователям задавать регулярные выражения, например в конфигурации CI/CD. Такие шаблоны помогают программе искать и проверять текст по заданным правилам. Как объяснили разработчики Ruby, специально составленная строка могла повредить память еще во время компиляции шаблона. В GitLab уязвимый механизм позволял довести ошибку до удаленного выполнения кода и заставить сервер выполнять команды атакующего.
Первая проблема, CVE-2026-89078, приводила к двойному освобождению одного участка памяти, если движок не мог разобрать определенный шаблон. CVE-2026-93577 и CVE-2026-97229 использовали другую ошибку: при расчете размера скомпилированного выражения возникало целочисленное переполнение. За двумя идентификаторами CVE в данном случае скрывается один дефект Ruby.
CVE-2026-110264 затрагивала внутренние идентификаторы Onigmo. Если злоумышленник задавал слишком много повторений внутри выражения, счетчик мог переполниться и нарушить работу с памятью. GitLab оценила уязвимость в максимальные 10 баллов по CVSS. Для атаки не требовалась учетная запись, а уязвимые версии GitLab существовали начиная с ветки 7.0.
Две более ранние уязвимости, CVE-2026-89078 и CVE-2026-93577, требовали авторизации и получили по 9,9 балла. Позднее GitLab закрыла CVE-2026-97229 с оценкой 10,0, которая уже позволяла атаковать сервер без входа в систему. Компания выпустила исправления для собственных продуктов раньше, внеся изменения в поставляемую вместе с GitLab версию Ruby.
Теперь исправления добрались до самого языка. Ruby 4.0 уже содержал часть защитных изменений: версия 4.0.0 устраняла двойное освобождение памяти, а 4.0.8 закрывала переполнение при расчете размера шаблона. Ruby 4.0.9 добавила оставшуюся правку. Для веток 3.4 и 3.3 полный набор исправлений появился в версиях 3.4.12 и 3.3.13.
Опасность грозит не каждому приложению на Ruby. Проблема возникает, когда программа берет строку из недоверенного источника и превращает ее в регулярное выражение через Regexp.new, Regexp.union, Regexp.compile или подставляет пользовательские данные прямо в шаблон. Если все выражения заранее написали разработчики и пользователь не может менять их содержимое, описанные ошибки не срабатывают.
Настройка Regexp.timeout тоже не спасает. Ограничение контролирует время поиска совпадений, тогда как память повреждается раньше, во время компиляции выражения. Ограничивать длину строки недостаточно: некоторые ошибки вызывают и короткие шаблоны. Разработчики советуют перейти на Ruby 4.0.9, 3.4.12 или 3.3.13, а до обновления не превращать недоверенный ввод в регулярные выражения.
Отдельных CVE для трех ошибок Ruby пока нет. Команда языка собирается решить, должна ли компиляция недоверенных регулярных выражений считаться поддерживаемым сценарием, который требует собственной классификации уязвимостей. Пока для отслеживания проблем разработчики предлагают использовать четыре идентификатора, присвоенные GitLab.
