
Триаж только для обнаружения GitLab CVE-2026-97229 (и CVE-2026-110264): оценка версии self-managed GitLab вместе с её Ruby, выявление ловушек с патчем от 12 октября и кастомным Ruby. Без полезных нагрузок, без сетевых проверок.
gitlab-onigmo-scannerТриаж версий для двух регэксп-уязвимостей GitLab с оценкой CVSS 10.0: CVE-2026-97229 и CVE-2026-110264. Укажите версию GitLab, которой вы владеете, — инструмент сообщит, остаётся ли эта сборка уязвимой, и выявит две ловушки, в которые люди уже попадаются. Он никогда не обращается к сети, не отправляет полезную нагрузку, не обращается к эндпоинту линтинга CI и не компилирует специально сформированное регулярное выражение.
УязвимостьДеталь | Значение |
|---|---|
CVE | CVE-2026-97229, а также CVE-2026-110264, оцениваемая наравне с ней |
Ошибка | Целочисленное переполнение (CWE-190) в Onigmo — движке регулярных выражений, встроенном в Ruby, — когда GitLab компилирует предоставленное пользователем регулярное выражение |
Воздействие | Неаутентифицированное удалённое выполнение кода на самостоятельно размещённом сервере GitLab при определённых условиях |
Критичность | 10.0 critical для обеих, оценено GitLab как CNA |
Эксплуатация | CVE-2026-97229 добавлена в CISA KEV 2026-10-29, федеральный срок — 2026-11-01. CVE-2026-110264 на момент написания отсутствует в списке KEV, и GitLab не сообщает о признаках её использования в атаках |
CVE-2026-97229 — это уязвимость регулярных выражений в CI/CD: специально сформированное регулярное выражение в конфигурации CI/CD, недостаточная валидация регулярных выражений, исправлена 2026-10-12. CVE-2026-110264 — вторая, более широкая уязвимость регулярных выражений, исправленная 2026-10-21, затрагивающая все самостоятельно размещённые релизы вплоть до 7.0. Тот же движок, та же оценка, другая ошибка — и именно поэтому одной проверки недостаточно.
Исправленные версииCVE-2026-97229 (исправлена 2026-10-12)Ветка | Исправлено в |
|---|---|
GitLab 19.2 | 19.2.8 |
GitLab 19.3 | 19.3.5 |
GitLab 19.4 | 19.4.2 |
GitLab 19.5, старше 19.2 | Не указаны как затронутые этой CVE |
CVE-2026-110264 (исправлена 2026-10-21)Ветка | Исправлено в |
|---|---|
GitLab 19.5 | 19.5.1 |
GitLab 19.4 | 19.4.3 |
GitLab 19.3 | 19.3.6 |
GitLab 19.2 | 19.2.9 |
GitLab 19.1 | 19.1.9 |
GitLab 19.0 | 19.0.10 |
GitLab 18.11 | 18.11.13 |
GitLab 18.10 и старше | Исправленного релиза нет, обновитесь до 18.11.13 или новее |
Ruby, для установок из исходников и пользовательских образовВетка | Исправлено в |
|---|---|
Ruby 3.3 | 3.3.13 |
Ruby 3.4 | 3.4.12 |
Ruby 4.0 | 4.0.9 |
Ruby 3.2 и старше | Исправления нет, срок поддержки истёк, переходите на 3.4 или 4.0 |
Ловушка 1: патч от 12 октября не покрывает 21 октября19.4.2, 19.3.5 и 19.2.8 исправили CVE-2026-97229. Каждая из них ниже исправления CVE-2026-110264 для своей ветки (19.4.3, 19.3.6, 19.2.9). Если вы пропатчились 12 октября и на этом остановились, вы по-прежнему уязвимы, а сканер, знающий только первую CVE, назовёт вас чистым. Этот инструмент оценивает обе и прямо называет ловушку в своём выводе, когда её видит.
Ловушка 2: обновление GitLab не исправляет ваш собственный RubyИсправление GitLab — это патч для Ruby, который поставляется в его официальных пакетах и образах. Установка из исходников или пользовательский образ, где Ruby устанавливается отдельно, не получает этот патч при обновлении GitLab. Alpine Linux испытала это на себе: она обновилась до GitLab 19.3.6 2026-10-22 и осталась уязвимой, поскольку в её образе использовался стандартный Ruby. Злоумышленник зондировал её сервер 2026-10-20 и 21, восемь раз обрушил воркеры, в четырёх случаях продвинулся в эксплуатации и вернулся 25 и 26. Alpine не нашла доказательств успешной эксплуатации, не смогла её исключить, пересобрала экземпляр с нуля, заменила секретные ключи и сбросила все пароли. Её исправленный образ, повторно загруженный после 2026-10-27, содержит Ruby 3.3.13.
Так: --install-type official оценивает только версию GitLab, поскольку Ruby идёт вместе с ней. --install-type source или custom также оценивает Ruby, который вы указываете через --ruby-version, а отсутствующая версия Ruby даёт оценку UNKNOWN, а не чистый результат. Ruby 4.0.8 — особый случай, о котором стоит знать: он исправляет ошибку CVE-2026-97229, но не CVE-2026-110264, поэтому здесь он получает оценку VULNERABLE. Ruby не запрашивал собственных идентификаторов CVE для этих исправлений, поэтому сканер, сопоставляющий записи CVE с установленными пакетами, нигде не находит уязвимый Ruby. Этот инструмент вместо этого проверяет версию Ruby напрямую.
Что он проверяетGitLab: CVE-2026-97229 и CVE-2026-110264 по отдельности, затем один общий вердиктCSV-инвентаризацию множества экземпляров: name,gitlab_version,ruby_version,install_type,hostingRuby, когда вы указываете, что установка выполнена из source или customGitLab.com и Dedicated как уже исправленные, действия не требуютсяКаждая находка получает вердикт: VULNERABLE, FIXED, EOL_NO_FIX, UNKNOWN или NOT_AFFECTED для отдельного CVE в ветке, которую он не затрагивает. EOL_NO_FIX считается уязвимым: для этой линейки исправление не появится.
Чего он никогда не делаетНикаких сетевых запросов. Никакого зондирования удалённых серверов. Никаких специально созданных регулярных выражений, никаких запросов на проверку CI, никакого эксплойт-трафика, никакого кода PoC. Он читает предоставленные вами строки версий и на этом останавливается. Это сделано намеренно: публичные PoC для CVE-2026-97229 уже существуют, и их воспроизведение здесь не добавило бы ничего защитного.
Зачем это, когда PoC и счётчики версий уже существуютПубличные материалы по CVE-2026-97229 в основном наступательные: PoC, выполняющие код от имени пользователя git, и лаборатории, которые определяют, какие сборки можно использовать как оружие. Censys подсчитывает открытые хосты по версии. GitLab опубликовал правила Sigma для обнаружения попыток эксплуатации в логах. Ничто из этого не является автономным инструментом защитной триажной оценки, который оценивает обе октябрьские уязвимости с CVSS 10.0 вместе и проверяет Ruby под установкой из source или custom. Этот пробел и закрывает данный репозиторий: одна команда, оба CVE, обе ловушки, без полезной нагрузки. Используйте его вместе с правилами Sigma от GitLab, а не вместо них. Если экземпляр подвергался зондированию, триаж версий — это не триаж компрометации: проверьте логи падений воркеров и отчёты о падениях Onigmo, и следуйте примеру Alpine, если не можете исключить попытку.
ОценкаНаходка | Серьёзность |
|---|---|
GitLab ниже исправления для своей ветки по любому из CVE | VULNERABLE |
GitLab на 18.10 или старше, либо Ruby 3.2 или старше при установке из source/custom | EOL_NO_FIX, считается уязвимым |
GitLab на уровне обоих исправлений или выше, и исправленный Ruby, где это применимо | FIXED |
Установка Source/custom без версии Ruby, либо ветка новее данных этого инструмента (2026-10-30) | UNKNOWN, не чистый результат |
GitLab.com / Dedicated | FIXED, исправлено GitLab |
Использование# One instance, official package or image
python3 gitlab_onigmo_scanner.py --version 19.4.2
# One instance, source install with its own Ruby
python3 gitlab_onigmo_scanner.py --version 19.4.3 --ruby-version 3.4.11 --install-type source
# A whole estate, machine-readable output
python3 gitlab_onigmo_scanner.py --list inventory.csv --json
# Tests (version tables only, no network)
python3 -m unittest discover -s tests -v
Формат inventory.csv, строка заголовка необязательна:
name,gitlab_version,ruby_version,install_type,hosting
prod,19.4.1,,official,self-managed
staging,19.4.3,,official,self-managed
legacy-source,19.4.3,3.4.11,source,self-managed