GitLab CE/EE — unauth RCE через CI/CD regexp, KEV (CVE-2026-97229)
Суть
Integer overflow / wraparound при компиляции регулярных выражений CI/CD (движок Onigmo в Ruby, которым пользуется GitLab). По тексту GitLab и CISA: неаутентифицированный пользователь при определённых условиях может выполнить произвольный код на сервере GitLab, подав специально сформированный regexp в CI/CD-конфигурации. CVSS 3.1 — 10.0 (AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H, CNA GitLab). EPSS ~27.3% (лента).
Точные «certain conditions» вендор публично не детализирует — не домысливаем.
Затронуто и исправлено
По Critical Patch Release GitLab от 12.10.2026:
| Линия | Уязвимо | Исправлено |
|---|---|---|
| 19.4 | ≥ 19.4.0 и < 19.4.2 | 19.4.2 |
| 19.3 | ≥ 19.3.0 и < 19.3.5 | 19.3.5 |
| 19.2 | ≥ 19.2.0 и < 19.2.8 | 19.2.8 |
Пример: 19.4.1 — уязвима, 19.4.2 — исправлена.
- Omnibus, source, Helm и прочие типы поставки — все, если не оговорено иное.
- GitLab.com уже на патче; Dedicated — внутренний релиз до публикации.
- Версии вне указанного окна для этого CVE в блоке бюллетеня не перечислены — не обобщайте на весь парк без сверки.
- Родственные баги Onigmo (CVE-2026-89078, 93577, 110264) и фиксы Ruby 4.0.9 / 3.4.12 / 3.3.13 — см. ruby-lang.org; для инстанса GitLab достаточно официального патч-релиза GitLab.
Эксплуатация
- CISA KEV: добавлено 2026-10-29, due 2026-11-01 (срок уже прошёл).
- Публичный PoC: факт наличия по ленте; ссылок нет.
- GitLab: шесть threat detections для self-managed (инфраструктура GitLab-managed остаётся на патче):
- Onigmo native worker crash
- Graphql cilint hostile regexp
- ci regexp oversized non ascii path
- ci regexp guard rejection
- ci lint workhorse worker crash
- ci lint scripted client error burst
Как проверить
# Omnibus
cat /opt/gitlab/embedded/service/gitlab-rails/VERSION
gitlab-rake gitlab:env:info | sed -n '1,40p'- UI: Admin Area → Overview — номер версии.
- Helm:
helm list/appVersionчарта / тег образа — сверить с 19.2.8 / 19.3.5 / 19.4.2+. - Получилось, если версия ≥ исправляющей для своей минорной линии и сервисы поднялись (
gitlab-ctl status).
Как исправить
- Резервная копия по практике GitLab (backup create) до апгрейда; храните вне инстанса.
- Обновите по официальному Upgrade path своей линии до 19.4.2 / 19.3.5 / 19.2.8 (или новее поддерживаемого минора). Не прыгайте через неподдерживаемый path.
- Omnibus: стандартный
apt/yum+gitlab-ctl reconfigureпо доке Upgrade (Docker Omnibus — тот же CE/EE-образ/пакет). - Helm: поднимите chart/
appVersion, снимите/обновите pin тега образа (digest), rolling по runbook. - После апгрейда: проверьте версию; CI lint / Sidekiq / Workhorse в норме. Не встало — restore из backup вне инстанса, смотрите лог
gitlab-ctlи Upgrade docs.
Подводные камни: DB migrations в патче (в т.ч. post-deploy у 19.3.5); single-node = downtime, multi-node — zero-downtime только при правильной процедуре; пропуск major/minor в upgrade path; pinned chart/digest; совместимость внешней PostgreSQL/Redis.
Если обновить нельзя
Официального workaround в блоке CVE-2026-97229 бюллетеня GitLab нет. Снятие инстанса из интернета / ограничение экспозиции — гигиена, не замена патча. Для своих (не GitLab) приложений на Ruby: не компилируйте regexp из недоверенного ввода; Regexp.timeout и лимит длины не защищают от этих багов (ruby-lang.org).
Признаки взлома и что делать
Имена шести detections — выше; тексты/правила — со страницы Critical Patch Release (ссылка в «Источниках»). Включите/сопоставьте их в SIEM. При срабатывании или подтверждённой компрометации: изоляция хоста, ротация секретов CI/CD и admin tokens, forensic triage, восстановление из чистой точки — одного патча после взлома мало.
Источники
- GitLab Critical Patch Release 19.4.2 / 19.3.5 / 19.2.8: https://docs.gitlab.com/releases/patches/patch-release-gitlab-19-4-2-released/
- CISA KEV: CVE-2026-97229 (added 2026-10-29, due 2026-11-01)
- Ruby regexp fixes (фон): https://www.ruby-lang.org/en/news/2026/10/23/regexp-fixes-for-gitlab-cves